Code
ImgCellSize = 20
Global Dim NeuronInput.f(200/ImgCellSize, 200/ImgCellSize);S-слой
Global NumOfNeurons = ArraySize(NeuronInput(),1)*ArraySize(NeuronInput(),2)
Global Dim NeuronALayer.f(NumOfNeurons)
Global Dim NeuronALayerK.f(NumOfNeurons, NumOfNeurons); Коэффиуенты A-слоя
Global NeuronR.f = 0.0
Procedure.f func(x.f)
ProcedureReturn 1.0/(1.0 + Pow(2.71, -x))
EndProcedure
Procedure InitPerceptron()
For C = 0 To NumOfNeurons
NeuronALayer(C) = 0.0
Next
For M = 0 To NumOfNeurons
For N = 0 To NumOfNeurons
NeuronALayerK(M,N) = 1.0 - Random(10000)/5000.0
Next
Next
EndProcedure
Procedure TrainPerceptron(CorrectValue.f, tempo.f)
Protected Error.f = CorrectValue - NeuronR
For M = 0 To NumOfNeurons
For N = 0 To NumOfNeurons
I = N % ArraySize(NeuronInput(),1)
J = N / ArraySize(NeuronInput(),1)
NeuronALayerK(M, N) + tempo*NeuronInput(I, J)*Error
Next
Next
EndProcedure
Procedure CalculatePerseptron()
NeuronR = 0.0
For M = 0 To NumOfNeurons
NeuronALayer(M) = 0.0
For N = 0 To NumOfNeurons
I = N % ArraySize(NeuronInput(),1)
J = N / ArraySize(NeuronInput(),1)
NeuronALayer(M) + NeuronALayerK(M, N)*NeuronInput(I, J)
Next
NeuronR + NeuronALayer(M)
Next
EndProcedure
If OpenWindow(0, 100, 100, 400, 280, "Neuron network")
Img = CreateImage(#PB_Any, 200, 200, 24)
Img2 = CreateImage(#PB_Any, ArraySize(NeuronInput(),1)+1, ArraySize(NeuronInput(),2)+1, 24)
TextGadget(#PB_Any, 0, 200, 200, 20, "Область рисования", #PB_Text_Center)
TextGadget(#PB_Any, 200, 200, 200, 20, "Входы нейросети", #PB_Text_Center)
TextGadget(#PB_Any, 10, 220, 150, 20, "Предполагаемое значение:")
TextGadget(#PB_Any, 10, 240, 150, 20, "Правильное значение:")
TextGadget(#PB_Any, 10, 260, 150, 20, "Темп обучения:")
StringGadget(1, 160,220,100,20,"", #PB_String_ReadOnly)
StringGadget(2, 160,240,100,20,"")
ButtonGadget(3, 270, 220, 100, 20, "Очистить рисунок")
ButtonGadget(4, 270, 240, 100, 40, "Тренировать")
StringGadget(5, 160, 260,100,20,"0.1")
AddWindowTimer(0, 1, 50)
StartDrawing(ImageOutput(Img))
Box(0, 0, 199, 199, RGBA(255,255,255,0))
StopDrawing()
InitPerceptron()
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #WM_LBUTTONDOWN
DrawingMode=1
LastX = WindowMouseX(0)
LastY = WindowMouseY(0)
Case #WM_LBUTTONUP
DrawingMode=0
Case #WM_MOUSEMOVE
If WindowMouseX(0) < 200 And WindowMouseY(0) < 200 And DrawingMode
StartDrawing(ImageOutput(Img))
LineXY(WindowMouseX(0), WindowMouseY(0), LastX, LastY, RGBA(255,0,0, 255))
StopDrawing()
LastX = WindowMouseX(0)
LastY = WindowMouseY(0)
EndIf
Case #PB_Event_Timer
If EventTimer() = 1
;Чистим содержимое входов нейросети
For I = 0 To ArraySize(NeuronInput(),1)
For J = 0 To ArraySize(NeuronInput(),2)
NeuronInput(I,J) = 0.0
Next
Next
;Заполняем входы нейросети значениями цвета из картинки для рисования
StartDrawing(ImageOutput(Img))
For I = 0 To 200-1
For J = 0 To 200-1
If Point(I, J) = RGB(255, 0, 0)
NeuronInput(I/ImgCellSize, J/ImgCellSize) + 1.0/(ImgCellSize*ImgCellSize)
EndIf
Next
Next
StopDrawing()
;Визуализируем содержимое входов нейросети
StartDrawing(ImageOutput(Img2))
For I = 0 To ArraySize(NeuronInput(),1)
For J = 0 To ArraySize(NeuronInput(),2)
a = NeuronInput(I,J)*(ImgCellSize*ImgCellSize)
Plot(I,J,RGB(a,a,a))
Next
Next
StopDrawing()
StartDrawing(WindowOutput(0))
DrawAlphaImage(ImageID(Img), 0, 0, 64)
DrawImage(ImageID(Img2), 200,0,200,200)
StopDrawing()
CalculatePerseptron()
SetGadgetText(1, StrF(NeuronR))
EndIf
Case #PB_Event_Gadget
Select EventGadget()
Case 3
DrawingMode = 0
StartDrawing(ImageOutput(Img))
Box(0, 0, 199, 199, RGBA(255,255,255,0))
StopDrawing()
Case 4
DrawingMode = 0
TrainPerceptron(ValF(GetGadgetText(2)), ValF(GetGadgetText(5)))
EndSelect
EndSelect
Until EventID = #PB_Event_CloseWindow
EndIf