卷积层
在数学上,对于函数
f
f
f和
g
g
g,离散形式的卷积定义为
(
f
∗
g
)
(
n
)
=
∑
τ
=
−
∞
∞
f
(
τ
)
g
(
n
−
τ
)
,
(1)
(f*g)(n)=\sum_{\tau=-\infin}^{\infin}f(\tau)g(n-\tau), \tag 1
(f∗g)(n)=τ=−∞∑∞f(τ)g(n−τ),(1)
在卷积神经网络中,一般的卷积操作是在图像(或者说是一个矩阵)上的操作,卷积核(Kernel)
K
∈
R
r
×
r
K\in\mathbb{R}^{r\times r}
K∈Rr×r(
r
r
r一般是奇数)对图像
A
A
A的卷积运算表示为
A
′
(
x
,
y
)
=
∑
1
≤
i
≤
r
,
1
≤
j
≤
r
K
(
i
,
j
)
A
(
x
−
r
+
1
2
+
i
,
y
−
r
+
1
2
+
j
)
。
(2)
A'(x,y)=\sum\limits_{1\le i\le r, 1\le j\le r}{K(i,j)A(x-\frac{r+1}{2}+i,y-\frac{r+1}{2}+j)} 。 \tag 2
A′(x,y)=1≤i≤r,1≤j≤r∑K(i,j)A(x−2r+1+i,y−2r+1+j)。(2)
直观上来看,就是把卷积核的中心遍历
A
A
A的每个像素,在每个位置做一次矩阵的内积(对应分量相乘后求和),得到的结果就是输出图像对应像素的值。

很多地方会把卷积神经网络中的卷积的输入输出称为特征图(Feature Map) 。这是因为卷积运算可以提取图像的特征,和滤波(Filter) 相同,通过设置不同的卷积核的参数,可以实现图像的特征提取,例如平滑、模糊、边缘检测等。因此将多个卷积层叠加起来,通过神经网络学习的方法,就可以学习到图像想要的特征。
卷积运算有一些需要注意的变化:
- 步长(Stride) :卷积核沿着矩阵遍历的步长;
- 填充(Padding) :为了防止卷积运算后图像尺寸变小,往往根据卷积核的大小在图像周围进行填充;
- 膨胀(Dilation) :对卷积核进行膨胀,多出来的间隙用0填充,此操作可增大感受野;
对比之前学习的MLP可以发现,卷积运算的参数大大减少,仅有卷积核的参数(而卷积核一般比较小),所有的像素都是“参数共享”的,另外后一层的“神经元”(像素)只连接了前一层的一小部分“神经元”(而MLP是全连接),因此卷积运算得到的结果更关注图像的局部特征。
在实际使用中,卷积层(Convolution Layer) 常常会涉及到通道(Channel) 的概念。简而言之,输入通道数目决定了卷积核的“厚度”,卷积核的数目决定了输出通道数目。因此,如果输入通道数为 c i c_i ci,输出通道数(卷积核数目)为 c j c_j cj,卷积核大小为 r × r r\times r r×r,那么这个卷积层的参数数目为 c i × r × r × c j c_i\times r\times r \times c_j ci×r×r×cj 。
池化层、激活层
池化(Pooling) 实际上就是一种降采样,将输入切分为若干个子区域,每个区域计算一个值作为输出,这样可以使得图像的尺寸变小,它的作用主要有:
- 降维:减少计算量和参数数目,防止过拟合;
- 引入非线性:
- 扩大感受野:
- 实现不变性:
实际上我对Pooling的作用比较存疑,我的理解是这个操作删去了很多特征。
常见的池化操作有:平均、最大等。
激活层(Activation) 用于引入非线性因素,常见的有Sigmoid, Tanh, ReLU等。
卷积神经网络
卷积神经网络(Convolutional Neural Network, CNN) 的基本组成就是上面写到的各种层的叠加,对于分类任务通常会在最后Flatten一下,然后增加全连接层(Full Connection),然后得到一个输出概率向量。
CNN相比于MLP,更适合处理图像数据,它直接在图像上进行卷积提取特征,而如果展开成一维向量使用MLP则会损失空间信息。另外CNN的参数更少,更好地防止了过拟合的现象。
CNN的设计中,往往靠近输入层的Channel会比较少,往后会越来越多,这么做的目的是一开始先提取图片少量的宏观特征,然后后面再更加详细地提取局部特征。