Artificial neural network with 2-layers and backpropagation
Posted: Thu Sep 30, 2004 9:31 am
Code updated For 5.20+
Hi, i made some procedures to use artifial neural networks with two layers, Input and Hidden layer with backpropagation, it's better than one layer ann's because it can learn some problems that one layer ann's can't, a one layer ann can't learn the xor function, a two layers ann can learn this function.
Hi, i made some procedures to use artifial neural networks with two layers, Input and Hidden layer with backpropagation, it's better than one layer ann's because it can learn some problems that one layer ann's can't, a one layer ann can't learn the xor function, a two layers ann can learn this function.
Code: Select all
; Artificial neural network example by Balrog Soft
; Two layers with backprogpagation
Global NUM_INPUT, NUM_OUTPUT, NUM_HIDDEN, NUM_NETWORK
NUM_INPUT = 2
NUM_OUTPUT = 1
NUM_HIDDEN = 4
NUM_NETWORK = 1
Dim patternin(NUM_INPUT-1)
Dim patternout(NUM_OUTPUT-1)
Global Dim W_IN_HIDDEN.f(NUM_NETWORK-1, NUM_INPUT-1, NUM_HIDDEN-1)
Global Dim W_HIDDEN_OUT.f(NUM_NETWORK-1, NUM_HIDDEN-1, NUM_OUTPUT-1)
Global Dim N_IN.f(NUM_NETWORK-1, NUM_INPUT-1)
Global Dim N_HIDDEN.f(NUM_NETWORK-1, NUM_HIDDEN-1)
Global Dim N_OUT.f(NUM_NETWORK-1, NUM_OUTPUT-1)
Global Dim N_TEACH.f(NUM_NETWORK-1, NUM_OUTPUT-1)
Global Dim E_HIDDEN.f(NUM_NETWORK-1, NUM_HIDDEN-1)
Global Dim E_OUT.f(NUM_NETWORK-1, NUM_OUTPUT-1)
Global Dim LEARN.f(NUM_NETWORK-1)
#e=2.71828182
Procedure Init_Network(n,i,h,o)
NUM_NETWORK = n
NUM_INPUT = i
NUM_OUTPUT = o
NUM_HIDDEN = h
Dim patternin(NUM_INPUT-1)
Dim patternout(NUM_OUTPUT-1)
Dim W_IN_HIDDEN.f(NUM_NETWORK-1, NUM_INPUT-1, NUM_HIDDEN-1)
Dim W_HIDDEN_OUT.f(NUM_NETWORK-1, NUM_HIDDEN-1, NUM_OUTPUT-1)
Dim N_IN.f(NUM_NETWORK-1, NUM_INPUT-1)
Dim N_HIDDEN.f(NUM_NETWORK-1, NUM_HIDDEN-1)
Dim N_OUT.f(NUM_NETWORK-1, NUM_OUTPUT-1)
Dim N_TEACH.f(NUM_NETWORK-1, NUM_OUTPUT-1)
Dim E_HIDDEN.f(NUM_NETWORK-1, NUM_HIDDEN-1)
Dim E_OUT.f(NUM_NETWORK-1, NUM_OUTPUT-1)
Dim LEARN.f(NUM_NETWORK-1)
For n=0 To NUM_NETWORK-1
For h=0 To NUM_HIDDEN-1
For o=0 To NUM_OUTPUT-1
W_HIDDEN_OUT(n, h, o) =(Random(5)-3)
Next o
Next h
For i=0 To NUM_INPUT-1
For h=0 To NUM_HIDDEN-1
W_IN_HIDDEN(n, i, h) =(Random(5)-3)
Next h
Next i
Next n
EndProcedure
Procedure Set_Input(n, i, value.f)
N_IN(n, i) = value.f
EndProcedure
Procedure Set_Output(n, o, value.f)
N_TEACH(n, o) = value.f
EndProcedure
Procedure.f f_logic(X.f)
ret.f = 0
ret = 1 / (1 + Pow(#e,-x))
ProcedureReturn ret
EndProcedure
Procedure Calculate_Network(n)
For h=0 To NUM_HIDDEN-1
N_HIDDEN(n,h) = 0.0
Next
For o=0 To NUM_OUTPUT-1
N_OUT(n,o) = 0.0
Next
For h=0 To NUM_HIDDEN-1
For i=0 To NUM_INPUT-1
N_HIDDEN(n,h) + (N_IN(n,i) * W_IN_HIDDEN(n,i, h))
Next i
N_HIDDEN(n,h) = f_logic(N_HIDDEN(n,h))
Next h
For o=0 To NUM_OUTPUT-1
For h=0 To NUM_HIDDEN-1
N_OUT(n,o) + (N_HIDDEN(n,h) * W_HIDDEN_OUT(n,h, o))
Next h
N_OUT(n,o) = f_logic(N_OUT(n,o))
Next o
EndProcedure
Procedure Calculate_Errors(n)
err.f
For o=0 To NUM_OUTPUT-1
E_OUT(n, o) = (N_TEACH(n, o) - N_OUT(n, o))
Next o
For h=0 To NUM_HIDDEN-1
err = 0.0
For o=0 To NUM_OUTPUT-1
err + (E_OUT(n, o) * W_HIDDEN_OUT(n, h, o))
Next o
E_HIDDEN(n, h) = N_HIDDEN(n, h) * (1 - N_HIDDEN(n, h)) * err
Next h
EndProcedure
Procedure Train_Network(n)
For h=0 To NUM_HIDDEN-1
For o=0 To NUM_OUTPUT-1
W_HIDDEN_OUT(n, h, o) + (LEARN(n) * N_HIDDEN(n, h) * E_OUT(n, o))
Next o
Next h
For i=0 To NUM_INPUT-1
For h=0 To NUM_HIDDEN-1
W_IN_HIDDEN(n, i, h) + (LEARN(n) * N_IN(n, i) * E_HIDDEN(n, h))
Next h
Next i
EndProcedure
Procedure.f Get_Network_Output(n, o)
ProcedureReturn N_OUT(n, o)
EndProcedure
Procedure Learn_Constant(n,cte.f)
LEARN(n)=cte
EndProcedure
OpenConsole()
Init_Network(1, 2, 4, 1)
Learn_Constant(0, 0.45)
For RP=1 To 2000
Inp$=""
For In=0 To 1
InputN.f=Random(1)
Inp.l=InputN
;- Set random inputs
Set_Input(0,In,InputN)
Inp$+Str(Inp)
Next In
; here you must put the combinations that must have a 1.0 output.
If Inp$="11" Or Inp$="10"
CorrectOutput.f=1.0
Else
CorrectOutput.f=0.0
EndIf
Set_Output(0,0,CorrectOutput)
; and get an Output #TRUE or #FALSE
Calculate_Network(0)
Calculate_Errors(0)
Train_Network(0)
output.f=Get_Network_Output(0,0)
If output>=0.5
PrintN("I: "+Inp$+" - O: 1 - "+StrF(output.f))
Else
PrintN("I: "+Inp$+" - O: 0 - "+StrF(output.f))
EndIf
Input()
Next RP
Input()
CloseConsole()