卷积神经网络的基本结构
与传统的全连接神经网络一样,卷积神经网络依然是一个层级网络,只不过层的功能和形式发生了变化。
典型的CNN结构包括:
- 数据输入层(Input Layer)
- 卷积层(Convolutional Layer)
- 激活层(Activation Layer)
- 池化层(Pooling Layer)
- 全连接层(Full Connection Layer)
- 损失层(Loss Function Layer)
- 精度层(Accuracy Layer)
1.数据输入层
数据输入层不属于网络结构。与传统的全连接神经网络不同,卷积神经网络的输入层是原始图像,而非提取的信息,因此卷积神经网络是一个无监督的特征学习网络。
数据输入层主要对原始图像数据进行预处理,基础操作包括取均值和灰度归一化,还有一些数据增强的相关操作。
# 这是一个典型的使用protobuf协议进行配置的网络输入层,它是Caffe的深度学习模型的配置文件
layer{
name: "data"
type: "ImageData"# 输入层的类型是ImageData,也就是原生的图像格式
top: "data"
top: "clc-label"
# 该层有两个参数:image_data_param 和 transform_param
# 参数有一些属性,都是图像预处理参数
image_data_param { # 这个参数有三个属性
source: "all_shuffle_train.txt" # 表示输入训练文件路径
batch size: 96 # 表示训练时输入数据的批处理大小
shuffle: true # 表示是否采用随机操作
}
transform_param {
mean_value: 104.008 # mean_value表示GRB的均值
mean_value: 116.669
mean_value: 122.675
crop_size: 48 # 表示输入训练图像尺寸
mirror: true # 是数据增强操作,指代水平翻转
}
include: { phase: TRAIN}
}
2.卷积层
卷积层是网络的特征提取层。卷积神经网络一般包含多个卷积层,一个卷积层可以有多个不同的卷积核。
# 这是一个典型的卷积网络层。
# 包含两类参数,即权重参数和偏置参数,其中配置了两个param属性,分别表示这两类参数的学习率
layer{
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult:1
decay_mult:1
}
param {
lr_mult:2
decay_mult: 0
}
convolution_param {
num_output:12 # 输出特征层的通道数目
pad:1 # 在卷积前进行边界填充像素的行列数
kernel_size:3 # 卷积步长
stride:2
weight_filler{ # 卷积权重参数的初始化策略
type:"xavier"
std:0.01
}
bias_filler { # 这里配置的是偏置参数的初始化方法
type: "constant"
value:0.2
}
}
}
3.激活层
网络需要激活层进行特征的选择和抑制,早期的Sigmoid等函数使用较多,现在多实用形式更加简单的ReLU函数。
# 这是一个激活层
# RELU激活层非常简单,没有需要学习的参数。(有的激活层有需要学习的参数)
layer{
name: "relu1"
type:"ReLU"
bottom: "conv1"
top: "conv1"
}
4.池化层
池化层用于降低特征平面的分辨率及抽象特征。
池化用于压缩网络参数和数据,以降低过拟合。
如果输入为一幅图像,那么池化层最主要的作用就是在压缩图像的同时保持该图像特征的不变性。
# 这是一个池化层
# 池化层包含一个参数pooling_param
layer {
name: "pool"
type: "Pooling"
bottom: "conv3"
top: "pool"
pooling_param { # 这个参数中有三个属性
pool: MAX # 最大池化
kernel_size: 3 # 池化操作的核的大小
stride: 2 # 步长
}
}
5.全连接层
全连接层通常在卷积神经网络结构的最后,它也有权重和偏置两个参数。
# 这是一个全连接层,通常在卷积神经网络结构的最后,也有权重和偏置两个参数
# 其中配置了两个param属性,分别表示这两类参数的学习率
layer {
name: "fc"
type: "InnerProduct"
bottom: "pool"
top: "fc"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 1
}
inner_product_param {
num_output: 2 # 输出特征维度,通常是分类任务的类别数目
weight_filler{ # 权重参数的初始化方式
type: "xavier"
}
bias_filler{ # 偏置参数的初始化方式
type: "constant"
value: 0
}
}
}
6.损失层
卷积神经网络的优化原理同一般的机器学习算法类似,需要定义损失目标函数,找到最小化损失函数的参数值,通常利用SGD(随机梯度下降)等算法来调整权值。
# 这是一个softmax损失层,损失层的输入就是网络的输出和真实的标签
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc"
bottom: "clc-label"
top: "loss"
}
7.精度层
损失目标函数可以反映网络性能的优劣,但不是最终需要的指标。
对于分类任务,最终需要的是分类精度;
对于回归任务,需要的是定位精度。
因此,一个卷积神经网络还需要接上网络精度层。
# 这是一个分类任务的精度层,它与损失层一样,输入是网络的输出和真实的标签
layer {
bottom: "fc"
bottom: "clc-label"
top: "acc"
name: "acc"
type: "Accuracy"
}
上面定义的完整的网络结构如图1.20所示。
参考文献:
1.书名:《深度学习之图像识别 核心算法与实战案例 (全彩版)》
作者:言有三著
出版社:清华大学出版社
出版时间:2023年7月第一版(第一次印刷)
ISBN:978-7-302-63527-7