首页 > 解决方案 > 实现一般的反向传播

问题描述

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

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

已知尺寸:

未知大小: 对于N=1(示例数)

这是我的代码:

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

标签: pythonnumpyneural-networkbackpropagation

解决方案


我相信,您的代码中存在轻微的混淆:您编写的是激活self.z的线性输出,但出于某种原因,使用它来计算您调用的激活导数。它应该使用激活值。然后,假设您计算了该值(我称它为不与我的其他混合),试试这个:dzprimedz

dz = dy * prime
dW = np.dot(dz, self.z.T)
db = np.sum(dz, axis=1, keepdims=True)
d = np.dot(self.W.T, dz)

推荐阅读