1 卷积神经网络整体结构
卷积神经网络(CNN)相比全连接网络多了卷积层和池化层。对于全连接网络,所有相邻层的神经元都用Affine层进行连接,如图中即为Affine-ReLU的连接组合。
卷积神经网络则包含卷积层和池化层与激活函数相连,其结构如下:
2 全连接层对图象识别的局限性
我们之前一直使用全连接网络识别mnist数据集,但这其实是一个低效的方法。对于28 X 28的图片信息,我们必须将其拉长成1 X 784的数据再传入网络。这一操作不但需要大量神经元作为输入层,而且当我们将二维图片拉伸为一维后,会丢失原图中部分特征信息,如邻近像素值的关系。
CNN可以保留原图二维的形状同时识别图像,从而保留原图中的各类特征。CNN卷积层输入输出数据被称为特征图
3 卷积运算
如图,卷积运算中我们用一个矩阵(被称为卷积核),在图片矩阵中“滑动”,并和图片矩阵重合部分进行内积运算(即将对应位置元素相乘在加和)。最终将各个部分内积结果汇总成一个新的矩阵作为输出特征图
填充(paddling):通过在原图片矩阵周围拓展0以增大原矩阵形状,这一操作用于控制输出特征图的形状和大小。
如图,使用1的填充,可以使得输出特征图大小和原矩阵一样为4 X 4,这样防止了深度学习中由于不断卷积导致矩阵被不断缩小。
步幅(stride):步幅为每一次卷积核在图片上移动的步长,步长会对提取到的特征和输出特征图形状有影响
对于一个形状(w,h)的输入图,步幅为S,填充为P,卷积核(cw, ch),输出特征图形状为((w + 2P - cw) / s + 1, (h + 2P - ch) / 2 + 1)
三维数据卷积运算
对于有多通道的图片(如RGB图片),需要使用和通道数一致的卷积核数量,其得到的特征图通道数恒为1.可以使用多个卷积核分别和图片做卷积运算,将每一个运算得到的特征图累积成一个多通道特征图
如图,对于形状为(C,H,W)的输入图,使用FN个形状为(C,FH,FW)的卷积核,得到形状为(FN,OH,OW)的输出特征图
4 批处理
和全连接网络的批处理类似,卷积神经网络批处理数据为4维数据,按照(batch_num, channel, height, width)的顺序保存数据
池化层
池化层会缩小特征图长宽方向上大小,其作用为将一片区域内的元素缩为一个元素。如Max池化取该区域内最大值,而Average池化取区域所有元素平均值。(在图像识别中我们一般使用max池化)
一般来说,我们池化窗口的大小和卷积核步幅设为相同值,如下图中池化层窗口为2 X 2,同时卷积核步幅也为2
池化层不存在参数,因此不需要进行学习。另外池化层不会改变输入输出的通道数。对输入特征图的每一个通道池化层会单独处理
python实现卷积层和池化层
实现卷积层可以使用im2col函数,该函数将批处理的4维数据转换为2维矩阵以适合滤波器(权重)。如对于通道为3的7X7数据。im2col展开结果为
im2col的参数
def im2col(input_data, filter_h, filter_w, stride=1, pad=0):
"""
Parameters
----------
input_data : 由(数据量, 通道, 高, 长)的4维数组构成的输入数据
filter_h : 滤波器的高
filter_w : 滤波器的长
stride : 步幅
pad : 填充
Returns
-------
col : 2维数组
"""
N, C, H, W = input_data.shape
out_h = (H + 2*pad - filter_h)//stride + 1
out_w = (W + 2*pad - filter_w)//stride + 1
img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, p