我正在尝试计算Tensorflow中相同维度的n
张量的线性组合。标量系数是Tensorflow Variable
s。
由于tf.scalar_mul
没有推广使用标量向量乘以张量向量,我到目前为止使用tf.gather
并在python for循环中单独执行每个乘法,然后转换列表结果到张量轴并将它们与第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中有一种更自然的方式来计算这样的线性组合会更快,更少资源吗?
答案 0 :(得分:2)
使用广播。假设coefficients
具有形状(n,)
和tensors
形状(n,...)
,您只需使用
coefficients[:, tf.newaxis, ...] * tensors
在这里,您需要重复tf.newaxis
次,tensors
除了尺寸n
之外还有尺寸。tensors
。所以例如如果(n, a, b)
的形状为coefficients[:, tf.newaxis, tf.newaxis]
,您可以使用tensors
这会将系数转换为与1
具有相同维数的张量,但除第一个之外的所有维度的大小均为tensors
,因此可以将它们广播为{{coefficients
的形状1}}。
一些替代方案:
tf.reshape
定义为具有正确维数的变量(在我看来有点难看)。coefficients
将(n, 1, ...)
重塑为tf.transpose
。n
将尺寸tensors
的尺寸转移到coefficients
的结束。然后维度对齐广播,而无需向<audio controls>
<source src="horse.ogg" type="audio/ogg">
<source src="horse.mp3" type="audio/mpeg">
</audio>
添加维度。另见the numpy docs on broadcasting - 它在Tensorflow中的工作方式基本相同。
答案 1 :(得分:0)
有一个名为TWIT的新PyPI模块,即Tensor加权插值传递,可以快速完成此任务。它是用C编写的以用于核心操作。