以图像分类任务为例,在下表所示卷积神经网络中,一般包含5种类型的网络层次结构:
CNN层次结构 输出尺寸 作用
输入层
W1×H1×3
卷积网络的原始输入,可以是原始或预处理后的像素矩阵
卷积层 W1×H1×K 参数共享、局部连接,利用平移不变性从全局特征图提取局部特征
激活层 W1×H1×K 将卷积层的输出结果进行非线性映射
池化层 W2×H2×K 进一步筛选特征,可以有效减少后续网络层次所需的参数量
全连接层 (W2 H2 K)× C 将多维特征展平为2维特征,通常低维度特征对应任务的学习目标(类别或回归值)
W1×H1×3对应原始图像或经过预处理的像素值矩阵,3对应RGB图像的通道;K表示卷积层中卷积核(滤波器)的个数;W2× H2 为池化后特征图的尺度,在全局池化中尺度对应1×1;(W2H2K)是将多维特征压缩到1维之后的大小,C对应的则是图像类别个数。
1 输入层
输入层(Input Layer)通常是输入卷积神经网络的原始数据或经过预处理的数据,可以是图像识别领域中原始三维的多彩图像,也可以是音频识别领域中经过傅利叶变换的二维波形数据,甚至是自然语言处理中一维表示的句子向量。以图像分类任务为例,输入层输入的图像一般包含RGB三个通道,是一个由长宽分别为H和W组成的3维像素值矩阵H× W ×3,卷积网络会将输入层的数据传递到一系列卷积、池化等操作进行特征提取和转化,最终由全连接层对特征进行汇总和结果输出。根据计算能力、存储大小和模型结构的不同,卷积神经网络每次可以批量处理的图像个数不尽相同,若指定输入层接收到的图像个数为N,则输入层的输出数据为N×H×W×3。
2 卷积层
卷积层(Convolution Layer)通常用作对输入层输入数据进行特征提取,通过卷积核矩阵对原始数据中隐含关联性的一种抽象。卷积操作原理上其实是对两张像素矩阵进行点乘求和的数学操作,其中一个矩阵为输入的数据矩阵,另一个矩阵则为卷积核(滤波器或特征矩阵),求得的结果表示为原始图像中提取的特定局部特征。下图表示卷积操作过程中的不同填充策略,上半部分采用零填充,下半部分采用有效卷积(舍弃不能完整运算的边缘部分)。
卷积神将网络的计算公式为:
N=(W-F+2P)/S+1
其中N:输出大小
W:输入大小
F:卷积核大小
P:填充值的大小
S:步长大小
举例:
nn.Conv2d(in_channels=3,out_channels=96,kernel_size=12,stride=4,padding=2)
in_channels=3:表示的是输入的通道数,由于是RGB型的,所以通道数是3.
out_channels=96:表示的是输出的通道数,设定输出通道数的96(这个是可以根据自己的需要来设置的)
kernel_size=12:表示卷积核的大小是12x12的,也就是上面的 “F”, F=12
stride=4:表示的是步长为4,也就是上面的S, S=4
padding=2:表示的是填充值的大小为2,也就是上面的P, P=2
假如你的图像的输入size是256x256的,由计算公式知N=(256-12+2x2)/4+1=63,也就是输出size为63x63x96
卷积层的参数计算:
卷积后feature map边长: outputSize =(originalSize + paddingX2 - kernelSize)/ stride + 1 (其中outputSize是卷积之后得到的feature map的边长,originalSize是输入图的边长,padding是填充的大小,kernelSize是卷积核的边长,stride是步长)
卷积层的可训练的参数个数: trainNum = (outputSize X outputSize + 1) X kernelNum (其中kernelNum是卷积核的个数,加1是因为每一个卷积核有一个bias参数)
卷积层的连接数: connectNum = (kernelSize X kernelSize) X (outputSize X outputSize) X kernelNum
卷积层的神经元个数: neuralNum = (outputSzie X outputSize) X kernelNum
3 激活层
激活层(Activation Layer)负责对卷积层抽取的特征进行激活,由于卷积操作是由输入矩阵与卷积核矩阵进行相差的线性变化关系,需要激活层对其进行非线性的映射。激活层主要由激活函数组成,即在卷积层输出结果的基础上嵌套一个非线性函数,让输出的特征图具有非线性关系。卷积网络中通常采用ReLU来充当激活函数(还包括tanh和sigmoid等)ReLU的函数形式如下公式所示,能够限制小于0的值为0,同时大于等于0的值保持不变。
4 池化层
池化层又称为降采样层(Downsampling Layer),作用是对感受域内的特征进行筛选,提取区域内最具代表性的特征,能够有效地降低输出特征尺度,进而减少模型所需要的参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling),它们分别提取感受域内最大、平均与总和的特征值作为输出,最常用的是最大池化。
池化操作没有用于训练的参数,只有两个超参数Stride和kernel_size,过程与卷积操作类似,也是在输入图像上从左到右从上到下滑动,在滑动过程中,当核覆盖在一个区域的时候,用这个区域的最大值作为结果,Stride和kernel_size一般来说相等。
下采样层的参数计算:
下采样后map的边长: outputSize =(originalSize + paddingX2 - kernelSize)/ stride + 1 (其中outputSize是卷积之后得到的feature map的边长,originalSize是输入图的边长,padding是填充的大小,kernelSize是卷积核的边长,stride是步长)
下采样层可训练的参数个数: trainNum = (1+ 1) X kernelNum (其中kernelNum是卷积核的个数)
下采样层的连接数: connectNum = (kernelSize X kernelSize) X (outputSize X outputSize) X kernelNum
下采样层的神经元个数: neuralNum = (outputSzie X outputSize) X kernelNum
5 全连接层
全连接层(Full Connected Layer)负责对卷积神经网络学习提取到的特征进行汇总,将多维的特征输入映射为二维的特征输出,高维表示样本批次,低位常常对应任务目标。