Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 计算Tensorflow中张量的线性组合_Python 3.x_Tensorflow_Tensor - Fatal编程技术网

Python 3.x 计算Tensorflow中张量的线性组合

Python 3.x 计算Tensorflow中张量的线性组合,python-3.x,tensorflow,tensor,Python 3.x,Tensorflow,Tensor,我试图计算Tensorflow中相同维度的n张量的线性组合。标量系数为TensorflowVariables 由于tf.scalar\u mul不能泛化为将张量向量乘以标量向量,因此到目前为止,我使用了tf.gather并在python for循环中单独执行每个乘法,然后将结果列表转换为张量,并在第零轴上求和。像这样: coefficients = tf.Variable(tf.constant(initial_value, shape=[n])) components = [] for i i

我试图计算Tensorflow中相同维度的
n
张量的线性组合。标量系数为Tensorflow
Variable
s

由于
tf.scalar\u 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中,有没有一种更自然的方式来计算这样的线性组合,它会更快、更少地占用资源?

使用广播。假设
系数
具有形状
(n,)
张量
形状
(n,…)
,您只需使用

coefficients[:, tf.newaxis, ...] * tensors
在这里,您需要重复
tf。除了大小
n
之外,newaxis
张量
还有维度,那么newaxis
的重复次数就相当于
张量的重复次数。因此,例如,如果
张量
具有形状
(n,a,b)
您将使用
系数[:,tf.newaxis,tf.newaxis]

这会将系数转换为与
张量
具有相同维数的张量,但除第一个维度外,所有维度的大小均为
1
,因此它们可以广播为
张量
的形状

一些备选方案:

  • 首先将系数定义为具有正确维数的变量(在我看来有点难看)
  • 如果您不喜欢索引语法,请使用
    tf.reformate
    系数重新整形为
    (n,1,…)
  • 使用
    tf.transpose
    将大小
    n
    的维度移动到
    张量的末尾。然后对齐尺寸以进行广播,而无需向系数添加尺寸

另请参见——它在Tensorflow中的工作方式基本相同。

有一个新的PyPI模块,称为TWIT,即张量加权插值传输,它可以快速完成此任务。对于核心操作,它是用C编写的。

您可以尝试避免附加。如果您需要使用列表,如果您已经知道了内存的大小,那么追加通常比预先分配内存慢。使用1M操作的测试运行给出了以下结果:追加:0.217166990063476562秒,不追加:0.1666109561920166秒。这可以在大范围内归结为一段时间。我对这些方法有一个小问题:
tf.reformate(系数,张量.shape)
无法工作,因为张量的形状部分未知,它本质上是不同网络权重的向量。e、 g.它可能是形状[n,?,10]其他选项如何?只要已知
张量
的维数,这应该是可行的。另外,你不能将
系数
重塑为
张量。形状
,因为它们通常没有相同数量的元素。好吧-我明白你的意思,它需要是形状
[n,*([1]*tensor\u维度)]
,如果这有意义的话。这个方法比我以前的工作有了很大的改进,内存使用率降低了一个数量级,我接受答案!)确切地我稍微改写了
重塑
部分,使其更清晰。所有选项的想法都是对齐
系数
张量
的形状,以便前者可以沿着后者的维度正确重复,以实现高效的元素级乘法(模拟所需的标量乘法)。