torch.ao.quantization.stubs 的源代码
# mypy: 允许未类型化定义
from 火炬
导入
神经网络
[文档]类 QuantStub(nn.Module):
r"""量化占位模块,在校准之前,这与观察者相同,
在`convert`中将替换为`nnq.Quantize`。
Args:
qconfig:张量量化配置,
如果未提供 qconfig,我们将从父模块获取 qconfig
"""
def __init__(self, qconfig=None):
super().__init__()
if qconfig:
self.qconfig = qconfig
def forward(self, x):
return x
[docs]class DeQuantStub(nn.Module):
r"""Dequantize stub 模块,在校准之前,这与恒等映射相同,
这将在 `convert` 中被替换为 `nnq.DeQuantize`
Args:
qconfig:张量的量化配置,
如果未提供 qconfig,我们将从父模块获取 qconfig
"""
def __init__(self, qconfig=None):
super().__init__()
if qconfig:
self.qconfig = qconfig
def forward(self, x):
return x
[文档]class QuantWrapper(nn.Module):
这是一个包装输入模块的包装类,添加了 QuantStub 和 DeQuantStub,并将对模块的调用包围在量化和反量化模块的调用中。
这被`量化`实用函数用于添加量化和反量化。
模块。
这被`量化`实用函数用于添加量化和反量化功能。
dequant 模块,在`convert`函数之前,`QuantStub`只是一个观察者,
它观察输入张量,在`convert`之后,`QuantStub`
将被替换为`nnq.Quantize`,它执行实际的量化。同样地
对于`DeQuantStub`。
"源代码"
量级占位符
去量化占位符
神经网络模块
def __init__(self, 模块):
super().__init__()
qconfig = getattr(模块, "qconfig", None)
self.add_module("量化", QuantStub(qconfig)))
self.add_module("dequant", DeQuantStub(qconfig))
self.add_module("module", module)
self.train(module.training)
def forward(self, X):
X = self.quant(X)
X = self.module(X)
return self.dequant(X)