How to get values each "w" during iteration? I already had the 1000 values of "err" but I need each 1000 values of weight like w1,w2,w3,,,,w6 How can I extract w1~w6 from 1000 err that I already had? I think I have to use res function and err function because these functions go well but I don't know exactly.
res function is
forwardProp = function(input, w){
# input to hidden layer
neth1 = w[1]*input[1]
neth2 = w[2]*input[2]
neth3 = w[3]*input[2]
outh1 = sigmoid(neth1)
outh2 = sigmoid(neth2)
outh3 = sigmoid(neth3)
# hidden layer to output layer
neto1 = w[4]*outh1 w[6]*outh3
neto2 = w[5]*outh2
outo1 = sigmoid(neto1)
outo2 = sigmoid(neto2)
res = c(outh1, outh2, outh3, outo1, outo2)
return(res)
}
err function is
error = function(res, out){
err = 0.5*(out[1] - res[4])^2 0.5*(out[2] - res[5])^2
return(err)
}
and iteration part is here
for(i in 1:numIter){
### forward
res = forwardProp(input, w)
outh1 = res[1]; outh2 = res[2]; outh3=res[3];outo1 = res[4]; outo2 = res[5]
### compute error
err[i] = error(res, out)
### backward propagation
# compute dE_dw1
dneto1_douth1 = w4
douth1_dneth1 = outh1*(1-outh1)
dneth1_dw1 = input[1]
dE_douth1 = dE_douto1*douto1_dneto1*dneto1_douth1
dE_dw1 = dE_douth1*douth1_dneth1*dneth1_dw1
# compute dE_dw2
dneto1_douth2 = 0
dneto2_douth2 = w5
dE_douth2 = dE_douto1*douto1_dneto1*dneto1_douth2 dE_douto2*douto2_dneto2*dneto2_douth2
douth2_dneth2 = outh2*(1-outh2)
dneth2_dw2= input[2]
dE_dw2=dE_douth2*douth2_dneth2*dneth2_dw2
# compute dE_dw3
dneth3_dw3= input[2]
douth3_dneth3=outh3*(1-outh3)
dneto2_douth3=0
dneto1_douth3=w6
dE_douth3=dE_douto1*douto1_dneto1*dneto1_douth3 dE_douto2*douto2_dneto2*dneto2_douth3
dE_dw3=dE_douth3*douth3_dneth3*dneth3_dw3
# compute dE_dw4
dE_douto1 = -( out[1] - outo1 )
douto1_dneto1 = outo1*(1-outo1)
dneto1_dw4 = outh1
dE_dw4 = dE_douto1*douto1_dneto1*dneto1_dw4
# compute dE_dw5
dE_douto2 = -( out[2] - outo2 )
douto2_dneto2 = outo2*(1-outo2)
dneto2_dw5 = outh2
dE_dw5 = dE_douto2*douto2_dneto2*dneto2_dw5
# compute dE_dw6
dE_douto1 = -( out[1] - outo1 )
douto1_dneto1 = outo1*(1-outo1)
dneto1_dw6 = outh3
dE_dw6 = dE_douto1*douto1_dneto1*dneto1_dw6
### update all parameters via a gradient descent
w1 = w1 - gamma1*dE_dw1
w2 = w2 - gamma1*dE_dw2
w3 = w3 - gamma1*dE_dw3
w4 = w4 - gamma1*dE_dw4
w5 = w5 - gamma1*dE_dw5
w6 = w6 - gamma1*dE_dw6
w = c(w1, w2, w3, w4, w5, w6)
}
CodePudding user response:
I think you just need to save them in a list, try this :
numIter=1000
w_list <- list()
for(i in 1:numIter){
w_list[[i]] <- w
res = forwardProp(input, w)
### compute error
err[i] = error(res, out)
Then you can call the vector of weights of any iteration, like this for the iteration 7 :
w_list[[7]]
If you need every w1 or w2 values, it is a bit trickier :
every_w1 <- sapply(w_list,'[[',1)
every_w2 <- sapply(w_list,'[[',2)
Fore more explanation, see sapply
or lapply
. Basically it is just another way to loop over w_list
.