我正在尝试计算 Tensorflow 中相同维度的 n 个张量的线性组合。标量系数是 Tensorflow Variable
。
由于tf.scalar_mul
不能推广到将张量向量乘以标量向量,因此到目前为止我已经使用了tf.gather
并单独执行了每个乘法python for 循环,然后将结果列表转换为张量,并在第零轴上对它们求和。就像这样:
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 中计算这样的线性组合,速度更快且资源占用更少?
最佳答案
使用广播。假设coefficients
具有形状(n,)
和tensors
形状(n,...)
你可以简单地使用
coefficients[:, tf.newaxis, ...] * tensors
在这里,您需要重复 tf.newaxis
次数,次数与 tensors
除了大小 n
之外的维度相同。所以例如如果张量
具有形状(n, a, b)
,您将使用coefficients[:, tf.newaxis, tf.newaxis]
这会将系数转换为与张量具有相同维度的张量,但除第一个维度之外的所有维度的大小均为1
,因此可以广播它们到张量
的形状。
一些替代方案:
- 首先将
系数
定义为具有正确维数的变量(在我看来有点难看)。 - 如果您不喜欢索引,请使用
tf.reshape
将系数
reshape 为(n, 1, ...)
语法。 - 使用
tf.transpose
将大小为n
的维度移动到张量
的末尾。然后,尺寸会对齐以进行广播,而无需将尺寸添加到系数
。
另请参阅the numpy docs on broadcasting -- 它在 Tensorflow 中的工作方式本质上是相同的。
关于python-3.x - 在 Tensorflow 中计算张量的线性组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49532371/