PDA

View Full Version : حرفه ای: پیاده سازی شبکه ی عصبی در VB6



IamOverlord
یک شنبه 09 بهمن 1390, 19:46 عصر
سلام دوستان،
کسی برای شبکه ی عصبی سورس کدی، قطعه کدی، ... چیزی داره اگه بخوام تو VB6 پیاده سازی کنم. اگه راهنمایی کنید خیلی ممنون می شم...:قلب:

mahmood744
یک شنبه 09 بهمن 1390, 23:33 عصر
دوست عزیز منظورتان از شبکه عصبی چیست؟

IamOverlord
دوشنبه 10 بهمن 1390, 14:44 عصر
منظورم شبکه ی عصبی مصنوعی یا همان Artificial Neural Network هست که در هوش مصنوعی و یادگیری کاربرد داره.

jansina
دوشنبه 10 بهمن 1390, 18:56 عصر
سلام - دوست گرامی شما برای پیاده سازی یک شبکه عصبی باید سراغ نرم افزار متلب بری که که تولباکس های زیادی هم در این رابطه داره .برای پیاده سازیش هم توی متلب یه کتابی هست بنام شبکه های عصبی در متلب از مصطفی کیا کتاب خیلی خوبیه در ضمن پیاده سازی شبکه عصبی توی وی بی کار درستی نیست و کار مشکلی هم هست اگه می خوای زبانی رو برا پیاده سازی انتخاب کنی برو سرغ سی شارپ
موفق باشی

IamOverlord
سه شنبه 11 بهمن 1390, 16:07 عصر
چرا کار درستی نیست؟! من فعلا فقط می خوام یاد بگیرم خودم بنویسم، نه این که از نرم افزار های آماده استفاده کنم.

IamOverlord
سه شنبه 11 بهمن 1390, 16:08 عصر
این هم یه نمونه ی شبکه ی عصبی که XOR رو یاد می گیره : Planet Source Code (http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=36178&lngWId=1)

IamOverlord
شنبه 22 بهمن 1390, 15:40 عصر
بالاخره خودم درست کردم:
Public NN_IHWeights(1 To 100, 1 To 300)
Public NN_HOWeights(1 To 300)
Public NN_LearningSpeed

Public Sub NN_RandomizeWeights(IHWeights(), HOWeights())
Randomize Timer
For j = 1 To 300
For i = 1 To 100
IHWeights(i, j) = Rnd
Next i
Next j
For i = 1 To 100
HOWeights(i) = Rnd
Next i
End Sub

Public Sub NN_Train(InputLayer(), ByRef IHWeights(), ByRef HOWeights(), Output, LearningSpeed)
Dim HLY(1 To 300)
Dim Y
Dim HLErrors(1 To 300)
Dim OError
Dim NewIHWeights(1 To 100, 1 To 300)
Dim NewHOWeights(1 To 300)
For j = 1 To 300
For i = 1 To 100
HLY(j) = HLY(j) + IHWeights(i, j) * InputLayer(i)
Next i
HLY(j) = Activation(HLY(j))
Next j
For i = 1 To 300
Y = Y + HOWeights(i) * HLY(i)
Next i
OError = Output - Y
For i = 1 To 300
HLErrors(i) = HOWeights(i) * OError
Next i
For j = 1 To 300
For i = 1 To 100
NewIHWeights(i, j) = IHWeights(i, j) + LearningSpeed * HLErrors(j) * ActivationDerivative(InputLayer(i))
Next i
Next j
For i = 1 To 100
NewHOWeights(i) = HOWeights(i) + LearningSpeed * OError * ActivationDerivative(HLY(i))
Next i
For j = 1 To 300
For i = 1 To 100
'If IHWeights(i, j) <> NewIHWeights(i, j) Then Beep
IHWeights(i, j) = NewIHWeights(i, j)
Next i
Next j
For i = 1 To 300
HOWeights(i) = NewHOWeights(i)
Next i
End Sub

Public Sub NN_Run(InputLayer(), IHWeights(), HOWeights, Output)
Dim HLY(1 To 300)
For j = 1 To 300
For i = 1 To 100
HLY(j) = HLY(j) + IHWeights(i, j) * InputLayer(i)
Next i
HLY(j) = Activation(HLY(j))
Next j
For i = 1 To 300
Y = Y + HOWeights(i) * HLY(i)
Next i
Output = Y
End Sub

Public Function Activation(Value)
Activation = (1 / (1 + Exp(Value * -1)))
End Function

Public Function ActivationDerivative(Value)
DeltaX = 0.01
ActivationDerivative = (Activation(Value + DeltaX) - Activation(Value - DeltaX)) / DeltaX
End Function
فقط یه مشکلی: چی کار کنیم که تابع Activation خطای Overflow نده؟ :متفکر:

سید حمید حق پرست
شنبه 22 بهمن 1390, 17:05 عصر
سلام
اگه میشه این کدهارو یه کم توضیح بدید .
چه کاری میتونیم با این کدها انجام بدیم و چه جوری تو پروؤه استفاده بشه

یا علی (ع)

IamOverlord
شنبه 22 بهمن 1390, 17:43 عصر
سلام.
این کد یه شبکه ی عصبی طراحی می کنه که 100 تا ورودی می گیره و یه خروجی می ده، اما اون وسط یه لایه ی پنهان هم هست که 3 برابر تعداد ورودی هاست یعنی 300 تا.

حالا شبکه یه روال NN_Train داره که یاد می گیره به ازای چه ورودی هایی، چه خروجی ای بده. به این زیربرنامه باید 100 ورودی شبکه رو از طریق InputLayer بدید، بعد وزن های هر کدام از نورون های بین لایه ی ورودی (I) و پنهان (H)، بعد وزن های هر کدام از نورون های بین لایه ی پنهان (H) و خروجی (O)، بعد بگید قراره خروجی شبکه چی باشه از طریق Ouput، بعد بگید سرعت یادگیری شبکه چه قدره از طریق LearningSpeed، که یه عددی بین 0 تا 1 هست که فعلا من 0.05 تنظیم می کنم. در یادگیری شبکه از روش Error Back Propagation (http://home.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html) استفاده کردم.

ضمنا قبل از این که شبکه شروع به یادگیری اطلاعاتش کنه یه بار باید وزن نورون ها به طور Random تنظیم شده باشه که این کارو از طریق روال NN_RandomizeWeights باید انجام داد.

بعد از این که به شبکه یاد دادیم که چه خروجی ای به ازای چه ورودی هایی داشته باشه، حالا می تونیم ازش استفاده کنیم و بهش ورودی های جدید بدیم و خروجی بخوایم. این کارو از طریق روال NN_Run باید انجام داد، که بهش اول ورودی مورد نظرتون رو می دید، بعد مشخصات شبکه ی عصبی تعلیم دیده رو (که همان وزن نورون های بین لایه های I و H، و لایه های H و O هست.)، بعد متغیری که می خواید پاسخ رو در اون قرار بده رو بهش می دید.

خوب این وسط در طی مراحل یادگیری از یه تابع معروف استفاده شده که بهش تابع Activation هم می گن، مشکل این جاست که گاهی این تابع Overflow می ده، مثلا اگه ورودی اش 500 باشه، اگه بشه این مشکل رو حل کرد خیلی خوب می شه.

یه نمونه برنامه هم نوشتم با این Module که قراره یه دنباله ی عددی رو با استفاده از شبکه ی عصبی پیش بینی کنه. اول باید روی دکمه ی Randomize Weights کلیک کنید، بعد روی Import From Function کلیک کنید و بنویسید :
((-1)^x+)/2,1,120
بعد روی کلیک کنید چند بار تا شبکه دنباله ی داده شده رو یاد بگیره. بعد در TextBox پایین-سمت چپ ورودی های جدیدتون مثلا 121 و 122 رو به ترتیب بدید و روی دکمه ی پایینی کلیک کنید تا نتیجه ی پیش بینی رو بهتون نمایش بده. نتیجه باید پس از هر دفعه یادگیری به همان دنباله ی 0 و 1 که تولید کردیم نزدیک بشه.

خواهشا همه کمک کنید این پروژه درست بشه چیز توپی در میاد...:چشمک:

Mr'Jamshidy
یک شنبه 23 بهمن 1390, 00:05 صبح
میدونی دوست من،

تلاش خوبیه
منم خیلی دوست دارم کمکت کنم
در واقع به این مبحث علاقه خاصی دارم

اما هیچ اطلاعاتی در موردش ندارم
تنها کاری که از دستم بر میاد اینه که دورادور این تاپیک رو زیر نظر بگیرم و هر موقع واقعا از دستم کاری بر میومد یک کمکی بکنم

امیدوارم که این تاپیک رو ادامه بدید و دلسرد نشید، و همینطور موفق باشید

مصطفی ساتکی
یک شنبه 23 بهمن 1390, 00:09 صبح
اول اینکه شما بر اساس رفرنسی که mlp رو پیدا کردید bias رو در نظر نگرفته که یعنی اینکه در مینیم محلی گیر کنیم احتمالش زیاده دوم اینکه temperature parameter رو در نظر نگرفته این پارامتر باعث میشه که نمونه های ورودی تمایز بهتری پیدا کنند سوم اینکه آموزش در این مورد بسیار کندی و برای موارد کاربردی عملی نیست که بایستی momentom رو به آن اضافه کنید.
در این رفرنس activation function رو sigmoid در نظر گرفته و مشتق آن برابر است با a* (a-1( می باشد
البته اگر دقت داشته باشید تکنیکی که در اینجا برای اصلاح وزن استفاده شده از طریق dynamic programming که روش های سریع تری هم وجود داره

IamOverlord
یک شنبه 23 بهمن 1390, 15:46 عصر
سلام دوست عزیز.
من تازه کارم تو این زمینه :لبخندساده:
اگه می شه یه توضیح مختصر در مورد Bias بدید. چی کار باید می کردم که گیر نکنه؟!
برای Momentum، می شه رو همین کدی که نوشتم پیاده کرد؟ اصلا ایده اش چیه؟!
دلیل استفاده ام از اون مقاله هم این بود که نسبتا بهتر فهمیدمش.
اگه مقاله ی خوبی پیدا کردید لطفا معرفی کنید. :قلب:

مصطفی ساتکی
دوشنبه 24 بهمن 1390, 00:08 صبح
به نظرم اگر میخاید شبکه عصبی رو خوب متوجه بشید کتاب hagan رو بخونید انواع شبکه ها و انواع optimization رو توضیح داده فقط RBF رو نداره به نظر من و چندتا از دوستان یکی از بهترین هاست
کتاب haykin هم خوبه

IamOverlord
دوشنبه 24 بهمن 1390, 02:29 صبح
چرا وقتی LearningSpeed رو می برم بالا شبکه ام به هم می ریزه؟! و گاهی وقتا خروجی شبکه رو 0.5 ثابت می مونه؟!

Public NN_IHWeights(1 To 100, 1 To 300)
Public NN_HOWeights(1 To 300)
Public NN_LearningSpeed

Public Sub NN_RandomizeWeights(IHWeights(), HOWeights())
Randomize Timer
For j = 1 To 300
For i = 1 To 100
IHWeights(i, j) = Rnd
Next i
Next j
For i = 1 To 100
HOWeights(i) = Rnd
Next i
End Sub

Public Sub NN_Train(InputLayer(), ByRef IHWeights(), ByRef HOWeights(), Output, LearningSpeed)
Dim HLY(1 To 300)
Dim Y
Dim HLErrors(1 To 300)
Dim OError
Dim NewIHWeights(1 To 100, 1 To 300)
Dim NewHOWeights(1 To 300)
For j = 1 To 300
For i = 1 To 100
HLY(j) = HLY(j) + IHWeights(i, j) * InputLayer(i)
Next i
HLY(j) = Activation(HLY(j))
Next j
For i = 1 To 300
Y = Y + HOWeights(i) * HLY(i)
Next i
OError = Output - Y
For i = 1 To 300
HLErrors(i) = HOWeights(i) * OError
Next i
For j = 1 To 300
For i = 1 To 100
NewIHWeights(i, j) = IHWeights(i, j) + LearningSpeed * HLErrors(j) * ActivationDerivative(InputLayer(i))
Next i
Next j
For i = 1 To 100
NewHOWeights(i) = HOWeights(i) + LearningSpeed * OError * ActivationDerivative(HLY(i))
Next i
For j = 1 To 300
For i = 1 To 100
IHWeights(i, j) = NewIHWeights(i, j)
Next i
Next j
For i = 1 To 300
HOWeights(i) = NewHOWeights(i)
Next i
End Sub

Public Sub NN_Run(InputLayer(), IHWeights(), HOWeights, Output)
Dim HLY(1 To 300)
For j = 1 To 300
For i = 1 To 100
HLY(j) = HLY(j) + IHWeights(i, j) * InputLayer(i)
Next i
HLY(j) = Activation(HLY(j))
Next j
For i = 1 To 300
Y = Y + HOWeights(i) * HLY(i)
Next i
Output = Y
End Sub

Public Function Activation(Value)
If Value > 100 Then
Activation = 0.99
'MsgBox "Overflow!+"
ElseIf Value < -100 Then
Activation = 0.01
'MsgBox "Overflow!-"
Else
Activation = CDec((1 / (1 + Exp(Value * -1))))
End If
End Function

Public Function ActivationDerivative(Value)
DeltaX = 0.001
ActivationDerivative = (Activation(Value + DeltaX) - Activation(Value - DeltaX)) / DeltaX
End Function

مصطفی ساتکی
دوشنبه 24 بهمن 1390, 23:57 عصر
گام حرکت تو فضایی هستش که دارید توش حرکت می کنید گاهی اوقات گام حرکت تون بزرگه که شما از global minimum که با روش gradient descent به دنبال اون هستید از روش رد می شید و می گذرید برای همین گفته میشه که انتخاب گام حرکت بایستی به صورت داینامیک باشه تو استراتژی آموزش گام حرکت متغیر رو هم بایستی اعمال کنید روش هایی هم برای اینکار موجوده.

در حالتی مه رو 0.5 ثابت می مونه علتش این هستش شبکه تو یک minimum محلی گیر می کنه و همون به انواع جواب فرض می کنه سعی کنید اعداد تصادفی تونو خیلی کوچک انتخاب کنید

IamOverlord
سه شنبه 25 بهمن 1390, 16:02 عصر
گام حرکت تو فضایی هستش که دارید توش حرکت می کنید گاهی اوقات گام حرکت تون بزرگه که شما از global minimum که با روش gradient descent به دنبال اون هستید از روش رد می شید و می گذرید برای همین گفته میشه که انتخاب گام حرکت بایستی به صورت داینامیک باشه تو استراتژی آموزش گام حرکت متغیر رو هم بایستی اعمال کنید روش هایی هم برای اینکار موجوده.

منظورتون اینه که طی یادگیری مرتب گام حرکت رو تغییر بدم و ثابت نباشه؟


در حالتی مه رو 0.5 ثابت می مونه علتش این هستش شبکه تو یک minimum محلی گیر می کنه و همون به انواع جواب فرض می کنه سعی کنید اعداد تصادفی تونو خیلی کوچک انتخاب کنید

یعنی در روال Randomize به جای تولید اعداد بین 0 تا 1، مثلا بین 0 تا 0.1 تولید کنم؟

IamOverlord
سه شنبه 25 بهمن 1390, 17:40 عصر
یه باگی داشت کدم، فقط 100 تا از 300 تا نورون Hidden-Output برای استفاده در نظر گرفته می شد. کد اصلاح شد:


Public NN_IHWeights(1 To 100, 1 To 300)
Public NN_HOWeights(1 To 300)
Public NN_LearningSpeed

Public Sub NN_RandomizeWeights(IHWeights(), HOWeights())
Randomize Timer
For j = 1 To 300
For i = 1 To 100
IHWeights(i, j) = Rnd * 0.01
Next i
Next j
For i = 1 To 100
HOWeights(i) = Rnd
Next i
End Sub

Public Sub NN_Train(InputLayer(), ByRef IHWeights(), ByRef HOWeights(), Output, LearningSpeed)
Dim HLY(1 To 300)
Dim Y
Dim HLErrors(1 To 300)
Dim OError
Dim NewIHWeights(1 To 100, 1 To 300)
Dim NewHOWeights(1 To 300)
For j = 1 To 300
For i = 1 To 100
HLY(j) = HLY(j) + IHWeights(i, j) * InputLayer(i)
Next i
HLY(j) = Activation(HLY(j))
Next j
For i = 1 To 300
Y = Y + HOWeights(i) * HLY(i)
Next i
OError = Output - Y
For i = 1 To 300
HLErrors(i) = HOWeights(i) * OError
Next i
For j = 1 To 300
For i = 1 To 100
NewIHWeights(i, j) = IHWeights(i, j) + LearningSpeed * HLErrors(j) * ActivationDerivative(InputLayer(i))
Next i
Next j
For i = 1 To 300
NewHOWeights(i) = HOWeights(i) + LearningSpeed * OError * ActivationDerivative(HLY(i))
Next i
For j = 1 To 300
For i = 1 To 100
IHWeights(i, j) = NewIHWeights(i, j)
Next i
Next j
For i = 1 To 300
HOWeights(i) = NewHOWeights(i)
Next i
End Sub

Public Sub NN_Run(InputLayer(), IHWeights(), HOWeights, Output)
Dim HLY(1 To 300)
For j = 1 To 300
For i = 1 To 100
HLY(j) = HLY(j) + IHWeights(i, j) * InputLayer(i)
Next i
HLY(j) = Activation(HLY(j))
Next j
For i = 1 To 300
Y = Y + HOWeights(i) * HLY(i)
Next i
Output = Y
End Sub

Public Function Activation(Value)
If Value > 100 Then
Activation = 0.999999999999
'MsgBox "Overflow!+"
ElseIf Value < -100 Then
Activation = 0.000000000001
'MsgBox "Overflow!-"
Else
Activation = CDec((1 / (1 + Exp(Value * -1))))
End If
End Function

Public Function ActivationDerivative(Value)
ActivationDerivative = Activation(Value) * (1 - (Activation(Value)))
End Function

IamOverlord
سه شنبه 25 بهمن 1390, 18:24 عصر
سلام دوستان.
خیلی ممنونم Delphi_CAT (http://barnamenevis.org/member.php?37538-Delphi_CAT) عزیز.
در کل مشکلاتی که فعلا به ذهنم رسیده بود حل شد و کد ویرایش شد.
یه ListBox هم اضافه شده که مقدار وزن های نورون های بین لایه ی پنهان و خروجی که 300 تا هستند رو نشون می ده.

مصطفی ساتکی
سه شنبه 25 بهمن 1390, 20:11 عصر
یکی از راههای ابتدایی به این صورت است .گام حرکت رو در ابتدا بزرگ انتخاب کرده و با یک ضریب خطی نسبت به خطا آنرا کاهش بدید .
اعداد تصادفی رو کوچکتر از 0.01 در نظر بگیرید

IamOverlord
پنج شنبه 27 بهمن 1390, 09:08 صبح
من می خوام از این شبکه برای پیش بینی دنباله های عددی استفاده کنم. می خواستم ببینم باید چه تغییراتی توش بدم و چی کار کنم؟

IamOverlord
چهارشنبه 17 اسفند 1390, 20:38 عصر
من می خوام از این شبکه برای پیش بینی دنباله های عددی استفاده کنم. می خواستم ببینم باید چه تغییراتی توش بدم و چی کار کنم؟

Public Input2Hidden(1 To 10, 1 To 30)
Public Hidden2Output(1 To 30)
Public LearningSpeed
Public InputLayer(1 To 10)
Public HiddenLayerE(1 To 30)
Public HiddenLayerY(1 To 30)
Public OutputE
Public OutputY
Public DesiredOutputY
Public HiddenLayerYError(1 To 30)
Public OutputYError

Private Function Activation(x)
Activation = Sigmoid(x)
End Function

Private Function ActivationDerivative(x)
ActivationDerivative = SigmoidDerivative(x)
End Function

Private Function Sigmoid(x)
Sigmoid = 1 / (1 + Exp(-x))
End Function

Private Function SigmoidDerivative(x)
SigmoidDerivative = (Sigmoid(x + 10 ^ (-5)) - Sigmoid(x - 10 ^ (-5))) / 2
End Function

Public Sub NN_Run()
'set Hidden Layer E & Y
For j = 1 To 30
HiddenLayerE(j) = 0
For i = 1 To 10
HiddenLayerE(j) = HiddenLayerE(j) + Input2Hidden(i, j) * InputLayer(i)
Next i
HiddenLayerY(j) = Activation(HiddenLayerE(j))
Next j
' set OutputLayer E & Y
OutputE = 0
For i = 1 To 30
OutputE = OutputE + Hidden2Output(i) * HiddenLayerY(i)
Next i
OutputY = Activation(OutputE)
End Sub

Public Sub NN_Train()
NN_Run
OutputYError = DesiredOutputY - OutputY
' calculate hidden layer error
For i = 1 To 30
HiddenLayerYError(i) = Hidden2Output(i) * OutputYError
Next i
For j = 1 To 30
For i = 1 To 10
Input2Hidden(i, j) = Input2Hidden(i, j) + LearningSpeed * HiddenLayerYError(j) * (ActivationDerivative(HiddenLayerE(j)) * InputLayer(i))
Next i
Next j
For i = 1 To 30
Hidden2Output(i) = Hidden2Output(i) + LearningSpeed * OutputYError * (ActivationDerivative(OutputE) * HiddenLayerY(i))
Next i
End Sub

Public Sub NN_RandomizeWeights()
Randomize Timer
For i = 1 To 10
For j = 1 To 30
Input2Hidden(i, j) = Rnd * 0.5 - 0.25
Hidden2Output(j) = Rnd * 0.5 - 0.25
Next j
Next i
End Sub

joker_pok
چهارشنبه 17 اسفند 1390, 23:14 عصر
منم علاقه خاصی به این برنامه های هوشمند دارم اما هیچ اطلاعاتی ندارم کاش میشد کمک کنم و باهمکاری تیم برنامه نویس یه کاریش می کردیم

IamOverlord
چهارشنبه 17 اسفند 1390, 23:41 عصر
از این برنامه ها برای پیش بینی استفاده می کنم، مثلا با همین ماژولی که گذاشتم می شه یه سری ساده ی سینوسی رو پیش بینی کرد: