等价于tensorflow中的np.add.at

时间:2016-11-02 21:08:34

标签: python numpy tensorflow numpy-ufunc

如何将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

2 个答案:

答案 0 :(得分:1)

对于np.add.at,您可能希望查看tf.SparseTensor,它通过值列表和索引列表(更适合稀疏数据,因此名称)表示张量。

所以对你的例子来说:

np.add.at(dW, self.x.ravel(), dout.reshape(-1, self.D))

(假设dWxdout是张量):

tf.sparse_add(dW, tf.SparseTensor(x, tf.reshape(dout, [-1])))

这假设x的形状为[n, nDims](即x是n个索引的“列表”,每个维度为nDims}和{{1} }具有形状dout

答案 1 :(得分:0)

以下是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来匹配迭代解决方案。