我试图在Tensorflow中计算相同维度的 n
张量的线性组合 . 标量系数是Tensorflow Variable
s .
由于 tf.scalar_mul
没有推广使用标量向量乘以张量向量,因此我到目前为止使用 tf.gather
并在python循环中单独执行每个乘法,然后将结果列表转换为张量并将它们相加到第0个值轴 . 像这样:
coefficients = tf.Variable(tf.constant(initial_value, shape=[n]))
components = []
for i in range(n):
components.append(tf.scalar_mul(tf.gather(coefficients, i), tensors[i]))
combination = tf.reduce_sum(tf.convert_to_tensor(components), axis=0)
这样可以正常工作,但根本不能很好地扩展 . 我的应用程序需要计算 n
线性组合,这意味着我有 n^2
收集和乘法运算 . 对于 n
的大值,计算时间很短并且程序的内存使用量过大 .
在Tensorflow中有一种更自然的方式来计算这样的线性组合,它会更快,资源更少吗?
1 回答
使用广播 . 假设
coefficients
具有形状(n,)
和tensors
形状(n,...)
您可以简单地使用在这里,你需要多次重复
tf.newaxis
,因为tensors
除了尺寸n
之外还有尺寸 . 所以例如如果tensors
有形状(n, a, b)
你会使用coefficients[:, tf.newaxis, tf.newaxis]
这会将系数转换为具有与
tensors
相同维数的张量,但除第一个之外的所有维度的大小均为1
,因此它们可以广播为tensors
的形状 .一些替代品:
将
coefficients
定义为具有正确维数的变量(我认为有点难看) .如果您不喜欢索引语法,请使用
tf.reshape
将coefficients
重新整形为(n, 1, ...)
.使用
tf.transpose
将尺寸n
的尺寸移至tensors
的末尾 . 然后尺寸对齐广播而无需向coefficients
添加尺寸 .另见the numpy docs on broadcasting - 它在Tensorflow中的工作方式基本相同 .