张量流中的张量收缩
Tensor contraction in tensorflow
我有一个形状为 (?,4)
的张量 weights
和一个形状为 (?,4,1024)
的张量 embeddings
。
我想根据相应的weights
对embeddings
每一行的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)
我有一个形状为 (?,4)
的张量 weights
和一个形状为 (?,4,1024)
的张量 embeddings
。
我想根据相应的weights
对embeddings
每一行的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)