python - 实现一般反向传播

标签 python numpy neural-network backpropagation

我正在尝试为具有任意激活函数的全连接层实现反向传播方法。我了解算法背后的一般思想和数学,但我在理解矢量化形式时遇到了困难...

我需要帮助来理解元素的预期尺寸

已知尺寸:

  • 输入 - self.X 大小为 (N,128)
  • 权重 - self.W 是大小 (128,10)
  • 偏差 - self.b 的大小为 (128,10)
  • 输出 - self.y 的大小为 (N,10)
  • 线性输出(激活前)- self.z 大小为 (N,10)

未知尺寸: 对于 N=1(示例数)

  • dy - 下一层的渐变 - 它应该是多少?
  • dz - 激活函数的导数 - 它的大小应该是多少?
  • self.d - 当前层的渐变 - 它应该是多少?

这是我的代码:

def backward(self, dy):
    if self.activator == 'relu':
        dz = np.zeros((self.z.shape[0], self.z.shape[1]))
        dz[self.z>0] = 1
    elif self.activator == 'sigmoid':
        dz = self.z * (1 - self.z)
    elif self.activator == 'soft-max':
        s = self.z.reshape(-1, 1)
        dz = np.diagflat(s) - np.dot(s, s.T)
    elif self.activator == 'none':
        dz = 1

    self.d = np.dot((dz * dy), self.W.T) # the error of the layer
    self.W_grad = np.dot(self.X.T, dy) # The weight gradient of the layer
    self.b_grad = np.sum(dy, axis=0).reshape(1, -1) # The bias gradient of the layer

最佳答案

几个错误:

  • self.b 应该有大小 self.b 是大小 (10, ) 而不是 (128, 10) (因为偏差是每个-单位,而不是每单位对)。
  • self.W_grad 应该是 np.dot(self.X.T, (dz * dy)),而不是 np.dot(self.X.T, dy )self.b_grad 相同 - 它应该是 np.sum(dz * dy, axis=0)

至于其他

dy := dL/dy 应该是 (N, 10),因为它包含关于 y 中每个元素的损失梯度。

dz := df(z)/d(z) 对于元素激活函数应该是 (N, 10),因为 dz[i] 包含 df(z[i])/dz[i]

self.d := dL/dX 应该是 (N, 128) 因为它包含关于 X 中每个元素的损失梯度。

关于python - 实现一般反向传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50276329/

相关文章:

python 零除错误。 float 除以零。简单的脚本

python - 如何在 Python 中生成带有正确 CRLF 的多部分/MIME 消息?

python - 将 2-d 矩阵的每一列乘以 3-d 矩阵的每个切片的更有效方法

python - Theano警告: The same cache key is associated to different modules

image - 创建神经网络结构的图像

python - 搜索图像的颜色。返回 X、Y

python - 如何比较不同标签的 pandas dataframe 对象中的值?

python - Numpy 数组点积 - "aggregate"行,无需评估整个事物

machine-learning - 神经网络无法推广简单的按位与

python - 根据先前的值对带有操作的 numpy 代码进行矢量化