首页 > 解决方案 > Pytorch 量化运行时错误:尝试创建具有负维度的张量

问题描述

我正在尝试 pytorch 量化模块。在进行静态训练后量化时,我遵循文档中详述的下一个过程:

  1. 添加 QuantStub 和 DeQuantStub 模块
  2. 保险丝操作
  3. 指定量化配置
  4. torch.quantization.prepare()
  5. 通过对校准数据集运行推理来校准模型
  6. torch.quantization.convert()

但是,在准备模型后校准模型时,程序会中断。

错误出现在最后一个全连接层。似乎图中引入的观察者正在尝试创建负维度的直方图。

这是错误:

    x = self.fc(x)
  File "/home/juan/miniconda3/envs/sparse/lib/python3.6/site-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/juan/miniconda3/envs/sparse/lib/python3.6/site-packages/torch/nn/modules/container.py", line 100, in forward
    input = module(input)
  File "/home/juan/miniconda3/envs/sparse/lib/python3.6/site-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/juan/miniconda3/envs/sparse/lib/python3.6/site-packages/torch/nn/modules/container.py", line 100, in forward
    input = module(input)
  File "/home/juan/miniconda3/envs/sparse/lib/python3.6/site-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/juan/miniconda3/envs/sparse/lib/python3.6/site-packages/torch/nn/modules/container.py", line 100, in forward
    input = module(input)
  File "/home/juan/miniconda3/envs/sparse/lib/python3.6/site-packages/torch/nn/modules/module.py", line 552, in __call__
    hook_result = hook(self, input, result)
  File "/home/juan/miniconda3/envs/sparse/lib/python3.6/site-packages/torch/quantization/quantize.py", line 74, in _observer_forward_hook
    return self.activation_post_process(output)
  File "/home/juan/miniconda3/envs/sparse/lib/python3.6/site-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/juan/miniconda3/envs/sparse/lib/python3.6/site-packages/torch/quantization/observer.py", line 805, in forward
    self.bins)
  File "/home/juan/miniconda3/envs/sparse/lib/python3.6/site-packages/torch/quantization/observer.py", line 761, in _combine_histograms
    histogram_with_output_range = torch.zeros((Nbins * downsample_rate))
RuntimeError: Trying to create tensor with negative dimension -4398046511104: [-4398046511104]

完全连接的构建为

class LinearReLU(nn.Sequential):
    def __init__(self, in_neurons, out_neurons):
        super(LinearReLU, self).__init__(
            nn.Linear(in_neurons, out_neurons),
            nn.ReLU(inplace=False)
        )

它们附加在fc(x)as 中fc = nn.Sequential(*([LinearReLU, LinearReLU, ...])

但是,我怀疑这与卷积层和全连接层之间的重塑有关。

x = x.reshape(-1, size)

直到现在我还不能解决这个错误。

提前致谢

标签: pythonpytorch

解决方案


对于任何有同样问题的人。

解决方案在 pytorch 量化文档中的这一行:

基于视图的操作,如 view()、as_strided()、expand()、flatten()、select()、python 风格的索引等 - 与常规张量一样工作(如果量化不是每个通道)

问题在于使用reshape和执行每通道量化。如果我mean对最后两个通道进行处理,则没有问题。


推荐阅读