在Tensorflow中计算张量的线性组合

时间:2018-03-28 10:41:39

标签: python-3.x tensorflow

我正在尝试计算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中有一种更自然的方式来计算这样的线性组合会更快,更少资源吗?

2 个答案:

答案 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编写的以用于核心操作。