3

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

4

2 回答 2

2

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

所以对于你的例子:

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

那将是(假设dW和是张xdout):

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

这是假设x是 shape [n, nDims](即x是 n 个索引的“列表”,每个维度nDims),并且dout具有 shape [n]

于 2016-11-02T21:33:32.867 回答
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需要匹配迭代解决方案。

于 2016-11-03T00:16:14.003 回答