Python 3.x 计算Tensorflow中张量的线性组合
我试图计算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
n
张量的线性组合。标量系数为TensorflowVariable
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维度)]
,如果这有意义的话。这个方法比我以前的工作有了很大的改进,内存使用率降低了一个数量级,我接受答案!)确切地我稍微改写了重塑
部分,使其更清晰。所有选项的想法都是对齐系数
和张量
的形状,以便前者可以沿着后者的维度正确重复,以实现高效的元素级乘法(模拟所需的标量乘法)。