PDA

View Full Version : حرفه ای: پیش بینی با استفاده از شبکه ی عصبی مصنوعی



IamOverlord
پنج شنبه 27 بهمن 1390, 08:58 صبح
سلام دوستان.
یه چند تا برنامه نوشتم که با روش های مختلفی پیش بینی می کنه تا این که رسیدم به بحث یادگیری و شبکه ی عصبی و . . . .
باید دقیقا چی کار کنم که یه دنباله بر حسب زمان رو پیش بینی کنه؟! فعلا یه شبکه ی MLP طراحی کردم. اگه می شه راهنمایی کنید. مثلا خروجی شبکه ی من یکیه که مقدار خروجیش از 0 تا 1 هست. برای خروجی باید چی کار کنم که هر عددی بده؟ روش استانداردش چیه؟ ورودی ها چی؟ ساختار شبکه چه جوری باشه دقیقا؟ ...

IamOverlord
پنج شنبه 11 اسفند 1390, 18:36 عصر
سلام دوستان.
یه مشکلی با این شبکه ی عصبی ای که درست کردم دارم.
مثلا وقتی سرعت یادگیری روی 0.1 تنظیم شده، بعد یه مدتی وزن های منفی، منفی تر و وزن های مثبت، مثبت تر می شن. می خواستم ببینم مشکل کدم چیه احتمالا؟

Public NN_IHWeights(1 To 10, 1 To 30)
Public NN_HOWeights(1 To 30)
Public NN_LearningSpeed
Public NN_InputsCount
Public NN_Hiddens

Public Sub NN_RandomizeWeights(IHWeights(), HOWeights())
Randomize Timer
For j = 1 To 30
For i = 1 To 10
IHWeights(i, j) = Rnd * 0.4 + 0.2
Next i
Next j
For i = 1 To 30
HOWeights(i) = Rnd * 0.4 + 0.2
Next i
End Sub

Public Sub NN_Train(InputLayer(), ByRef IHWeights(), ByRef HOWeights(), Output, LearningSpeed)
' output between 0 and 1
Dim HLY(1 To 30)
Dim Y
Dim HLErrors(1 To 30)
Dim OError
Dim NewIHWeights(1 To 10, 1 To 30)
Dim NewHOWeights(1 To 30)
For j = 1 To 30
For i = 1 To 10
HLY(j) = HLY(j) + IHWeights(i, j) * InputLayer(i)
Next i
HLY(j) = Activation(HLY(j))
Next j
For i = 1 To 30
Y = Y + HOWeights(i) * HLY(i)
Next i
Y = Activation(Y)
OError = Output - Y
'MsgBox OError
For i = 1 To 30
HLErrors(i) = HOWeights(i) * OError
Next i
For j = 1 To 30
For i = 1 To 10
NewIHWeights(i, j) = IHWeights(i, j) + LearningSpeed * HLErrors(j) * ActivationDerivative(InputLayer(i))
Next i
Next j
For i = 1 To 30
NewHOWeights(i) = HOWeights(i) + LearningSpeed * OError * ActivationDerivative(HLY(i))
Next i
For j = 1 To 30
For i = 1 To 10
IHWeights(i, j) = NewIHWeights(i, j)
Next i
Next j
For i = 1 To 30
HOWeights(i) = NewHOWeights(i)
Next i
End Sub

Public Sub NN_Run(InputLayer(), IHWeights(), HOWeights, Output)
' output between 0 and 1
Dim HLY(1 To 30)
For j = 1 To 30
For i = 1 To 10
HLY(j) = HLY(j) + IHWeights(i, j) * InputLayer(i)
Next i
HLY(j) = Activation(HLY(j))
Next j
For i = 1 To 30
Y = Y + HOWeights(i) * HLY(i)
Next i
Y = Activation(Y)
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)))
ActivationDerivative = (Activation(Value + 0.001) - Activation(Value - 0.001)) / 0.002
End Function

IamOverlord
پنج شنبه 11 اسفند 1390, 19:28 عصر
آقا سوالم رو دقیق تر می پرسم : چرا خروجی شبکه ی من میانگین اون چیزاییه که می خوام، مثلا : به جای 0.34 و 0.16 ، 0.25 و 0.25 می ده حدودا.

dousti_design
جمعه 12 اسفند 1390, 00:14 صبح
برای خروجی باید چی کار کنم که هر عددی بده؟روش استانداردش چیه؟ ورودی ها چی؟ ساختار شبکه چه جوری باشه دقیقا؟ ...
باید از چندین شبکه استفاده کنید. مثلا میتونید خروجی کلی رو یه عدد باینری در نظر بگیرید اونوقت میتونید هر عددی خواستید بگیرید.

مثلا وقتی سرعت یادگیری روی 0.1 تنظیم شده، بعد یه مدتی وزن های منفی، منفی تر و وزن های مثبت، مثبت تر می شن. می خواستم ببینم مشکل کدم چیه احتمالا؟
باید الگوریتمتون رو توضیح بدید تا بشه کاری کرد. از این کد ها که کسی نمیشینه سر در بیاره!

آقا سوالم رو دقیق تر می پرسم : چرا خروجی شبکه ی من میانگین اون چیزاییه که می خوام، مثلا : به جای 0.34 و 0.16 ، 0.25 و 0.25 می ده حدودا.
اینم بستگی به الگوریتمتون داره!!! که اگه توضیح بدید چیکار کردید میشه کاری کرد

IamOverlord
جمعه 12 اسفند 1390, 08:05 صبح
سلام.
من سعی کردم دقیقا این روشی که این توضیح داده رو پیاده کنم (در NN_Train) :
Principles of training multi-layer neural network using backpropagation (http://home.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html)
(اگر خواستید توضیح مختصر بدم...)
ضمنا شبکه 10 تا ورودی داره، 30 تا لایه ی پنهان، 1 خروجی که ورودی ها و خروجی ها بین 0 و 1 داده می شوند.

IamOverlord
سه شنبه 16 اسفند 1390, 07:51 صبح
اصلا شبکه ی عصبی ای که یک لایه ی ورودی داره، به درد پیش بینی سری زمانی می خوره؟!

dousti_design
چهارشنبه 17 اسفند 1390, 11:11 صبح
مشکل شما دقیقا کجاست؟ تعداد ورودیتون بالاست؟ با یک لایه ورودی میشه n ورودی داد به شبکه. یک لایه ورودی میگید دیگه یک ورودی نمیگید که!

IamOverlord
چهارشنبه 17 اسفند 1390, 15:41 عصر
سلام دوست عزیز.
مشکل من [در تصویر] هست.
وقتی شبکه رو برای دنباله ی Sin (که با یه تغییراتی بین 0 و 1 می بریمش ...)، Train می کنیم، به جای خروجی های خواسته شده، میانگین اون ها رو می ده.

ورودی شبکه، 10 جمله ی دنباله پشت سر هم هست.
پس در نتیجه برای دنباله ی 1 تا 13 که می بینید در تصویر، 11 و 12 و 13 امی رو به عنوان خروجی براش Train می کنیم. اما همون طور که می بینید خروجی خواسته شده برای 13 امی میانگین 11 امی و 12 امی و 13 امی هست.
مشکل این جاست./
ضمنا روش یادگیریش رو گذاشتم (Error Back Propagation).

همچنین شبکه 3 لایه داره:
ورودی : 10 تا
پنهان : 30 تا
خروجی : یکی

IamOverlord
چهارشنبه 17 اسفند 1390, 20:35 عصر
آقا حله، درست شد، یه سوتی داده بودم؛

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