我想制作一个 PyTorch 模型,它采用输入与其自身的外积,然后对其进行线性回归。举个例子,考虑输入向量[1,2,3]
,然后我想计算w
和b
来优化[1*1, 1*2, 1*3, 2*1, 2*2, 2*3, 3*1, 3*2, 3*3] @ w + b
.
对于具有 r
行和 c
列的批量输入
,我可以在 PyTorch 中执行此操作
(input.reshape(r,c,1) @ input.reshape(r,1,c)).reshape(r,c**2) @ weigts + b
我的问题是它非常慢。就像一个比添加完全连接的 c*c RELU 层慢 1000 倍且消耗更多内存的因子,即使它具有相同数量的权重。
我的问题是为什么会发生这种情况?
reshape
对于 PyTorch 来说是一个非常昂贵的操作吗?我可以用不同的方式重新表述它,从而提高效率吗?
我知道的另一个等效公式是torch.diag(input @ Weights @ input.T) + b
,但现在我们计算的值比我们需要的多得多(r*r
)只是为了再次把它们扔掉。
最佳答案
当您必须在模型的训练循环期间 reshape 张量时,最好使用 view而不是 reshape 。 View 似乎没有任何性能开销,但它确实要求张量数据是连续的。
如果你的张量在开头 aren't contiguous您可以重新复制张量并将其设为 contiguous .
关于python - 在 PyTorch 中计算张量/外积空间中的线性层非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60025695/