【问题标题】:R- How to save values using for loop iterationR-如何使用for循环迭代保存值
【发布时间】:2021-10-14 10:18:43
【问题描述】:

如何在迭代过程中获取每个“w”的值? 我已经有了 1000 个“err”值,但我需要每个 1000 个权重值,例如 w1、w2、w3、、、、w6 如何从我已经拥有的 1000 err 中提取 w1~w6? 我认为我必须使用 res 函数和 err 函数,因为这些函数运行良好但我不知道。

res函数是

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)
}

错误函数是

error = function(res, out){ 
  err = 0.5*(out[1] - res[4])^2 + 0.5*(out[2] - res[5])^2 
  return(err)
}

迭代部分在这里

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)
    
    
    

    
}

【问题讨论】:

    标签: r


    【解决方案1】:

    我认为你只需要将它们保存在一个列表中,试试这个:

    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)
    

    然后您可以调用任何迭代的权重向量,例如迭代 7:

    w_list[[7]]
    

    如果您需要每个 w1 或 w2 值,那就有点棘手了:

    every_w1 <- sapply(w_list,'[[',1)
    every_w2 <- sapply(w_list,'[[',2)
    

    更多解释见sapplylapply。基本上这只是循环w_list的另一种方式。

    【讨论】:

    • 哇,我刚刚在一个列表中获得了 6000 个值。但是,我无法解释该列表。我的意思是,那我怎样才能在这个列表中获得 1000 w1?
    • w_list[1:1000] 表示 1000 w1?
    • 有了你的问题,我才真正了解你的数据结构。我编辑了,现在应该更容易理解了!
    • 现在,w_list[[7]] 将从第七次迭代中返回 6 个值 w1,...,w6!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2021-05-11
    • 2021-12-20
    • 2020-03-03
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多