torch.ao.nn.intrinsic.qat.modules.linear_relu 的源代码
# mypy: 允许未类型化定义
导入
火炬
导入 torch.ao.nn.intrinsic
作为 nni
导入 torch.ao.nn.qat
作为 nnqat
导入 torch.nn.functional
作为 F
[文档]class LinearReLU(nnqat.Linear, nni._FusedModule):
r"""
一个由线性模块和 ReLU 模块融合而成的线性 ReLU 模块,附加
权重使用的 FakeQuantize 模块
量化感知训练。
我们采用与 :class:`torch.nn.Linear` 相同的接口。
与 `torch.ao.nn.intrinsic.LinearReLU` 类似,FakeQuantize 模块已初始化为。
默认。
属性:
重量:权重伪量化模块
示例::
>>> # xdoctest: +SKIP
>>> m = nn.qat.LinearReLU(20, 30)
>>> input = torch.randn(128, 20)
>>> output = m(input)
>>> print(output.size())
torch.Size([128, 30])
"""
_FLOAT_MODULE = nni.LinearReLU # type: ignore[assignment]
def __init__(self, in_features, out_features, bias=True, qconfig=None):
super().__init__(in_features, out_features, bias, qconfig)
def forward(self, input):
return F.relu(F.linear(input, self.weight_fake_quant(self.weight), self.bias))
@classmethod
def from_float(cls, mod, use_precomputed_fake_quant=False):
return super().from_float(mod, use_precomputed_fake_quant)
def to_float(self):
linear = torch.nn.Linear(
self.in_features, self.out_features, self.bias 是否为 None
)
linear.weight = torch.nn.Parameter(self.weight.detach())
if self.bias 不是 None:
linear.bias = torch.nn.Parameter(self.bias.detach())
relu = torch.nn.ReLU()
return torch.ao.nn.intrinsic.LinearReLU(linear, relu)