python-3.x - 在 Tensorflow 中计算张量的线性组合

标签 python-3.x tensorflow tensor

我正在尝试计算 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/

相关文章:

python - Pandas :删除任何列包含特定子字符串的所有行

Python 3 整数地址

python - 采用整数 n 并使用字符串格式将 pi 打印为 n 位数字的函数

python - 如何使用经过训练的 Keras GRU 模型预测新的数据系列?

javascript - 使用 JavaScript 和 TensorFlow 通过 PoseNet 进行多人跟踪的问题

python - 为什么会出现这个错误:"Sliced assignment is only supported for variables"

c++ - 使用 Python 的 Matplotlib 绘制在 C++ 程序中生成的数据

python - 无法在 Ubuntu 20.04 上安装 1.x 版本的 Tensorflow

c# - C# 中 OnnxRuntime 张量的高效位图

python - 如何在 Tensorflow 中使用多个输入来应用 tf.map_fn