Machine learning 反向传播算法(神经网络)
我尝试为神经网络实现一个在线反向传播算法 在计算了存储在变量“out”和“nets”中的每个节点的每个输出和净值(即未应用激活函数的值)之后,我还尝试计算每个节点的增量值(每个节点的诱导字段)和权重的变化;delta值存储在一个名为“delta”的变量中,无论变量是否存储在“delta_weights”变量中,实际上是一个三维矩阵:这个矩阵的第一个索引是我工作的级别,第二个表示网络中的一个节点,第三个是进入该节点的一个连接(synapsis) 首先,这两个变量包含所有零 然后我编写了以下代码:Machine learning 反向传播算法(神经网络),machine-learning,neural-network,backpropagation,Machine Learning,Neural Network,Backpropagation,我尝试为神经网络实现一个在线反向传播算法 在计算了存储在变量“out”和“nets”中的每个节点的每个输出和净值(即未应用激活函数的值)之后,我还尝试计算每个节点的增量值(每个节点的诱导字段)和权重的变化;delta值存储在一个名为“delta”的变量中,无论变量是否存储在“delta_weights”变量中,实际上是一个三维矩阵:这个矩阵的第一个索引是我工作的级别,第二个表示网络中的一个节点,第三个是进入该节点的一个连接(synapsis) 首先,这两个变量包含所有零 然后我编写了以下代码:
for j in range(self.l):
# self.l is the number of levels in the network: I'm running through all the levels
if j == 0:
# last level: output units
for i in range(self.p[-1]):
# self.p[j] is the number of units in level j: I'm considering every unit in the specific level fixed by the previous for cicle
ei = np.subtract(target[i], outs[-1][i])
# error of unit i in the last level
deltai = ei * self.der_actfunct(nets[-1][i])
delta[-1][i] = deltai
for h in range(self.p[-2]):
delta_weights[-1][i][h] = eta * deltai * outs[-2][h]
else:
# other levels
# going back until first level
for i in range(self.p[-j-1]):
temp = 0
for k in range(self.p[-j]):
temp += delta[-j][k] * self.network[-j][k].weights[i]
# calculating induced field of hidden nodes
deltai = temp * self.der_actfunct(nets[-j-1][i])
delta[-j-1][i] = deltai
if j == self.l-1:
for h in range(self.n):
delta_weights[0][i][h] = eta * deltai * variable[h]
else:
for h in range(self.p[-j-2]):
delta_weights[-j-1][i][h] = eta * deltai * outs[-j-2][h]
# UPDATE WEIGHTS
for j in range(self.l):
for i in range(self.p[j]):
self.network[j][i].set_weights(np.add(self.network[j][i].weights, delta_weights[j][i]), 0)
return
我的问题是,训练错误在超过10个纪元后实际上会增加。我确信这是一个错误,那么我的代码怎么会出错呢
(我使用了eta,学习率,0.01)你尝试过降低学习率吗?你使用迭代和优化吗?降低学习率只会降低上述过程的速度,但训练误差仍然会爆炸。我经常发现用一些简单的测试数据(如x,y坐标为直线)训练网络很有用在解决我的主要问题之前。这肯定会收敛到全局最小值,并有助于识别我的实现中的任何错误。