![](images/chestnut/misc/left.gif) |
PureBasic Мощный кросс-платформенный язык среднего уровня на основе BASIC. Подходит для решения широкого круга задач. |
20.06.2018, 15:33
|
#1
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Пример нейронной сетки на PureBasic
EXE файл
![](images/chestnut/misc/code_html.gif)
Declare Visual()
Declare Summ()
Declare.f Activation(x.f)
Declare Weight()
Declare ReSumm(Boolean)
Declare Obychalka()
Structure result
result.f
error.f
weight_delta.f
EndStructure
Global Dim Layer_0.result(3)
Global Dim Layer_1.result(4)
Global Dim Layer_2.result(2)
Global Dim Layer_3.result(1)
Global Dim LayerW_1.f(3,4)
Global Dim LayerW_2.f(4,2)
Global Dim LayerW_3.f(2,1)
Global fix_min.f = 1
Global fix_max.f = 0
If OpenWindow(0, 0, 0, 700, 400, "NS", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CheckBoxGadget(0,5,90, 170,20,"пешеход намерен переходить",#PB_CheckBox_ThreeState)
CheckBoxGadget(1,5,190,170,20,"ПОЛИЦИЯ",#PB_CheckBox_ThreeState)
CheckBoxGadget(2,5,290,170,20,"зеленый светофор",#PB_CheckBox_ThreeState)
ButtonGadget(3,540,175,100,20,"УСТУПИТЬ")
ButtonGadget(4,540,205,100,20,"НЕ УСТУПАТЬ")
ButtonGadget(5,540,300,100,20,"ОБУЧЕНИЕ")
TextGadget(6,340,330,300,20,"Задача: уступить пешеходу только при полиции", #PB_Text_Center)
Weight()
Summ()
Visual()
Repeat
Select WaitWindowEvent(#True)
Case #PB_Event_Gadget
Select EventGadget()
Case 0
Summ():Visual()
Case 1
Summ():Visual()
Case 2
Summ():Visual()
Case 3
ReSumm(1):Summ():Visual()
Case 4
ReSumm(0):Summ():Visual()
Case 5
Obychalka():Visual()
EndSelect
Case #PB_Event_CloseWindow
Exit = #True
EndSelect
Until Exit
EndIf
Procedure.f Activation(result.f)
result = 1/(1+Pow(3,-result))
ProcedureReturn result
EndProcedure
Procedure Weight()
For i = 0 To 3
For index = 0 To 2
LayerW_1(index,i) = i-1.5
Next
Next
For i = 0 To 1
For index = 0 To 3
LayerW_2(index,i) = i-0.5
Next
Next
For i = 0 To 0
For index = 0 To 1
LayerW_3(index,i) = 1
Next
Next
EndProcedure
Procedure Visual()
If StartDrawing(WindowOutput(0))
For X = 0 To 2
For Y = 0 To 3
If LayerW_1(X,Y)>0
For i=0 To 20
Line(200,100+X*100,100,Y*100-50-X*100+i,RGB(0,0,LayerW_1(X,Y)*255))
Next
Else
For i=0 To 20
Line(200,100+X*100,100,Y*100-50-X*100+i,-RGB(LayerW_1(X,Y)*255,0,0))
Next
EndIf
Next
Circle(200,100+X*100,25,RGB(0,0,0))
Circle(200,100+X*100,20,RGB(Layer_0(X)\result*255,Layer_0(X)\result*255,Layer_0(X)\result*255))
Next
For X = 0 To 3
For Y = 0 To 1
If LayerW_2(X,Y)>0
For i=0 To 20
Line(300,50+X*100,100,Y*100+99-X*100+i,RGB(0,0,LayerW_2(X,Y)*255))
Next
Else
For i=0 To 20
Line(300,50+X*100,100,Y*100+99-X*100+i,-RGB(LayerW_2(X,Y)*255,0,0))
Next
EndIf
Next
Circle(300,50+X*100,25,RGB(0,0,0))
Circle(300,50+X*100,20,RGB(Layer_1(X)\result*255,Layer_1(X)\result*255,Layer_1(X)\result*255))
Next
For X = 0 To 1
For Y = 0 To 0
If LayerW_3(X,Y)>0
For i=0 To 20
Line(400,150+X*100,100,Y*100+50-X*100+i,RGB(0,0,LayerW_3(X,Y)*255))
Next
Else
For i=0 To 20
Line(400,150+X*100,100,Y*100+50-X*100+i,-RGB(LayerW_3(X,Y)*255,0,0))
Next
EndIf
Next
Circle(400,150+X*100,25,RGB(0,0,0))
Circle(400,150+X*100,20,RGB(Layer_2(X)\result*255,Layer_2(X)\result*255,Layer_2(X)\result*255))
Next
Circle(500,200,25,RGB(0,0,0))
Circle(500,200,20,RGB(Layer_3(0)\result*255,Layer_3(0)\result*255,Layer_3(0)\result*255))
StopDrawing()
EndIf
EndProcedure
Procedure Obychalka()
For i = 0 To 100000
Fix = Random(7)
Select Fix
Case 0
SetGadgetState(0,0)
SetGadgetState(1,0)
SetGadgetState(2,0)
Summ():ReSumm(0)
Case 1
SetGadgetState(0,1)
SetGadgetState(1,0)
SetGadgetState(2,0)
Summ():ReSumm(0)
Case 2
SetGadgetState(0,1)
SetGadgetState(1,1)
SetGadgetState(2,0)
Summ():ReSumm(1)
Case 3
SetGadgetState(0,1)
SetGadgetState(1,1)
SetGadgetState(2,1)
Summ():ReSumm(0)
Case 4
SetGadgetState(0,0)
SetGadgetState(1,1)
SetGadgetState(2,1)
Summ():ReSumm(0)
Case 5
SetGadgetState(0,0)
SetGadgetState(1,0)
SetGadgetState(2,1)
Summ():ReSumm(0)
Case 6
SetGadgetState(0,1)
SetGadgetState(1,0)
SetGadgetState(2,1)
Summ():ReSumm(0)
Case 7
SetGadgetState(0,0)
SetGadgetState(1,1)
SetGadgetState(2,0)
Summ():ReSumm(0)
EndSelect
Next
SetGadgetState(0,0)
SetGadgetState(1,0)
SetGadgetState(2,0)
Summ()
EndProcedure
Procedure Summ()
For i = 0 To 2
Layer_0(i)\result = GetGadgetState(i)
Next
For i = 0 To 3
Layer_1(i)\result = 0
For index = 0 To 2
Layer_1(i)\result = Layer_1(i)\result + (LayerW_1(index,i)*Layer_0(index)\result)
Next
Layer_1(i)\result = Activation(Layer_1(i)\result)
Next
For i = 0 To 1
Layer_2(i)\result = 0
For index = 0 To 3
Layer_2(i)\result = Layer_2(i)\result + (LayerW_2(index,i)*Layer_1(index)\result)
Next
Layer_2(i)\result = Activation(Layer_2(i)\result)
Next
For i = 0 To 0
Layer_3(i)\result = 0
For index = 0 To 1
Layer_3(i)\result = Layer_3(i)\result + (LayerW_3(index,i)*Layer_2(index)\result)
Next
Layer_3(i)\result = Activation(Layer_3(i)\result)
Next
EndProcedure
Procedure ReSumm(Boolean)
Accuracy.f = 0.1
For i = 0 To 0
Layer_3(i)\error = Boolean - Layer_3(i)\result
Layer_3(i)\weight_delta = Layer_3(i)\error * (Layer_3(i)\result * (1 - Layer_3(i)\result))
For index = 0 To 1
LayerW_3(index,i) = LayerW_3(index,i) + Layer_3(i)\weight_delta * Layer_2(index)\result*Accuracy
Layer_2(index)\error = LayerW_3(index,i) * Layer_3(i)\weight_delta
Next
Next
For i = 0 To 1
Layer_2(i)\weight_delta = Layer_2(i)\error * (Layer_2(i)\result * (1 - Layer_2(i)\result))
For index = 0 To 3
LayerW_2(index,i) = LayerW_2(index,i) + Layer_2(i)\weight_delta * Layer_1(index)\result*Accuracy
Layer_1(index)\error = LayerW_2(index,i) * Layer_2(i)\weight_delta
Next
Next
For i = 0 To 3
Layer_1(i)\weight_delta = Layer_1(i)\error * (Layer_1(i)\result * (1 - Layer_1(i)\result))
For index = 0 To 2
LayerW_1(index,i) = LayerW_1(index,i) + Layer_1(i)\weight_delta * Layer_0(index)\result*Accuracy
Next
Next
EndProcedure
__________________
Хочешь изменить мир-начни с шейдера.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Izunad за это полезное сообщение:
|
|
20.07.2018, 23:06
|
#2
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Пример нейронной сетки на PureBasic
Нейронные сети интересная тема.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.03.2019, 18:46
|
#3
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Ответ: Пример нейронной сетки на PureBasic
Для тех кто изучает нейросеть возможно будет полезно.
Это более менее универсальная библиотека.
Есть возможность указать количество слоев, количество нейронов в каждом слое
Вводим данные в первый слой >>> получаем данные с последнего слоя
При обучении сети не указывается правильный ответ, то есть мы указываем только то устраивает нас результат или нет (данный момент можно переписать)
Это песочница, но буду развивать дальше.
![](images/chestnut/misc/code_html.gif)
Declare.f Activation(res.f)
Structure connection
weight_delta.f
weight.f
result.f
EndStructure
Structure neuron
error.f
result.f
List connection.connection()
EndStructure
Structure layer
List neuron.neuron()
EndStructure
Global NewList layer.layer()
Procedure.f Activation(res.f)
res = 1/(1+Pow(3,-res))
ProcedureReturn res
EndProcedure
Procedure CreateLayer(count)
If ListSize(layer()) > #False
SelectElement(layer(),ListSize(layer())-#True)
ForEach(layer()\neuron())
For i = #True To count
AddElement(layer()\neuron()\connection())
Next
Next
EndIf
AddElement(layer())
For i = #True To count
AddElement(layer()\neuron())
Next
EndProcedure
Procedure Save(file$)
WriteInteger(0,ListSize(layer()))
ForEach layer()
WriteInteger(0,ListSize(layer()\neuron()))
ForEach layer()\neuron()
WriteInteger(0,ListSize(layer()\neuron()\connection()))
ForEach layer()\neuron()\connection()
WriteFloat(0,layer()\neuron()\connection()\weight)
Next
Next
Next
EndProcedure
Procedure Open(file$)
If OpenFile(0,file$)
layer_count = ReadInteger(0)
For i = #True To layer_count
AddElement(layer())
neuron_count = ReadInteger(0)
For in = #True To neuron_count
AddElement(layer()\neuron())
connection_count = ReadInteger(0)
For ind = #True To connection_count
AddElement(layer()\neuron()\connection())
layer()\neuron()\connection()\weight = ReadFloat(0)
Next
Next
Next
CloseFile(0)
EndIf
EndProcedure
Procedure Learning(error,learning_rate.f)
For i = ListSize(layer()) - #True To #False Step -#True
SelectElement(layer(),i)
ForEach layer()\neuron()
If i = ListSize(layer()) - #True
If error = #True
If layer()\neuron()\result >= 0.5
layer()\neuron()\error = - layer()\neuron()\result
Else
layer()\neuron()\error = #True - layer()\neuron()\result
EndIf
Else
If layer()\neuron()\result >= 0.5
layer()\neuron()\error = #True - layer()\neuron()\result
Else
layer()\neuron()\error = - layer()\neuron()\result
EndIf
EndIf
Else
weight_delta_error.f = #False
ForEach layer()\neuron()\connection()
If weight_delta_error < layer()\neuron()\connection()\weight_delta
weight_delta_error = layer()\neuron()\connection()\weight_delta
EndIf
Next
layer()\neuron()\error = layer()\neuron()\result * weight_delta_error
EndIf
weight_delta.f = layer()\neuron()\error * layer()\neuron()\result * (#True - layer()\neuron()\result)
If i>#False
neuron_index = ListIndex(layer()\neuron())
SelectElement(layer(),i-#True)
ForEach layer()\neuron()
SelectElement(layer()\neuron()\connection(),neuron_index)
layer()\neuron()\connection()\weight_delta = weight_delta
layer()\neuron()\connection()\weight = layer()\neuron()\connection()\weight - layer()\neuron()\result * weight_delta * learning_rate
Next
SelectElement(layer(),i)
SelectElement(layer()\neuron(),neuron_index)
EndIf
Next
Next
EndProcedure
Procedure EnterValue(index,value.f)
SelectElement(layer(),#False)
SelectElement(layer()\neuron(),index): layer()\neuron()\result = value
EndProcedure
Procedure.f ReadValue(index)
If index = #False
ForEach layer()
layer_index = ListIndex(layer())
ForEach layer()\neuron()
If layer_index > #False
neuron_index = ListIndex(layer()\neuron())
SelectElement(layer(),layer_index - #True)
Summa = #False
ForEach layer()\neuron()
SelectElement(layer()\neuron()\connection(),neuron_index)
Summa = Summa + layer()\neuron()\connection()\result
Next
SelectElement(layer(),layer_index)
SelectElement(layer()\neuron(),neuron_index)
layer()\neuron()\result = Activation(Summa)
EndIf
ForEach layer()\neuron()\connection()
layer()\neuron()\connection()\result = layer()\neuron()\connection()\weight * layer()\neuron()\result
Next
Next
Next
EndIf
SelectElement(layer(),ListSize(layer()) - #True)
SelectElement(layer()\neuron(),index)
ProcedureReturn layer()\neuron()\result
EndProcedure
;Создаем слои с указанным количеством нейронов
;CreateLayer(3) первый слой с тремя нейронами
;CreateLayer(5) второй слой с пятью нейронами
;CreateLayer(2) третий слой с двумя нейронами
;Вносим входные данные следующим образом
;EnterValue(0,0.7) первый входной нейрон
;EnterValue(1,0.9) второй входной нейрон
;EnterValue(2,0.2) третий входной нейрон
;После получаем данные
;ReadValue(0) первый выходной нейрон
;ReadValue(1) второй выходной нейрон
;Learning(#True,0.1) #True указывает сети наличие ошибки, 0.1 параметр (в диапазоне от 0.1 до 0.9) указывает насколько "сильно" сеть должна учесть ошибку
;Сохранить сеть в файл Save(file$)
;Открыть сеть из файл Open(file$)
__________________
Хочешь изменить мир-начни с шейдера.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:57.
|