与传统的神经网络一样,卷积神经网络依旧是层级网络。通常来说,其包括数据输入层(Input Layer)、卷积层(Convolutional Layer)、激活层、池化层(Pooling Layer)、全连接层(Full Connection Layer)等。
1.数据输入层
虽然数据输入层本身并不属于网络结构,但是这里也有必要进行说明。与传统的全连接神经网络不同,卷积神经网络的输入层就是原始的图像,而非提取的信息,因此卷积神经网络是一个无监督的特征学习网络。
数据输入层主要对原始图像数据进行预处理,基础的操作包括去均值、灰度归一化等,除此之外,还会有一些数据增强相关的操作。
下面是一个典型的使用Protobuf协议进行配置的数据输入层,这是Caffe的深度学习模型配置文件。
可以看出,它的输入类型是ImageData,也就是原生的图像格式。其对应有两个网络参数,分别是image_data_param和transform_param。image_data_param配置了3个属性:source为输入训练文件路径,batch_size为训练的批处理大小,shuffle为是否采用随机操作。transform_param配置了3个属性:mean_value为RGB的均值,crop_size为输入训练图像的尺寸,mirror为一个数据增强操作,指水平的翻转,这些都是图像预处理参数。
2.卷积层
卷积层是网络的特征提取层。一般卷积神经网络包含多个卷积层,一个卷积层可以有多个不同的卷积核。首先通过多个不同的卷积核对图像进行处理,提取特征,每个卷积核会映射出一个新的特征平面,再通过非线性激活函数对卷积输出结果进行处理。
下面是一个典型的卷积层,一个卷积层包含两种参数——权重参数和偏移量参数,还配置了两个param属性,它们分别是上述两类参数的学习率属性的配置。可以看到,在convolution_param中,配置了num_output、pad、kernel_size、stride、weight_filler参数。其中,num_output为输出特征层的通道数目;pad为在卷积前进行的边界填充像素的行列数;kernel_size为卷积核尺寸;stride为卷积的步长;weight_filler为权重参数的初始化策略;bias_filller中配置的是偏移量参数的初始化方法。
3.激活层
卷积神经网络需要激活层来进行特征的选择和抑制,早期经常使用Sigmoid等函数,现在则多使用形式更加简单的ReLU函数。一个典型的激活层如下。
可以看到,ReLU激活层其实非常简单,没有需要学习的参数。当然,有的激活层会有需要学习的参数,我们在后面会进行详细介绍。
4.池化层
池化层用于降低特征平面的分辨率及抽象特征,一个典型的池化层如下。
可以看到,它包含一个参数pooling_param,其中有属性pool、kernel_size、stride。pool用于选择池化的操作,通常有平均池化和最大池化两种形式;kernel_size是池化操作的核的大小;stride是对应的步长。
池化用于压缩网络参数和数据,减小过拟合。如果输入为一幅图像,那么池化层最主要的作用就是在压缩图像的同时保证该图像特征不变。
5.全连接层
通常全连接层在卷积神经网络结构的最后,它也有卷积核和偏移量两个参数。
一个全连接层的配置如下,其包含参数inner_product_param。其中,num_output表示输出特征维度,通常是分类任务的类别数目;weight_filler和bias_filter分别表示权重和偏移量参数的初始化方式。
6.损失层
卷积神经网络的优化原理同一般机器学习算法类似,需要定义损失目标函数,找到最小化损失函数的参数值。常利用SGD(随机梯度下降)等算法来调整权值。
下面所示为一个Softmax损失层,损失层的输入就是网络的输出和真实的标签。
7.精度层
损失目标函数可以反映网络性能,但这不是我们最终需要的指标。对于分类任务,我们最终需要的是分类精度;对于回归任务,我们需要的是定位的精度,所以一个卷积神经网络还要有精度层。
下面是一个分类任务的精度层,与损失层一样,其输入是网络的输出和真实的标签。
图2.9所示为完整的三层卷积神经网络结构,随着各类网络层的提出,CNN结构往往会包含更多层,这里就不再完整地介绍。
图2.9 三层卷积神经网络结构