使用反向传播演算中的符号| 深度学习,第 4 章,我有一个 4 层(即 2 个隐藏层)神经网络的反向传播代码:
def sigmoid_prime(z):
return z * (1-z) # because σ'(x) = σ(x) (1 - σ(x))
def train(self, input_vector, target_vector):
a = np.array(input_vector, ndmin=2).T
y = np.array(target_vector, ndmin=2).T
# forward
A = [a]
for k in range(3):
a = sigmoid(np.dot(self.weights[k], a)) # zero bias here just for simplicity
A.append(a)
# Now A has 4 elements: the input vector + the 3 outputs vectors
# back-propagation
delta = a - y
for k in [2, 1, 0]:
tmp = delta * sigmoid_prime(A[k+1])
delta = np.dot(self.weights[k].T, tmp) # (1) <---- HERE
self.weights[k] -= self.learning_rate * np.dot(tmp, A[k].T)
它有效,但是:
最后的准确性(对于我的用例:MNIST 数字识别)还可以,但不是很好。 将第 (1) 行替换为:
delta = np.dot(self.weights[k].T, delta) # (2)
从代码机器学习与Python:培训和测试的神经网络MNIST数据集还建议:
delta = np.dot(self.weights[k].T, delta)
代替:
delta = np.dot(self.weights[k].T, tmp)
(用本文的注释,它是:
output_errors = np.dot(self.weights_matrices[layer_index-1].T, output_errors)
)
这两个参数似乎是一致的:代码 (2) 比代码 (1) 好。
然而,数学似乎显示出相反的情况(参见此处的视频;另一个细节:请注意,我的损失函数乘以 1/2 而它不在视频中):
问题:哪个是正确的:实现(1)还是(2)?
呼唤远方
相关分类