我想做一个 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
列的批处理input
,我可以在 PyTorch 中使用
(input.reshape(r,c,1) @ input.reshape(r,1,c)).reshape(r,c**2) @ weigts + b
我的问题是它非常慢。就像比添加完全连接的 c*c RELU 层慢 1000 倍和消耗更多内存的因子,即使它具有相同数量的权重。
我的问题是为什么会这样?
对于 PyTorch 来说,reshape
是一个非常昂贵的操作吗?我能不能用不同的方式重新制定它,使事情更有效率?
我知道的另一个等价公式是torch.diag(input @ weights @ input.T) + b
,但现在我们计算的值比我们需要的(r*r
(多得多,只是为了再次扔掉它们。
当您必须在模型的训练循环中重塑张量时,最好使用视图而不是重塑。视图似乎没有任何性能开销,但它确实要求张量数据是连续的。
如果开头的张量不连续,则可以重新复制张量并使其连续。
事实证明,PyTorch 有torch.bilinear
,它由 CUDA 备份,完全符合我的需求。这很整洁,而且非常快。它仍然留下了高阶张量的情况。我没有看到任何torch.trilinear
等等,但现在它很棒。