torch.ao.nn.qat.modules.linear 的源代码
# mypy: 允许未类型化定义
导入
火炬
导入 torch.nn
作为
然后
导入 torch.nn.functional
作为 F
来自 torch.ao.nn.intrinsic
导入
线性 ReLU
来自 torch.nn.utils.parametrize
导入 (
已参数化,
转移参数化和参数,
参数化前的类型,
)
__all__ = ["线性"]
[文档]
类
线性(nn.
线性):
r""
附带 FakeQuantize 模块的线性模块,
用于量化感知训练。
我们采用与 `torch.nn.Linear` 相同的接口,请参阅文档。
https://pytorch.org/docs/stable/nn.html#torch.nn.Linear
。
与 `torch.nn.Linear` 类似,FakeQuantize 模块已初始化为:
默认。
属性:
weight:权重 fake quant 模块
```python
# 假设输入文本为:
input_text = '"""'
# 翻译函数(此处仅为示例,实际翻译功能需要调用真实的翻译 API)
def translate_to_simplified_chinese(text):
# 这里应该调用真实的翻译 API 进行翻译
# 由于示例中不使用真实的 API,以下为模拟翻译结果
return text
# 输出翻译结果
translated_text = translate_to_simplified_chinese(input_text)
print(translated_text)
```
浮点模块 = nn.
线性
def 初始化(
自身,
输入特征,
输出特征,
偏差=True,
qconfig=无,
设备=
无,
数据类型=
无,
) -> 无:
工厂参数 = {
"设备":
设备, "dtype":
数据类型}
超级().
初始化(
输入特征,
输出特征,
偏差, **
工厂参数)
断言 qconfig,
"必须为 QAT 模块提供 qconfig"
自身.qconfig = qconfig
自身.weight_fake_quant = qconfig.
重量(
工厂参数=
工厂参数)
def 前向(
自身,
输入):
返回 F.
线性(
输入,
自身.
权重伪量化(
自身.
重量),
自身.
偏差)
[文档] @类方法
def from_float(cls, mod, use_precomputed_fake_quant=False):
r"""从浮点模块或 qparams_dict 创建 qat 模块
Args: `mod` 一个浮点模块,可以是 torch.ao.quantization 工具生成的
或直接由用户提供
"""
断言 type_before_parametrizations(mod) == cls._FLOAT_MODULE,
" qat."
+ cls.__name__
+ ".from_float 仅适用于 "
+ cls._FLOAT_MODULE.__name__
)
断言 hasattr(mod, "qconfig"), "输入浮点模块必须定义 qconfig"
断言 mod.qconfig,"输入浮点模块必须具有有效的 qconfig"
如果 type_before_parametrizations(mod) == LinearReLU:
mod = mod[0]
qconfig = mod.qconfig
qat_linear = cls(
mod.in_features,
mod.out_features,
bias=mod.bias is not None,
qconfig=qconfig,
)
如果模型 is_parametrized(mod, "weight"):
将模型 mod 的参数化和参数 transfer_parametrizations_and_params(qat_linear, "weight")
else:
qat_linear.weight = mod.weight
if is_parametrized(mod, "bias"):
transfer_parametrizations_and_params(mod, qat_linear, "bias")
else:
qat_linear.bias = mod.bias
return qat_linear
def 转换为浮点数(
自身):
线性 =
火炬.nn.
线性(
自身.
输入特征,
自身.
输出特征,
自身.bias
是 not None
)
线性.
权重 =
火炬.nn.
参数(
自身.
重量.detach())
如果
自身.bias
是 not
无:
线性.bias =
火炬.nn.
参数(
自身.
偏差.detach())
线性.
训练(
自身.
训练)
返回
线性