我正在用R编程语言从头开始编写一个神经网络,并将其应用于鸢尾花数据集。这里
d1f是输出层的传播误差矩阵
d2f是隐藏层的传播误差矩阵
a1,a2,a3,a4是隐藏层的激活输出
o1,o2,o3是输出层的激活输出
w1b和w2b分别是隐藏层和输出层的权重矩阵
j用于存储每个观测的成本
到目前为止,我只为整个数据集编写了一个通过的代码。因此,仅计算了传播误差,但权重不会更新。每当我运行这段代码时,我都会收到一个错误
在a1(1 – a1)中出错:无法找到函数“a1”
但是在终止后,我可以在R-Studio的右侧看到a1的值。看起来d2f甚至没有被计算。所以我做错了什么?
这是代码
library(datasets)library("phonTools", lib.loc="~/R/win-library/3.5")iris.df =data(iris)data(iris)data("iris")iris.df=irisJ = vector(mode = "numeric" , length = nrow(iris.df) )attach(iris.df)iris.df$y1 = 0iris.df$y2 = 0iris.df$y3 = 0iris.df$y1[iris.df$Species =="setosa"] = 1iris.df$y2[iris.df$Species =="versicolor"] = 1iris.df$y3[iris.df$Species =="virginica"] = 1w1b = matrix(rexp(20, rate=.1), ncol=5) #Declaring weights between 1st layerw1b = wb1*0.24 - 0.12q = c(1,1,1,1)#w1b = cbind(q,w1b)w2b = matrix(rexp(12, rate=.1), ncol=4)w2b = w2b*0.24 - 0.12q = c(1,1,1)#w2b = cbind(q,w2b)d1f = zeros(3,4)d2f = zeros(4,5)sigmoid = function(z){ sig = 1/( 1 + exp(-z) ) return(sig) }for (i in 1:150) {# Forward Propagation For First Layera1 = sigmoid( 1*w1b[1,1] + iris.df$Sepal.Length[i]*w1b[1,2] + iris.df$Sepal.Width[i]*w1b[1,3] + iris.df$Petal.Length[i]*w1b[1,4] + iris.df$Petal.Width[i]*w1b[1,5] )a2 = sigmoid( 1*w1b[2,1] + iris.df$Sepal.Length[i]*w1b[2,2] + iris.df$Sepal.Width[i]*w1b[2,3] + iris.df$Petal.Length[i]*w1b[2,4] + iris.df$Petal.Width[i]*w1b[2,5] )a3 = sigmoid( 1*w1b[3,1] + iris.df$Sepal.Length[i]*w1b[3,2] + iris.df$Sepal.Width[i]*w1b[3,3] + iris.df$Petal.Length[i]*w1b[3,4] + iris.df$Petal.Width[i]*w1b[3,5] )a4 = sigmoid( 1*w1b[4,1] + iris.df$Sepal.Length[i]*w1b[4,2] + iris.df$Sepal.Width[i]*w1b[4,3] + iris.df$Petal.Length[i]*w1b[4,4] + iris.df$Petal.Width[i]*w1b[4,5] )#Forward Propagation For Second Layero1 = sigmoid( 1*w2b[1,1] + a1*w2b[1,2] + a1*w2b[1,3] + a1*w2b[1,4] )o2 = sigmoid( 1*w2b[2,1] + a2*w2b[2,2] + a2*w2b[2,3] + a2*w2b[2,4] )o3 = sigmoid( 1*w2b[3,1] + a3*w2b[3,2] + a3*w2b[3,3] + a3*w2b[3,4] )#Backward Propagation For First Layerd1f[1,1] = d1f[1,1] + o1*(1-o1) *(o1-y1[i]) #For Baised Noded1f[2,1] = d1f[2,1] + o2*(1-o2) *(o2-y2[i]) #For Baised Noded1f[3,1] = d1f[3,1] + o3*(1-o3) *(o3-y3[i]) #For Baised Noded1f[1,2] = d1f[1,2] + a1*o1*(1-o1)*(o1-y1[i])d1f[2,2] = d1f[2,2] + a1*o2*(1-o2)*(o2-y2[i])d1f[3,2] = d1f[3,2] + a1*o3*(1-o3)*(o3-y3[i])d1f[1,3] = d1f[1,3] + a2*o1*(1-o1)*(o1-y1[i])d1f[2,3] = d1f[2,3] + a2*o2*(1-o2)*(o2-y2[i])d1f[3,3] = d1f[3,3] + a2*o3*(1-o3)*(o3-y3[i])d1f[1,4] = d1f[1,4] + a3*o1*(1-o1)*(o1-y1[i])d1f[2,4] = d1f[2,4] + a3*o2*(1-o2)*(o2-y2[i])d1f[3,4] = d1f[3,4] + a3*o3*(1-o3)*(o3-y3[i])#Backward Propagation For Second Layerd2f[1,2] = d2f[1,2] + iris.df$Sepal.Length[i] * a1(1-a1) * ( (o1-y1[i])*o1*(1-o1)*w2b[1,2] + (o2-y2[i])*o2*(1-o2)*w2b[2,2] + (o3-y3[i])*o3*(1-o3)*w2b[3,2] )d2f[1,3] = d2f[1,3] + iris.df$Sepal.Width[i] * a1(1-a1) * ( (o1-y1[i])*o1*(1-o1)*w2b[1,2] + (o2-y2[i])*o2*(1-o2)*w2b[2,2] + (o3-y3[i])*o3*(1-o3)*w2b[3,2] )d2f[1,4] = d2f[1,4] + iris.df$Petal.Length[i] * a1(1-a1) * ( (o1-y1[i])*o1*(1-o1)*w2b[1,2] + (o2-y2[i])*o2*(1-o2)*w2b[2,2] + (o3-y3[i])*o3*(1-o3)*w2b[3,2] )d2f[1,5] = d2f[1,5] + iris.df$Petal.Width[i] * a1(1-a1) * ( (o1-y1[i])*o1*(1-o1)*w2b[1,2] + (o2-y2[i])*o2*(1-o2)*w2b[2,2] + (o3-y3[i])*o3*(1-o3)*w2b[3,2] )
回答: