如何将 np.add.at 语句转换为 tensorflow?
np.add.at(dW, self.x.ravel(), dout.reshape(-1, self.D))
编辑
self.dW.shape 是 (V, D),self.D.shape 是 (N, D),self.x.size 是 N
如何将 np.add.at 语句转换为 tensorflow?
np.add.at(dW, self.x.ravel(), dout.reshape(-1, self.D))
编辑
self.dW.shape 是 (V, D),self.D.shape 是 (N, D),self.x.size 是 N
对于np.add.at
,您可能想查看tf.SparseTensor,它通过值列表和索引列表表示张量(更适合稀疏数据,因此得名)。
所以对于你的例子:
np.add.at(dW, self.x.ravel(), dout.reshape(-1, self.D))
那将是(假设dW
和是张x
量dout
):
tf.sparse_add(dW, tf.SparseTensor(x, tf.reshape(dout, [-1])))
这是假设x
是 shape [n, nDims]
(即x
是 n 个索引的“列表”,每个维度nDims
),并且dout
具有 shape [n]
。
下面是一个例子np.add.at
:
In [324]: a=np.ones((10,))
In [325]: x=np.array([1,2,3,1,4,5])
In [326]: b=np.array([1,1,1,1,1,1])
In [327]: np.add.at(a,x,b)
In [328]: a
Out[328]: array([ 1., 3., 2., 2., 2., 2., 1., 1., 1., 1.])
如果相反我使用+=
In [331]: a1=np.ones((10,))
In [332]: a1[x]+=b
In [333]: a1
Out[333]: array([ 1., 2., 2., 2., 2., 2., 1., 1., 1., 1.])
注意a1[1]
是2,不是3。
相反,如果我使用迭代解决方案
In [334]: a2=np.ones((10,))
In [335]: for i,j in zip(x,b):
...: a2[i]+=j
...:
In [336]: a2
Out[336]: array([ 1., 3., 2., 2., 2., 2., 1., 1., 1., 1.])
它匹配。
如果x
没有重复项,则+=
可以正常工作。但是对于重复项,add.at
需要匹配迭代解决方案。