内容节选自《神经网络与深度学习》电子版:https://nndl.github.io/
对于一个卷积层,如果希望增加输出单元的感受野,一般可以通过三种方式 实现:
1)增加卷积核的大小;
2)增加层数,比如两层3×3的卷积可以近似一层5×5 卷积的效果;
3)在卷积之前进行汇聚操作。
前两种方式会增加参数数量,而 第三种方式会丢失一些信息。
空洞卷积(Atrous Convolution)是一种不增加参数数量同时增加输出单元感受野的一种方法,也称为膨胀卷积(Dilated Convolution)。 空洞卷积通过给卷积核插入“空洞”来变相地增加其大小。
如果在卷积核的每两个元素之间插入𝐷−1个空洞,卷积核的有效大小为
𝐾′=𝐾+(𝐾−1)×(𝐷−1)
其中𝐷称为膨胀率(DilationRate),当𝐷=1时卷积核为普通的卷积核。
D=2时,K' = 3+(3-1)*(2-1) = 5
D=3时,K' = 3+(3-1)*(3-1) = 7
代码
torch.nn.Conv2d ( in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1,
groups=1, bias=True, padding_mode='zeros')
in_channels(int) – 输入信号的通道。
out_channels(int) – 卷积产生的通道。
kerner_size(int or tuple) - 卷积核的尺寸,卷积核的大小为(k,),第二个维度是由in_channels来决定的,所以实际上卷积大小为kerner_size*in_channels
stride(int or tuple, optional) -卷积步长
padding (int or tuple, optional)- 输入的每一条边补充0的层数
dilation(int or tuple, `optional``) – 卷积核元素之间的间距
groups(int, optional) – 从输入通道到输出通道的阻塞连接数
bias(bool, optional) - 如果bias=True,添加偏置
conv1 = nn.Conv2d(1, 1, 3, stride=1, bias=False, dilation=1) # 普通卷积
conv2 = nn.Conv2d(1, 1, 3, stride=1, bias=False, dilation=2) # dilation就是空洞率,即间隔
ps:如果希望卷积后大小跟原来一样,需要设置padding = (kerner_size - 1) / 2 if stride = 1 (步长为1前提下)