一、卷积层
卷积层(Convolution Layer):主要用来提取数据特征。
PyTorch提供了多种卷积层,其中二维卷积层(nn.Conv2d
)在计算机视觉中得到广泛的应用。
二、参数
1. 二维卷积层(nn.Conv2d)参数
参数详解
in_channels (int)
:输入通道数,例如:灰度图像为1,RGB彩色图像为3;out_channels (int)
:输出通道数;kernel_size (int or tuple)
:卷积核大小。如3x3,5x5;stride (int or tuple, optional)
:步长,默认值为1;padding (int, tuple or str, optional)
:填充,默认值为0;dilation (int or tuple, optional)
:膨胀率,默认值为1;groups (int, optional)
:分组数,默认值为1;bias (bool, optional)
:偏置,默认值为True;padding_mode (str, optional)
:填充模式,默认是zero填充;
2. 举个例子
- 对一张32x32的彩色图片做一次卷积:
import torch
import torch.nn as nn
# 定义卷积层
conv = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3) # 输入通道数为3,输出通道数为6,卷积核大小为3x3
# 输入张量tensor (N, Cin, Hin, Win)
input = torch.rand(1, 3, 32, 32) # 输入通道数为3,图片大小为32x32
# 输出张量tensor (N, Cout, Hout, Wout)
output = conv(input)
# 打印输入和输出的形状
print("输入形状:", input.shape)
print("输出形状:", output.shape)
- 打印输出结果:
输入形状: torch.Size([1, 3, 32, 32])
输出形状: torch.Size([1, 6, 30, 30])
3. 代码解释
输入一个是(1,3,32,32)
的张量,经过Conv2d(3,6,3)
卷积后,输出变成一个(1,6,30,30)
的张量。
ps: 注意图中,Channel数目的变化和图片形状大小(h, w)的变化。
卷积后数据维度计算方法:
input.shape
= ( N = 1, Cin = 3, Hin = 32, Win = 32 )Conv2d
(in_channels=3
,out_channels=6
,kernel_size=3
)output.shape
= ( N = 1, Cout = 6, Hout= 30, Wout = 30 )- Cout = 6: 取自于
Conv2d
的out_channels=6
- Hout = 30 和 Wout = 30:通过下面计算公式得到:
- Hout = ⌊ H i n + 2 × p a d d i n g [ 0 ] − d i l a t i o n [ 0 ] × ( k e r n e l _ s i z e [ 0 ] − 1 ) − 1 s t r i d e [ 0 ] + 1 ⌋ \left \lfloor \frac{H_{in}+2 \times padding[0]-dilation[0] \times (kernel\_size[0]-1)-1}{stride[0]} +1\right \rfloor ⌊stride[0]Hin+2×padding[0]−dilation[0]×(kernel_size[0]−1)−1+1⌋
- Wout = ⌊ W i n + 2 × p a d d i n g [ 1 ] − d i l a t i o n [ 1 ] × ( k e r n e l _ s i z e [ 1 ] − 1 ) − 1 s t r i d e [ 1 ] + 1 ⌋ \left \lfloor \frac{W_{in}+2 \times padding[1]-dilation[1] \times (kernel\_size[1]-1)-1}{stride[1]} +1\right \rfloor ⌊stride[1]Win+2×padding[1]−dilation[1]×(kernel_size[1]−1)−1+1⌋
- Cout = 6: 取自于
刚开始,看到公式时候,头就大。静下心来,代入值,化简后,其实很简单。
以 Hout 为例:
- Hout = ⌊ H i n + 2 × p a d d i n g [ 0 ] − d i l a t i o n [ 0 ] × ( k e r n e l _ s i z e [ 0 ] − 1 ) − 1 s t r i d e [ 0 ] + 1 ⌋ \left \lfloor \frac{H_{in}+2 \times padding[0]-dilation[0] \times (kernel\_size[0]-1)-1}{stride[0]} +1\right \rfloor ⌊stride[0]Hin+2×padding[0]−dilation[0]×(kernel_size[0]−1)−1+1⌋
其中:
- padding:默认值为0;
- dilation:默认值为1;
- stride:默认值为1;
化简后,
- Hout = ⌊ H i n − k e r n e l _ s i z e [ 0 ] 1 + 1 ⌋ \left \lfloor \frac{H_{in} - kernel\_size[0]}{1} + 1\right \rfloor ⌊1Hin−kernel_size[0]+1⌋ = ⌊ 32 − 3 1 + 1 ⌋ \left \lfloor \frac{32 - 3}{1} + 1\right \rfloor ⌊132−3+1⌋ = ⌊ 32 − 3 + 1 ⌋ \left \lfloor 32 - 3 + 1 \right \rfloor ⌊32−3+1⌋ = 30
同样,化简 Wout 后:
- Wout = ⌊ W i n − k e r n e l _ s i z e [ 1 ] 1 + 1 ⌋ \left \lfloor \frac{W_{in} - kernel\_size[1]}{1} + 1\right \rfloor ⌊1Win−kernel_size[1]+1⌋ = ⌊ 32 − 3 1 + 1 ⌋ \left \lfloor \frac{32 - 3}{1} + 1\right \rfloor ⌊132−3+1⌋ = ⌊ 32 − 3 + 1 ⌋ \left \lfloor 32 - 3 + 1 \right \rfloor ⌊32−3+1⌋ = 30
4. 总结
简单的理解计算公式就是:
- 在其他参数为默认值情况下: 输出图片大小 = (输入图片大小 − 卷积核大小) 步长 + 1 输出图片大小 = \frac{( 输入图片大小 - 卷积核大小)} {步长} + 1 输出图片大小=步长(输入图片大小−卷积核大小)+1
三、参考
- 链接: PyTorch: torch.nn.Conv2d
- 【附】卷积层Conv2d参数:
- 【附】卷积层Shape计算公式: