我想找到函数wrt变量T的梯度。我正在广播错误操作数。为什么我会收到此错误以及如何解决? l的取值范围是0到4。
def grad(l,d1,d2):
grad_T = 0
b = 1
w = np.ones(5,1)
w.reshape(5,1)
T = np.random.rand(46,5)
D = np.random.rand(46,9063)
if(y[d2]!=y[d1]):
difVec = D[ : ,d2].astype(float) - D[ :,d1].astype(float)
dify = 1
if(y[d2]<y[d1]):
dify = -1
grad_T = grad_T + (-1*dify*w[l,0]*difVec)/(1+np.exp(dify(
w.transpose() @ T.transpose() @ difVec + b )))
return(grad_T)
Error
<ipython-input-40-56571fb637a5> in grad(d1, d2)
20 if(y[d2]<y[d1]):
21 dify = -1
---> 22 grad_T = grad_T +
(-1*dify*w[l,1]*difVec)/(1+np.exp(dify * ( w.transpose() @
T.transpose() @ difVec + b )))
ValueError: operands could not be broadcast together with shapes (46,)
(5,)
答案 0 :(得分:0)
你好,欢迎来到SO。
首先,您的代码根本无法运行。以下是使其正常运行的修复程序。对于操作数广播错误,请继续下面的操作。
w = np.ones(5,1)) # excess right paranthesis here
# numpy.ones([5,1]) it should be a list of dimensions
w.reshape(5,1)
T.reshape(46,5) # unnecessary
D = np.random,rand(46, 9063) # random,rand
# You meant random.rand I suppose
grad_T = grad_T + b
(-1*dify*w[l,1]*difVec)/(1+np.exp(dify * ( w.transpose() @
T.transpose() @ difVec + b )))
# This here will not work w is [5,1] you cannot index w[l, 1]
# It is definitely out of bounds. You meant w[l, 0] I suppose.
我让您的代码在Colab上工作。矩阵乘法的所有维度都是正确的。我不知道它的大小,因此摆脱了b
。 b
可能是导致您收到错误的原因。如果您摆脱b
,则提名人的形状(46,)和分母(1,)。您收到的错误可能是因为b
的形状为(5,)。由于您的w为[5,1],因此我假设您的偏差(b
)具有相同的尺寸。因此,索引b矩阵可以解决您的问题。