R-如何使用for循环迭代保存值



如何获取每个"在迭代?我已经有了1000个"错误"的值;但我需要每1000个权重值,比如w1 w2 w3,,,,w6我怎样才能提取w1 ~将从1000年我已经犯错吗?我认为我必须使用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)
}

err函数

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)




}

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

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的另一种方式。

最新更新