python - Pytorch 量化运行时错误:尝试创建具有负维度的张量
问题描述
我正在尝试 pytorch 量化模块。在进行静态训练后量化时,我遵循文档中详述的下一个过程:
- 添加 QuantStub 和 DeQuantStub 模块
- 保险丝操作
- 指定量化配置
- torch.quantization.prepare()
- 通过对校准数据集运行推理来校准模型
- 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)
直到现在我还不能解决这个错误。
提前致谢
解决方案
对于任何有同样问题的人。
解决方案在 pytorch 量化文档中的这一行:
基于视图的操作,如 view()、as_strided()、expand()、flatten()、select()、python 风格的索引等 - 与常规张量一样工作(如果量化不是每个通道)
问题在于使用reshape
和执行每通道量化。如果我mean
对最后两个通道进行处理,则没有问题。
推荐阅读
- react-native - 从三个不同的 TextInput 中捕获日期
- stripe-payments - 条纹支付费用
- google-earth-engine - Google Earth Engine 中的 SVM 分类错误
- javascript - 将 Jquery 导航功能翻译成 javascript?
- ios - 在反应本机应用程序中的 info.plist 中具有应用程序传输安全设置的目的是什么
- c++ - 在 c++ 中对类中的动态 c 字符串数组进行排序的最佳方法是什么?
- sql - 为什么这个 SQL/DDL 违反了错误的完整性约束?
- rhel - sshd 经常宕机
- c# - 如果基于 webapi 令牌的身份验证达到其过期时间,如何从 ASP.NET Web 应用程序注销
- mongodb - mongodb条件聚合中的substr