【问题标题】:Pytorch broadcasting command not found找不到 Pytorch 广播命令
【发布时间】:2021-09-10 10:49:58
【问题描述】:

我的代码中有以下嵌套 for 循环段。嵌套循环正在减慢我的完整执行速度。

对于形状为[batchSize,nClass*repeat] 的火炬张量extended_output 和尺寸为[batchSize,nClass] 的另一个火炬张量,我希望聚合按如下方式进行:

for q in range(nClass):
    for u in range(repeat):
        output[:,q]=output[:,q]+extended_output[:,(q+u*nClass)]

这里,nClass,repeat 都是整数变量,值分别为 1400 和 8。

使用 pytorch 广播可以避免这种嵌套的 for 循环吗?任何帮助都会非常有用。

一个示例工作 cpode 可能是这样的

import torch
nClass=1400
repeat=8
batchSize=64
output=torch.zeros([batchSize,nClass])
extended_output=torch.rand([batchSize,nClass*repeat])

for q in range(nClass):
    for u in range(repeat):
        output[:,q]=output[:,q]+extended_output[:,(q+u*nClass)]

【问题讨论】:

标签: python numpy pytorch tensor array-broadcasting


【解决方案1】:

对于这个简短且可能过于简化的示例,我们深表歉意。我担心更大的会更难以想象。但我希望这适合你的目的。这就是我要做的:

import torch
nClass    = 3
repeat    = 2
batchSize = 4

torch.manual_seed(0)

output          = torch.zeros([batchSize,nClass])
extended_output = torch.rand([batchSize,nClass*repeat])


for q in range(nClass):
    for u in range(repeat):
        output[:,q]=output[:,q]+extended_output[:,(q+u*nClass)]

idxs = (torch.arange(repeat)*nClass).unsqueeze(0)
idxs = idxs + torch.arange(nClass).unsqueeze(1)
output_vectorized = extended_output[:, idxs].sum(2)

输出:

extended_output = 
tensor([[0.4963, 0.7682, 0.0885, 0.1320, 0.3074, 0.6341],
        [0.4901, 0.8964, 0.4556, 0.6323, 0.3489, 0.4017],
        [0.0223, 0.1689, 0.2939, 0.5185, 0.6977, 0.8000],
        [0.1610, 0.2823, 0.6816, 0.9152, 0.3971, 0.8742]])
output = 
tensor([[0.6283, 1.0756, 0.7226],
        [1.1224, 1.2453, 0.8573],
        [0.5408, 0.8665, 1.0939],
        [1.0762, 0.6794, 1.5558]])
output_vectorized = 
tensor([[0.6283, 1.0756, 0.7226],
        [1.1224, 1.2453, 0.8573],
        [0.5408, 0.8665, 1.0939],
        [1.0762, 0.6794, 1.5558]])

【讨论】:

  • 此解决方案不适用于 nClass = 43 repeat = 22 batchSize = 44 的其他组合
  • 想详细说明失败的原因和位置?
  • 你是对的。阵列之间似乎存在 2.4780e-12 的 L1 差异。我会试着调查一下
  • 好像是pytorch数值不稳定造成的。当您尝试使用循环或使用内置方法对“extended_output”中的所有元素求和时,您会遇到类似的错误。来试试吧
  • 这个现象非常有趣,我决定向question 询问。欢迎你去看看一些答案。
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 2023-04-04
  • 2020-05-01
  • 2021-01-17
  • 2021-09-12
  • 2021-03-24
  • 2020-05-31
  • 2021-01-13
相关资源
最近更新 更多