卷积层是卷积神经网络的核心组成部分。它模仿生物视觉系统的视网膜,能够提取输入图片的空间特征。
基础
定义
卷积层由一个或多个卷积核组成,每个卷积核实质上就是一个小的滤波器,其尺寸一般较小,如 3x3
或 5x5
。在训练过程中,卷积核中的参数会不断更新,以便提取不同的特征。
在卷积过程中,卷积核在输入特征图上滑动,计算输入数据和卷积核对应位置的值的内积。这个内积运算相当于卷积核对输入进行加权和,得到的输出结果组成一个特征映射(feature map)。
重复这个滑动窗口的卷积过程,就可以在输入特征图中提取出不同位置的特征,构成卷积层的输出特征图。卷积层通常会有多个卷积核,因此会输出多个特征图。
关键参数
卷积层的一些关键参数:
- 卷积核大小:决定了视野范围,不同大小能提取不同尺度的特征。
- 卷积核数量:决定输出特征图的通道数。
- 卷积步长:控制滑动窗口移动的步长,一般为1或2。
- 填充(Padding):在输入边界填充0,控制输出特征图的大小。
- 池化:一般在卷积层后使用池化层进行下采样,减小数据量和计算量。
通道
卷积层中的通道(channel)表示特征图的数量,它有以下几层含义:
- 输入通道数(in_channels):输入数据中包含的通道数。例如 RGB 图像有3个通道,灰度图像有1个通道。
- 输出通道数(out_channels):卷积层输出的数据中含有的通道数。这个数值等于卷积核的数量。
- 卷积核的通道数(kernel_channels):每个卷积核的通道数需要与输入数据的通道数匹配。例如输入数据为 RGB 图像,那么每个卷积核的通道数也设置为3。
- 输出通道数和卷积核通道数的关系:输出通道数=卷积核的数量。每个卷积核生成一张特征图,所以卷积核的数量决定输出的通道数。
单通道卷积
以单通道卷积为例,输入为 (1, 5, 5)
,分别表示1个通道,宽为5,高为5。假设卷积核大小为 3x3
,padding=0
,stride=1
。
卷积过程如下:
相应的卷积核不断的在图像上进行遍历,最后得到 3x3
的卷积结果,结果如下:
多通道卷积1
以彩色图像为例,包含三个通道,分别表示 RGB 三原色的像素值,输入为 (3, 5, 5),分别表示3个通道,每个通道的宽为5,高为5。假设卷积核只有1个,卷积核通道为3,每个通道的卷积核大小仍为 3x3,padding=0,stride=1。
卷积过程如下,每一个通道的像素值与对应的卷积核通道的数值进行卷积,因此每一个通道会对应一个输出卷积结果,三个卷积结果对应位置累加求和,得到最终的卷积结果。
上述过程中,每一个卷积核的通道数量,必须要求与输入通道数量一致,因为要对每一个通道的像素值要进行卷积运算,所以每一个卷积核的通道数量必须要与输入通道数量保持一致。
我们把上述图像通道如果放在一块,计算原理过程还是与上面一样,堆叠后的表示如下:
多通道卷积2
在上面的多通道卷积1中,输出的卷积结果只有1个通道,把整个卷积的整个过程抽象表示,过程如下:
即:由于只有一个卷积核,因此卷积后只输出单通道的卷积结果(黄色的块状部分表示一个卷积核,黄色块状是由三个通道堆叠在一起表示的,每一个黄色通道与输入卷积通道分别进行卷积,也就是 channel 数量要保持一致,图片组这里只是堆叠放在一起表示而已)。
那么,如果要卷积后也输出多通道,增加卷积核(filers)的数量即可,示意图如下:
代码示例
pytorch 代码示例
下面示例代码,整个过程实现如下:
- 输入1张3通道28x28图像。
- 进行5x5卷积操作,卷积核通道数为6。
- 得到输出数据,包含6张24x24特征图。
import torch
import torch.nn as nn
in_channels = 3 # 输入通道数量
out_channels = 6 # 输出通道数量
width = 28 # 每个输入通道上的卷积尺寸的宽
height = 28 # 每个输入通道上的卷积尺寸的高
kernel_size = 5 # 每个输入通道上的卷积尺寸
batch_size = 1 # 批数量
# 定义输入数据,一张28x28的3通道图像
ipt = torch.randn(batch_size, in_channels, width, height)
print(ipt)
# 定义卷积层
conv = nn.Conv2d(in_channels, out_channels, kernel_size)
# 进行卷积操作
# 输入数据 ipt 经过卷积层 conv,生成输出数据 output
output = conv(ipt)
# output大小为(1, 6, 24, 24)
# 说明:
# (1)input通道数为3,卷积层conv通道数为6,所以output通道数为6
# (2)input大小为28x28,kernel大小为5,所以输出大小为(28-5+1) x (28-5+1) = 24 x 24
# 以上推导遵循卷积操作的计算公式:
# output_height = (input_height - kernel_height + 2*padding)/stride + 1
# output_width = (input_width - kernel_width + 2*padding)/stride + 1
# 访问输出数据
print(output.size()) # torch.Size([1, 6, 24, 24])
总结
综上,卷积层通过卷积核提取图片空间信息,然后经过池化采样得到稳定 translation-invariant 的特征,进而构建强大的卷积神经网络模型。