我正在研究神经网络,我有一个LinearTransform对象。我的问题存在于我的backprop函数中。
我有时会有一个向量和一个标量,在这种情况下我想做标量乘法而不是改变向量的维数。
其他时候我会有一个向量和一个向量,我想要的结果是矩阵。
所以我使用的是np.dot。但是我需要维度对点积有效,所以我将输入转换为数组中的矩阵。
我的代码如下所示:
tmp1 = np.matrix(zin)
tmp2 = np.matrix(grad_output)
pdb.set_trace()
delt = np.dot( tmp2 , tmp1 )
这是暗淡的:
(Pdb) tmp1.shape
(1, 3073)
(Pdb) tmp2.shape
(1, 1)
在调试器中我运行:
-> delt = np.dot( tmp2 , tmp1 )
(Pdb) np.dot(tmp2, tmp1)
matrix([[ 0. , 0. , 0. , ..., -0.01216065,
-0.03115987, -0.00775516]])
(Pdb)
这是预期的结果。
但是当我继续执行时,我会收到一个值错误:
ValueError: non-broadcastable output operand with shape (3073,1) doesn't match the broadcast shape (3073,3073)
什么黑魔法导致这条线不再起作用?
按要求完全追溯:
File "myfile.py", line 255, in <module>
lr, momentum, l2_penalty)
File "myfile.py", line 177, in train
siphon.append( lyr.backward(siphon[-1], p, lr, mtm, l2_p) )
File "myfile.py", line 38, in backward
delt = np.dot( tmp2 , tmp1 )
ValueError: non-broadcastable output operand with shape (3073,1) doesn't match the broadcast shape (3073,3073)
我认为你想要这个功能导致这个:
def backward( self, grad_output, zin,
learning_rate= 0.1, momentum=0.1, l2_penalty=0.0 ):
tmp1 = np.matrix(zin)
tmp2 = np.matrix(grad_output)
pdb.set_trace()
delt = np.dot( tmp2 , tmp1 )
这与我已发布但已提供上下文的代码相同。