为什么调试器中的代码有效但实际执行时却没有

时间:2018-02-21 20:13:39

标签: python-2.7 numpy

我正在研究神经网络,我有一个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 )

这与我已发布但已提供上下文的代码相同。

0 个答案:

没有答案