中文外贸网站有哪些,网站建设 技术团队介绍,idea网站开发,简述建设一个网站的具体步骤6本文详细解析了 PyTorch 中 torch.nn.Conv2d 的核心参数#xff0c;通过代码示例演示了如何利用这一基础函数实现多种卷积操作。涵盖的卷积类型包括#xff1a;标准卷积、逐点卷积#xff08;1x1 卷积#xff09;、非对称卷积#xff08;长宽不等的卷积核#xff09;、空…本文详细解析了 PyTorch 中 torch.nn.Conv2d 的核心参数通过代码示例演示了如何利用这一基础函数实现多种卷积操作。涵盖的卷积类型包括标准卷积、逐点卷积1x1 卷积、非对称卷积长宽不等的卷积核、空洞卷积扩大感受野、深度卷积逐通道滤波、组卷积分组独立处理、深度可分离卷积深度逐点组合、转置卷积上采样和动态卷积动态生成卷积核帮助读者理解如何通过调整参数灵活构建卷积层适应不同任务需求。 深度学习pytorch之22种损失函数数学公式和代码定义 深度学习pytorch之19种优化算法optimizer解析 深度学习pytorch之4种归一化方法Normalization原理公式解析和参数使用 深度学习pytorch之简单方法自定义多种卷积即插即用
基础函数torch.nn.Conv2d()
torch.nn.Conv2d()定义了一个用于量化的 2D 卷积层 Conv2d其继承自 _ConvNd 类专门用于处理量化输入信号。
class Conv2d(_ConvNd):def __init__(self, in_channels, out_channels, kernel_size, stride1,padding0, dilation1, groups1, biasTrue,padding_modezeros, deviceNone, dtypeNone):........def forward(self, input):.........
在使用其定义常用卷积前我们需要理解每一个参数的具体概念。
in_channels (int): 输入数据的通道数。比如在图像处理中对于彩色图像通常是 3RGB对于灰度图像通常是 1。out_channels (int): 输出数据的通道数即卷积操作后得到的特征图的深度。通过改变输出通道数可以改变卷积后的特征图的维度。kernel_size (int or tuple): 卷积核的大小。可以是一个整数表示卷积核是正方形的例如3 表示一个 3x3 的卷积核也可以是一个元组表示非正方形卷积核例如(3, 5) 表示卷积核的高度为 3宽度为 5。stride (int or tuple, default1): 卷积操作的步幅。表示卷积核在输入图像上滑动的步长。可以是一个整数表示水平和垂直方向的步幅相同也可以是一个元组表示水平和垂直方向的步幅不同例如(2, 1) 表示水平步幅为 2垂直步幅为 1。padding (int or tuple, default0): 填充Padding大小。填充是指在输入图像的边界加上额外的像素防止卷积操作减少图像的空间尺寸。可以是一个整数表示四个边的填充相同也可以是一个元组表示每个边的填充不同例如(2, 4) 表示上、下边的填充为 2左、右边的填充为 4。dilation (int or tuple, default1): 卷积核的膨胀因子。膨胀卷积是指在卷积核中插入“空洞”即卷积核的元素之间的距离增大。可以是一个整数表示膨胀因子在各个方向上相同也可以是一个元组表示膨胀因子在水平和垂直方向上不同。groups (int, default1): 卷积层的组数。groups 控制卷积核的分组方式。groups1 表示标准卷积groups 大于 1 时表示分组卷积。bias (bool, defaultTrue): 是否使用偏置项。如果为 True卷积层会学习偏置参数如果为 False卷积层没有偏置项。padding_mode (str, default‘zeros’): 填充模式。该参数控制如何填充输入图像的边界。仅支持 ‘zeros’ 模式即使用零填充。device (torch.device, optional): 用于指定模型所在的设备通常是 ‘cpu’ 或 ‘cuda’。dtype (torch.dtype, optional): 用于指定模型的张量数据类型。
接下来我们根据各类卷积的概念通过torch.nn.Conv2d()实现逐个定义。
1. 标准卷积Standard Convolution
标准卷积是最基本的卷积使用的是常规的卷积层没有分组和膨胀。
import torch
import torch.nn as nnclass StandardConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride1, padding0):super(StandardConv2d, self).__init__()self.conv nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)def forward(self, x):return self.conv(x)# 示例使用标准卷积
model_standard StandardConv2d(in_channels3, out_channels16, kernel_size3, stride1, padding1)
input_tensor torch.randn(1, 3, 64, 64) # 假设输入是 64x64 的 RGB 图像
output model_standard(input_tensor)
print(output.shape) # 输出大小
2. 逐点卷积Pointwise Convolution
逐点卷积是 1x1 卷积它的作用是对每个像素进行线性变换通常用于改变通道数如通道数的升降。
class PointwiseConv2d(nn.Module):def __init__(self, in_channels, out_channels):super(PointwiseConv2d, self).__init__()self.conv nn.Conv2d(in_channels, out_channels, kernel_size1, stride1)def forward(self, x):return self.conv(x)# 示例使用逐点卷积
model_pointwise PointwiseConv2d(in_channels3, out_channels16)
output_pointwise model_pointwise(input_tensor)
print(output_pointwise.shape) # 输出大小
3. 非对称卷积Asymmetric Convolution
非对称卷积指的是卷积核的长宽比不相等通常使用较长或较窄的卷积核。例如3x1 或 1x5 的卷积核。
class AsymmetricConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size(3, 1)):super(AsymmetricConv2d, self).__init__()self.conv nn.Conv2d(in_channels, out_channels, kernel_sizekernel_size, stride1, padding(kernel_size[0]//2, kernel_size[1]//2))def forward(self, x):return self.conv(x)# 示例使用非对称卷积
model_asymmetric AsymmetricConv2d(in_channels3, out_channels16, kernel_size(3, 1))
output_asymmetric model_asymmetric(input_tensor)
print(output_asymmetric.shape) # 输出大小
4. 空洞卷积Dilated Convolution
空洞卷积又叫扩展卷积、膨胀卷积通过在卷积核之间插入“空洞”来扩大感受野。通过设置 dilation 参数来实现。
class DilatedConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride1, padding1, dilation2):super(DilatedConv2d, self).__init__()self.conv nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, dilationdilation)def forward(self, x):return self.conv(x)# 示例使用扩展卷积
model_dilated DilatedConv2d(in_channels3, out_channels16, kernel_size3, stride1, padding2, dilation2)
output_dilated model_dilated(input_tensor)
print(output_dilated.shape) # 输出大小
5. 深度卷积Depthwise Convolution
深度卷积是每个输入通道单独进行卷积。它的特点是 groups 参数等于 in_channels。
class DepthwiseConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride1, padding0):super(DepthwiseConv2d, self).__init__()self.conv nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, groupsin_channels)def forward(self, x):return self.conv(x)# 示例使用深度卷积
model_depthwise DepthwiseConv2d(in_channels3, out_channels3, kernel_size3, stride1, padding1)
output_depthwise model_depthwise(input_tensor)
print(output_depthwise.shape) # 输出大小
6. 组卷积Group Convolution
组卷积是将输入通道划分为若干组每组使用不同的卷积核进行卷积。我们可以通过 groups 参数来设置。
class GroupConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride1, padding0, groups2):super(GroupConv2d, self).__init__()self.conv nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, groupsgroups)def forward(self, x):return self.conv(x)# 示例使用组卷积
model_group GroupConv2d(in_channels6, out_channels12, kernel_size3, stride1, padding1, groups3)
input_group torch.randn(1, 6, 64, 64) # 假设输入是 6 通道的图像
output_group model_group(input_group)
print(output_group.shape) # 输出大小
7. 深度可分离卷积Depthwise Pointwise Convolution
深度可分离卷积由深度卷积Depthwise Convolution和逐点卷积Pointwise Convolution组合而成。深度卷积负责捕捉空间信息逐点卷积用于改变通道数。
class SeparableConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size3, stride1, padding1):super(SeparableConv2d, self).__init__()self.depthwise_conv nn.Conv2d(in_channels, in_channels, kernel_size, stride, padding, groupsin_channels)self.pointwise_conv nn.Conv2d(in_channels, out_channels, kernel_size1)def forward(self, x):x self.depthwise_conv(x)x self.pointwise_conv(x)return x# 示例使用空间可分离卷积
model_separable SeparableConv2d(in_channels3, out_channels16, kernel_size3, stride1, padding1)
output_separable model_separable(input_tensor)
print(output_separable.shape) # 输出大小
8. 转置卷积Transpose Convolution
转置卷积也叫反卷积通常用于上采样。PyTorch 中使用 ConvTranspose2d 实现。
conv nn.ConvTranspose2d(64, 32, kernel_size4, stride2, padding1)9. 动态卷积Dynamic Convolution
动态卷积是根据输入或时间步动态生成卷积核。这意味着卷积核在处理过程中是根据输入数据进行变化的通常使用与输入张量的大小相关的方式来动态调整卷积核。
class DynamicConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size3):super(DynamicConv2d, self).__init__()self.in_channels in_channelsself.out_channels out_channelsself.kernel_size kernel_sizedef forward(self, x):batch_size, _, height, width x.size()# 根据输入动态生成卷积核例如使用全连接层生成卷积核weight torch.randn(batch_size, self.out_channels, self.in_channels, self.kernel_size, self.kernel_size).to(x.device)return torch.nn.functional.conv2d(x, weight, paddingself.kernel_size//2)# 示例使用动态卷积
model_dynamic DynamicConv2d(in_channels3, out_channels16, kernel_size3)
output_dynamic model_dynamic(input_tensor)
print(output_dynamic.shape) # 输出大小