通常,量化可能会造成轻微的精度损失,但对于某些网络(如 MobileNet),精度损失可能更大。在这种情况下,建议先尝试快速微调。如果快速微调不能产生令人满意的结果,量化感知训练 (QAT) 可以进一步提高量化模型的精度。
不过,使用 QAT API 训练模型有具体的要求。所有要量化的运算都必须是 torch.nn.Module
对象的实例,而不是 Torch 函数或 Python 运算符。例如,在 PyTorch 中使用
'+'
添加两个张量很常见,但 QAT 却不支持。请改为将 '+'
替换为 pytorch_nndct.nn.modules.functional.Add
。下表列出了需替换的运算。
运算 | 替换 |
---|---|
+
|
pytorch_nndct.nn.modules.functional.Add
|
-
|
pytorch_nndct.nn.modules.functional.Sub
|
torch.add
|
pytorch_nndct.nn.modules.functional.Add
|
torch.sub
|
pytorch_nndct.nn.modules.functional.Sub
|
重要: 在前传中由于量化信息冲突,无法多次调用要量化的模块。
在要量化的网络的头尾使用 pytorch_nndct.nn.QuantStub
和 pytorch_nndct.nn.DeQuantStub
。该网络可以是完整子网络,也可以是部分子网络。