Home > Enterprise >  R- How to save values using for loop iteration
R- How to save values using for loop iteration

Time:10-15

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.

  •  Tags:  
  • r
  • Related