首页 文章

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

提问于
浏览
2

我试图在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 回答

  • 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 定义为具有正确维数的变量(我认为有点难看) .

    • 如果您不喜欢索引语法,请使用 tf.reshapecoefficients 重新整形为 (n, 1, ...) .

    • 使用 tf.transpose 将尺寸 n 的尺寸移至 tensors 的末尾 . 然后尺寸对齐广播而无需向 coefficients 添加尺寸 .

    另见the numpy docs on broadcasting - 它在Tensorflow中的工作方式基本相同 .

相关问题