Max*_*pin 4 python machine-learning backpropagation
我试图理解反向传播在数学上是如何工作的,并想用 numpy 在 python 中实现它。我使用带有一个隐藏层的前馈神经网络进行计算,使用 sigmoid 作为激活函数,使用均方误差作为误差函数。这是我的计算结果截图:,问题是有一堆矩阵,我无法将它们完全相乘,因为它们没有相同的维度。(截图中L是输出层,L-1是隐藏层,L-2是输入层,W是权重,E是误差函数,小写A是激活)
(代码中第一层有28*28个节点,[因为我使用0-9位数字的MNIST数据库作为训练数据],隐藏层为15个节点,输出层为10个节点)。
# ho stands for hidden_output
# ih stands for input_hidden
def train(self, input_, target):
self.input_ = input_
self.output = self.feedforward(self.input_)
# Derivative of error with respect to weight between output layer and hidden layer
delta_ho = (self.output - target) * sigmoid(np.dot(self.weights_ho, self.hidden), True)) * self.hidden
# Derivative of error with respect to weight between input layer and hidden layer
delta_ih = (self.output - target) * sigmoid(np.dot(self.weights_ho, self.hidden), True)) * self.weights_ho * sigmoid(np.dot(self.weights_ih, self.input_), True) * self.input_
# Adjust weights
self.weights_ho -= delta_ho
self.weights_ih -= delta_ih
Run Code Online (Sandbox Code Playgroud)
在线上delta_ho = ...
,矩阵的尺寸为(10x1 - 10x1) * (10x1) * (1x15)那么我该如何计算呢?谢谢你的帮助!
这是斯坦福大学 CS231 的注释:http://cs231n.github.io/optimization-2/。
对于矩阵/向量的反向传播,要记住的一件事是(相对于)变量(矩阵或向量)的梯度始终与变量具有相同的形状。
例如,如果损失为l
,则损失的计算中有一个矩阵乘法运算:C = A.dot(B)
。假设A
有形状(m, n)
并且B
有形状(n, p)
(因此C
有形状(m, p)
)。梯度C
是dC
,它也有形状(m, p)
。A
要使用dC
和来获得形状为 的矩阵B
,我们只能将和dC.dot(B.T)
的两个形状的矩阵相乘来获得损失关于 的梯度。类似地,B 的损失梯度为。(m, p)
(p, n)
dA
A
dB = A.T.dot(dC)
对于任何添加的操作(例如 sigmoid),您可以像其他地方一样将它们向后链接。
归档时间: |
|
查看次数: |
3974 次 |
最近记录: |