卷积神经网络(CNN)

卷积层

在数学上,对于函数 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 (fg)(n)=τ=f(τ)g(nτ),(1)
在卷积神经网络中,一般的卷积操作是在图像(或者说是一个矩阵)上的操作,卷积核(Kernel) K ∈ R r × r K\in\mathbb{R}^{r\times r} KRr×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)=1ir,1jrK(i,j)A(x2r+1+i,y2r+1+j)(2)
直观上来看,就是把卷积核的中心遍历 A A A的每个像素,在每个位置做一次矩阵的内积(对应分量相乘后求和),得到的结果就是输出图像对应像素的值。

卷积神经网络(CNN)_第1张图片

很多地方会把卷积神经网络中的卷积的输入输出称为特征图(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等。


卷积神经网络

卷积神经网络(CNN)_第2张图片

卷积神经网络(Convolutional Neural Network, CNN) 的基本组成就是上面写到的各种层的叠加,对于分类任务通常会在最后Flatten一下,然后增加全连接层(Full Connection),然后得到一个输出概率向量。

CNN相比于MLP,更适合处理图像数据,它直接在图像上进行卷积提取特征,而如果展开成一维向量使用MLP则会损失空间信息。另外CNN的参数更少,更好地防止了过拟合的现象。

CNN的设计中,往往靠近输入层的Channel会比较少,往后会越来越多,这么做的目的是一开始先提取图片少量的宏观特征,然后后面再更加详细地提取局部特征。


你可能感兴趣的:(深度学习)