卷积神经网络

二维互相关cross-correlation:

输入:一个二维数组+一个卷积核(filter)

图示:

pytorch中的三维卷积_卷积


二维卷积层:

nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)

pytorch中的三维卷积_卷积_02


输入与卷积核做互相关运算,并加上一个标量偏置来得到输出。

模型参数:卷积核+偏置

卷积运算:

将核数组上下翻转、左右翻转,再与输入数组做互相关运算,这个过程就是卷积运算。

因为卷积层的核数组是可学习的,所以这两个运算没有区别(学出来的数组就是翻转后的)。

特征图和感受野:

二维卷积层输出的二维数组可以看作是输入在空间维度(宽和高)上某一级的表征,也叫特征图(feature map),其实就是某种运算提取出了新的特征。

以图1为例,输入中阴影部分的四个元素是输出中阴影部分元素的感受野。所以更深的卷积神经网络使特征图中的单个元素的感受野变得更加广阔,可以捕捉输入上更大尺寸的特征。

填充和步幅:

填充(padding)是指在输入高和宽的两侧填充元素(通常是0元素)

pytorch中的三维卷积_池化_03


要想获得和原输入同尺寸的输出,只要将p-k+1消掉即可,所以填充为k,核为2k+1.

步幅:

在互相关运算中,卷积核在输入数组上滑动,每次滑动的行数与列数即是步幅(stride)

pytorch中的三维卷积_数组_04


多输入通道核多输出通道:

(高维数据)对于RGB彩色图片,高和宽为h和w,则它可以表示为一个3hw的多维数组,则大小为3的这一维称为通道(channel)维。

多输入通道:

2输入通道的二维互相关计算例子:

pytorch中的三维卷积_pytorch中的三维卷积_05


pytorch中的三维卷积_数组_06


多输出通道:

卷积层的输出可以有多个通道。

pytorch中的三维卷积_池化_07


卷积核的组数就是输出通道数。一组卷积核的个数就是输入通道数。

多输出通道的卷积核理解:一个ckhkw的核数组可以提取输入的某些特征,多个这样的核数组可以提取不同的特征。

卷积层和全连接层的对比:

卷积层的优势:不像全连接层那样要将图像数据平铺开,可以有效提取图像的局部信息;参数量更少。

pytorch中的三维卷积_池化_08

池化:

nn.MaxPool2d(kernel_size, stride, padding)

nn.AvgPool2d(kernel_size, stride, padding)

pytorch中的三维卷积_pytorch中的三维卷积_09


池化层:用于缓解卷积层对位置的过度敏感性。

池化包含 最大池化和平均池化。

池化层也可以在输入的高和宽两侧填充并调整窗口的移动步幅来改变输出形状。

在处理多通道输入数据时,池化层对每个输入通道分别池化,但不会像卷积层那样将各通道的结果按通道相加。这意味着池化层的输出通道数与输入通道数相等。

LeNet模型

LeNet交替使用卷积层和最大池化层后接全连接层来进行图像分类。

LeNet分为卷积层块(卷积层+平均池化层+sigmoid激活函数)和全连接层块。

pytorch中的三维卷积_池化_10


LeNet代码:

LeNet pytorch实现