1. 简介
CNN 是专门用于处理网格化数据的神经网络。CNN 中新增了 Convolution 层和 Pooling 层,CNN 的层的连接顺序是「Convolution-ReLU-(Pooling)」(Pooling层有时会被省略)。这可以理解为之前的“Affine-ReLU”连接被替换成了「Convolution-ReLU-(Pooling)」连接。
2. CNN 的优势
- 全连接层(Affine 层)忽略了数据的形状。比如,输入数据是图像时,图像通常是高、长、通道方向上的 3 维形状。但是,向全连接层输入时,需要将 3 维数据拉平为 1 维数据。
图像是 3 维形状,这个形状中应该含有重要的空间信息。比如,空间上邻近的像素为相似的值、 RBG 的各个通道之间分别有密切的关联性、相距较远的像素之间没有什么关联等, 3维形状中可能隐藏有值得提取的本质模式。
- 而卷积层可以保持形状不变。当输入数据是图像时,卷积层会以3维数据的形式接收输入数据,并同样以3维数据的形式输出至下一层。因此,在CNN中,可以(有可能)正确理解图像等具有形状的数据。
【注】把 3 维数据表示为多维数组时,书写顺序为(channel, height, width)。作为 4 维数据,滤波器的权重数据要按(output_channel, input_channel, height, width)的顺序书写。
3. 术语
- 特征图(feature map):卷积层的输入输出数据。输入数据称为输入特征图,输出数据称为输出特征图。
使用填充主要是为了调整输出的大小(防止每次进行卷积运算后空间缩小以至最终空间缩小为 1 ),可以在保持空间大小不变的情况下将数据传给下一层。
- 步幅(stride):应用滤波器的位置间隔称为步幅。
【注】增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。
设输入大小为 (H,W),滤波器大小为 (FH,FW),输出大小为 (OH,OW),填充为 P,步幅为 S,则有如下等式:
OH=SH+2P−FH+1OW=SW+2P−FW+1
- 池化(pooling):(也称为汇聚)池化是缩小高、长方向上的空间的运算。一般来说,池化的窗口大小会和步幅设定成相同的值。池化是指对每个区域进行下采样(Down Sampling)得到一个值,作为这个区域的概括。
常见池化方法
- Max 池化
- Average 池化
4. 卷积层
4.1 一维卷积
假设信号发生器每个时刻 t 产生一个信号 xt,齐信息的衰减率为 wk,即在 k−1 个时间步长后,信息为原来的 wk 倍。则在 t 时刻接收到的信号 yt 为当前时刻产生的信息和以前时刻延迟信息的叠加:
yt=∑k=1Kwkxt−k+1
记作
y=w∗x
其中,∗ 表示卷积操作,把 w1,w2,⋯,wK 称作滤波器或卷积核。
4.2 二维卷积
给定一个图像 X∈RM×N 和一个滤波器 W∈WU×V(一般 U≪M,V≪N),其卷积为
yij=∑u=1U∑v=1Vwuvxi−u+1,j−v+1
记作
Y=W∗X
4.3 互相关
互相关和卷积的区别仅仅在于卷积核是否进行翻转,互相关公式为:
yij=∑u=1U∑v=1Vwuvxi+u−1,j+v−1
记作
Y=W⊗X=rotate180∘(W)∗X
-
在神经网络中使用卷积是为了进行特征抽取,卷积核是否进行翻转和其特征抽取的能力无关。
-
特别是当卷积核是可学习的参数时,卷积和互相关在能力上是等价的。
-
在具体实现上,一般会以互相关操作来代替卷积,从而会减少一些不必要的操作或开销。
4.4 常用卷积
-
窄卷积:S=1,P=0,卷积后输出长度为 M−K+1。
-
宽卷积:S=1,P=K−1,卷积后输出长度为 M+K−1。宽卷积运算符号为:⊗~。
-
等宽卷积:S=1,P=(K−1)/2,卷积后输出长度为 M。
4.5 导数
假设 Y=W⊗X,其中 X∈RM×N,W∈RU×V,Y∈R(M−U+1)×(N−V+1),函数 f(Y)∈R 为一个标量函数,则:
∂W∂f(Y)=∂Y∂f(Y)⊗X∂X∂f(Y)=rotate180∘(W)⊗~∂Y∂f(Y)
5. 反卷积(转置卷积)层
卷积操作用来实现高维特征到低维特征的转换,而反卷积(转置卷积)用来将低维特征映射到高维特征。
5.1 转置关系
对于一个高维向量 x∈Rd 和一个低维向量 z∈Rp,其中 p<d。如果用仿射变换实现高维到低维的映射:
z=Wx
其中,W∈Rp×d 为转换矩阵。则可以通过转置 W 来实现低维到高维的反向映射:
x=WTz
这两个映射之间不是逆关系,只是形式上的转置关系。
【注】在全连接网络中,忽略激活函数,前向计算和反向传播就是一种转置关系。
z(l+1)=W(l+1)z(l)
δ(l)=(W(l+1))Tδ(l+1)
5.2 反卷积(转置卷积)
对于输入为 (Hin,Win),步长为 stride,填充为 padding,卷积核大小为 kernel_size,输出补偿填充为 output_padding,转置卷积输出的结果为:
Hout=(Hin−1)stride[0]−2padding[0]+kernel_size[0]+output_padding[0]
Wout=(Win−1)stride[1]−2padding[1]+kernel_size[1]+output_padding[1]
6. 池化层
池化层有以下特征:
- 没有要学习的参数
- 通道数不发生变化
- 对微小的位置变化具有鲁棒性(健壮)