对nn.Conv2d中参数详解

在 PyTorch 中,nn.Conv2d 是一个常用的二维卷积层,用于处理图像等二维数据。下面是对其参数的详细介绍:


定义

torch.nn.Conv2d(
    in_channels, 
    out_channels, 
    kernel_size, 
    stride=1, 
    padding=0, 
    dilation=1, 
    groups=1, 
    bias=True, 
    padding_mode='zeros'
)

参数详解

1. in_channels
  • 含义:输入特征图的通道数。
  • 解释:如果输入数据是 RGB 图像,in_channels 通常为 3;如果是灰度图像,则为 1。
  • 示例
    • RGB 图像输入:in_channels=3
    • 单通道灰度图输入:in_channels=1

2. out_channels
  • 含义:卷积操作输出特征图的通道数。
  • 解释:通过卷积核的数量控制输出的通道数。通常越多的通道数可以捕捉到更多特征。
  • 示例
    • 如果设置 out_channels=64,卷积层会生成 64 个特征图。

3. kernel_size
  • 含义:卷积核的大小。
  • 类型
    • 单个整数:表示卷积核的宽和高相同,例如 kernel_size=3 表示卷积核大小为 3x3
    • 元组 (height, width):表示卷积核的高度和宽度分别为指定值,例如 kernel_size=(3, 5)
  • 示例
    • kernel_size=3 表示 3x3 卷积核。
    • kernel_size=(3, 5) 表示 3 高 x 5 宽的卷积核。

4. stride
  • 含义:步幅,卷积核在输入特征图上滑动的步长。
  • 默认值1
  • 类型
    • 单个整数:表示行和列的步幅相同,例如 stride=2
    • 元组 (stride_height, stride_width):分别指定行和列的步幅。
  • 作用:增大步幅会减小输出特征图的尺寸。
  • 示例
    • stride=1:卷积核每次移动 1 个像素。
    • stride=2:卷积核每次移动 2 个像素。

5. padding
  • 含义:填充,控制在输入特征图周围填充的像素数。
  • 默认值0
  • 类型
    • 单个整数:所有方向填充相同的像素,例如 padding=1
    • 元组 (pad_height, pad_width):指定高度和宽度方向的填充。
    • 字符串 'same':自动计算填充以保证输出特征图大小不变。
  • 作用
    • 防止特征图尺寸过快减小。
    • 保留边缘信息。
  • 示例
    • padding=1:在特征图每边添加 1 个像素。
    • padding='same':特征图输出尺寸与输入尺寸相同。

6. dilation
  • 含义:扩张卷积,控制卷积核元素之间的间隔。
  • 默认值1
  • 作用:增大感受野(视野)而不增加参数。
  • 示例
    • dilation=1:普通卷积。
    • dilation=2:卷积核元素间隔 1 个像素,相当于感受野增大为普通卷积的 2 倍。

7. groups
  • 含义:将输入通道分成若干组,每组使用独立的卷积核。
  • 默认值1
  • 作用
    • groups=1:普通卷积,所有通道共享一个卷积核组。
    • groups=in_channels:每个输入通道使用单独的卷积核(深度卷积,常用于 MobileNet 等轻量模型)。
  • 示例
    • groups=1:标准卷积。
    • groups=2:将输入通道分成 2 组,每组单独卷积。

8. bias
  • 含义:是否为卷积操作添加偏置项。
  • 默认值True
  • 作用:如果设置为 False,则不会有偏置参数(通常在有 BatchNorm 层时可以省略偏置)。
  • 示例
    • bias=True:包含偏置项。
    • bias=False:不包含偏置项。

9. padding_mode
  • 含义:控制填充的方式。
  • 默认值'zeros'
  • 可选值
    • 'zeros':用零填充(默认)。
    • 'reflect':使用输入的镜像值填充。
    • 'replicate':使用输入边界值填充。
    • 'circular':使用循环填充。
  • 示例
    • padding_mode='zeros':在输入边界填充零。
    • padding_mode='reflect':在输入边界进行镜像填充。

计算输出特征图大小

输出的宽度和高度可通过公式计算:


示例代码

import torch
import torch.nn as nn

# 定义卷积层
conv = nn.Conv2d(
    in_channels=3, 
    out_channels=6, 
    kernel_size=3, 
    stride=1, 
    padding=1, 
    bias=True
)

# 输入张量 (N, C, H, W) = (1, 3, 32, 32)
x = torch.rand(1, 3, 32, 32)

# 前向传播
output = conv(x)

print("输入形状:", x.shape)
print("输出形状:", output.shape)

### PyTorch `nn.Conv2d` 中 `dilation` 参数详解 在 PyTorch 的 `nn.Conv2d()` 函数中,`dilation` 参数用于控制卷积核之间的间距。当 `dilation=1` 时,相邻的两个卷积核元素之间没有间隔;而当设置更大的 `dilation` 值时,则会在卷积核元素间插入额外的空间[^1]。 具体来说,在二维卷积操作中,如果 `dilation=d`,那么原本大小为 \(k \times k\) 的卷积核会扩展成一个较大的区域来计算加权和,但实际参与运算的有效位置仍然是原来的 \(k \times k\) 个点。这种机制可以扩大感受野而不增加参数数量或降低分辨率[^2]。 下面通过一段简单的 Python 代码展示不同 `dilation` 设置下卷积层的行为: ```python import torch import torch.nn as nn # 创建具有不同扩张率的卷积层实例 conv_dilated_1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=1, dilation=1, bias=False) conv_dilated_2 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=2, dilation=2, bias=False) # 构建随机输入张量 input_tensor = torch.randn((1, 3, 8, 8)) # 应用两种不同的卷积并打印输出尺寸 output_with_dilation_1 = conv_dilated_1(input_tensor) print(f"Dilation=1 输出形状: {output_with_dilation_1.size()}") output_with_dilation_2 = conv_dilated_2(input_tensor) print(f"Dilation=2 输出形状: {output_with_dilation_2.size()}") ``` 上述例子展示了如何创建带有不同膨胀因子 (`dilation`) 的卷积层,并观察其对输出特征图的影响。注意这里为了保持输出尺寸一致,对于较大膨胀系数的情况适当调整了填充(`padding`)值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值