我试图实现一个反向传播的方法为一个完全连接层与任意激活函数。我理解算法背后的一般思想和数学,但我在理解向量化形式上有困难。。。你知道吗
我需要帮助理解元素的预期尺寸
已知尺寸:
未知大小: 对于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
我相信,您的代码中有一点混淆:您编写的
self.z
是激活前的线性输出,但出于某种原因,您可以使用它来计算称为dz
的激活导数。它应该使用激活值。然后,假设您计算了该值(我称之为prime
,以避免与我的另一个dz
混合),请尝试以下操作:几个错误:
self.b
应该有大小self.b is size (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中每个元素的损失梯度相关问题 更多 >
编程相关推荐