# mypy: 允许未类型化定义
导入
火炬
导入 torch.ao.nn.intrinsic
导入 torch.ao.nn.intrinsic.qat
导入 torch.ao.nn.quantized
作为 nnq
导入 torch.nn.functional
作为 F
来自 torch.nn.utils
导入
熔合卷积批量归一化权重
__all__ = [
ConvReLU1d,
ConvReLU2d,
ConvReLU3d,
]
_reverse_repeat_padding = 氮气.
模块.conv._reverse_repeat_padding
将公共部分提取到 ConvNd 中
[文档]
类 ConvReLU1d(
氮气.
卷积 1D):
r""
ConvReLU1d 模块是 Conv1d 和 ReLU 的融合模块
我们采用与 :class:`torch.ao.nn.quantized.Conv1d` 相同的接口
属性:
与 torch.ao.nn.quantized.Conv1d 相同
```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)
```
浮点模块 =
火炬.ao.nn.
内在的.ConvReLU1d
# 类型:忽略[赋值]
定义
初始化(
自身,
输入通道,
输出通道,
核心大小,
步长=1,
填充=0,
扩展率=1,
群组=1,
偏置=True,
填充模式=
零,
设备=
无,
数据类型=
无,
):
超级().
初始化(
输入通道,
输出通道,
核心大小,
步长=
步长,
填充=
填充,
扩展率=
扩展率,
群组=
群组,
偏置=
偏置,
填充模式=
填充模式,
设备=
设备,
数据类型=
数据类型,
)
定义
前向(
自身,
输入):
由于 JIT 问题,暂时使用 len(shape)代替 ndim
https://github.com/pytorch/pytorch/issues/23890
如果
长度(
输入.shape) != 3:
抛出异常 ValueError(
"输入形状必须是 `(N, C, L)`!")
如果
自身.
填充模式 !=
零:
Conv1d 中的填充以(p, p)的形式存储,需要获取(p,)
反复填充反转两次 =
反向重复填充(
自身.
填充
[1])
输入 = F.
填充(
输入,
反转填充重复两次,
模式=
自身.
填充模式
)
返回
火炬.
操作.
量化.
卷积 1D_ReLU(
输入,
自身._packed_params,
自身.
比例,
自身.
零点
)
定义
_获取名称(
自身):
返回
"量化卷积 ReLU1d"
@classmethod
定义
从浮点数(
类, mod,
使用预计算的假量化=
错误):
如果
类型(mod) ==
火炬.ao.nn.
内在的.qat.ConvBnReLU1d:
断言 mod.bn.
运行变量
是 not None
和 mod.bn.
运行均值
是 not None
mod.重量, mod.
偏差 =
熔合卷积归一化权重(
mod.重量,
mod.偏置,
mod.bn.运行平均值,
mod.bn.运行变量,
mod.bn.eps,
mod.bn.重量,
mod.bn.偏置,
)
返回
超级().
从浮点数(mod,
使用预计算的假量化)
@classmethod
定义
来自参考(
类,
参考 qconv,
输出尺度,
输出零点):
断言 (
类型(
参考 qconv) !=
火炬.ao.nn.
内在的.ConvBnReLU1d
), "BatchNorm1d 应在转换为参考模块之前与 Conv1d 合并"
返回
超级().
来自参考(
参考 qconv[0
]
输出尺度,
输出零点)
[文档]
类 ConvReLU2d(
氮气.
卷积 2D):
r""
ConvReLU2d 模块是 Conv2d 和 ReLU 的融合模块
我们采用与 :class:`torch.ao.nn.quantized.Conv2d` 相同的接口。
属性:
与 torch.ao.nn.quantized.Conv2d 相同
```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)
```
浮点模块 =
火炬.ao.nn.
内在的.ConvReLU2d
# 类型:忽略[赋值]
定义
初始化(
自身,
输入通道,
输出通道,
核心大小,
步长=1,
填充=0,
扩展率=1,
群组=1,
偏置=True,
填充模式=
零,
设备=
无,
数据类型=
无,
):
超级().
初始化(
输入通道,
输出通道,
核心大小,
步长=
步长,
填充=
填充,
扩展率=
扩展率,
群组=
群组,
偏置=
偏置,
填充模式=
填充模式,
设备=
设备,
数据类型=
数据类型,
)
定义
前向(
自身,
输入):
由于 JIT 问题,暂时使用 len(shape)代替 ndim
https://github.com/pytorch/pytorch/issues/23890
如果
长度(
输入.shape) != 4:
抛出异常 ValueError(
"输入形状必须是 `(N, C, H, W)`!")
如果
自身.
填充模式 !=
零:
反复填充反转两次 =
反向重复填充(
自身.
填充)
输入 = F.
填充(
输入,
反转填充重复两次,
模式=
自身.
填充模式
)
返回
火炬.
操作.
量化.
卷积 2D-ReLU(
输入,
自身._packed_params,
自身.
比例,
自身.
零点
)
定义
_获取名称(
自身):
返回
量化卷积 ReLU2d
@classmethod
定义
从浮点数(
类, mod,
使用预计算的假量化=
错误):
如果
类型(mod) ==
火炬.ao.nn.
内在的.qat.ConvBnReLU2d:
断言 mod.bn.
运行变量
是 not None
和 mod.bn.
运行均值
是 not None
mod.重量, mod.
偏差 =
熔合卷积归一化权重(
mod.重量,
mod.偏置,
mod.bn.运行平均值,
mod.bn.运行变量,
mod.bn.eps,
mod.bn.重量,
mod.bn.偏置,
)
返回
超级().
从浮点数(
mod, 使用预计算的假量化=
使用预计算的假量化
)
@classmethod
定义
来自参考(
类,
参考 qconv,
输出尺度,
输出零点):
断言 (
类型(
参考 qconv) !=
火炬.ao.nn.
内在的.ConvBnReLU2d
), "BatchNorm2d 应在转换为参考模块之前与 Conv2d 合并"
返回
超级().
来自参考(
参考 qconv[0
]
输出尺度,
输出零点)
[文档]
类 ConvReLU3d(
氮气.
卷积 3D):
r""
ConvReLU3d 模块是 Conv3d 和 ReLU 的融合模块
我们采用与 :class:`torch.ao.nn.quantized.Conv3d` 相同的接口。
属性:与 torch.ao.nn.quantized.Conv3d 相同
```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)
```
浮点模块 =
火炬.ao.nn.
内禀的.ConvReLU3d
# 类型:忽略[赋值]
定义
初始化(
自身,
输入通道,
输出通道,
核心大小,
步长=1,
填充=0,
扩展率=1,
群组=1,
偏置=True,
填充模式=
零,
设备=
无,
数据类型=
无,
):
断言
填充模式 !=
反射,
"Conv3d 不支持反射填充"
超级().
初始化(
输入通道,
输出通道,
核心大小,
步长=
步长,
填充=
填充,
扩展率=
扩展率,
群组=
群组,
偏置=
偏置,
填充模式=
填充模式,
设备=
设备,
数据类型=
数据类型,
)
定义
前向(
自身,
输入):
由于 JIT 问题,暂时使用 len(shape)代替 ndim
https://github.com/pytorch/pytorch/issues/23890
如果
长度(
输入.shape) != 5:
抛出异常 ValueError(
"输入形状必须是`(N, C, D, H, W)`!")
如果
自身.
填充模式 !=
零:
反复填充反转两次 =
反向重复填充(
自身.
填充)
输入 = F.
填充(
输入,
反转填充重复两次,
模式=
自身.
填充模式
)
返回
火炬.
操作.
量化.conv3d_relu(
输入,
自身._packed_params,
自身.
比例,
自身.
零点
)
定义
_获取名称(
自身):
返回
量化卷积 ReLU3d
@classmethod
定义
从浮点数(
类, mod,
使用预计算的假量化=
错误):
如果
类型(mod) ==
火炬.ao.nn.
内禀的.qat.ConvBnReLU3d:
断言 mod.bn.
运行变量
是 not None
和 mod.bn.
运行均值
是 not None
mod.重量, mod.
偏差 =
熔合卷积归一化权重(
mod.重量,
mod.偏置,
mod.bn.运行平均值,
mod.bn.运行变量,
mod.bn.eps,
mod.bn.重量,
mod.bn.偏置,
)
返回
超级().
从浮点数(
mod, 使用预计算的假量化=
使用预计算的假量化
)
@classmethod
定义
来自参考(
类,
参考 qconv,
输出尺度,
输出零点):
断言 (
类型(
参考 qconv) !=
火炬.ao.nn.
内在的.ConvBnReLU3d
), "BatchNorm3d 应在转换为参考模块之前与 Conv3d 合并"
返回
超级().
来自参考(
参考 qconv[0
]
输出尺度,
输出零点)