如何将 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需要匹配迭代解决方案。