如何将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
答案 0 :(得分:1)
对于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
的形状为[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
来匹配迭代解决方案。