我有一个2D张量。我想将2D张量和tf.tensordot(vector, matrix, axes=1)
中的每个矢量带入3D张量中的矩阵,该3D张量中的索引与矢量在2D张量中的索引相同。
从本质上讲,我希望得到与for循环相同的结果,但是通过执行tensorflow矩阵运算而不是numpy和循环:
tensor2d = np.array([[1.,1.,1.,0.,0.],
[1.,1.,0.,0.,0.]],
np.float32)
tensor3d = np.array([
[
[1., 2., 3.],
[2., 2., 3.],
[3., 2., 3.],
[4., 2., 3.],
[5., 2., 3.],
],
[
[1., 2., 3.],
[2., 2., 3.],
[3., 2., 3.],
[4., 2., 3.],
[5., 2., 3.],
]
], np.float32)
results = []
for i in range(len(tensor2d)):
results.append(np.tensordot(tensor2d[i], tensor3d[i], axes=1))
其输出应该是一个看起来像这样的矩阵(尽管类型会有所不同):
[array([6., 6., 9.], dtype=float32), array([3., 4., 6.], dtype=float32)]
答案 0 :(得分:0)
好吧,自找到的答案归结为使用tf.math.multiply
并弄乱了转置,直到结果是所需的形状。如果有人可以在某个时候提出一个更原则性的答案,那将是很好,但是现在,这可行:
result = tf.transpose(tf.math.multiply(tensor2d, tensor3d.transpose([2,0,1])), [1,2,0])