Показать сообщение отдельно
Старый 20.06.2018, 15:33   #1
Izunad
ПроЭктировщик
 
Аватар для Izunad
 
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений
(для 91 пользователей)
Радость Пример нейронной сетки на PureBasic

EXE файл
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 за это полезное сообщение:
DarkInside (03.05.2019), Evgen (20.07.2018), ultimzeus (09.09.2018)