张量流中的张量收缩

Tensor contraction in tensorflow

我有一个形状为 (?,4) 的张量 weights 和一个形状为 (?,4,1024) 的张量 embeddings

我想根据相应的weightsembeddings每一行的4个张量取加权平均来收缩张量,最后产生一个output的张量形状 (?,1024).

我该怎么做?我尝试使用 output = tf.tensordot(weights, embeddings, axes = [1,1]) 但它产生了形状为 (?,?,1024) 的张量。

你可以这样做:

import tensorflow as tf

weights = tf.placeholder(tf.float32, [None, 4])
embeddings = tf.placeholder(tf.float32, [None, 4, 1024])
output = tf.einsum('ij,ijk->ik', weights, embeddings)

同样可以用矩阵乘积表示,不知道性能上会不会有区别:

output = tf.squeeze(tf.expand_dims(weights, 1) @ embeddings, 1)

您也可以只进行乘法和减法,尽管由于具有中间张量,原则上这样做的性能会更差。

output = tf.reduce_sum(tf.expand_dims(weights, 2) * embeddings, axis=1)