1. 卷积层
卷积层是卷积神经网络中的核心模块,通过把卷积核放在输入上进行滑窗,做卷积运算,得到当前位置的输出,从而提取输入特征图的底层特征。
来看一个形象的比喻
这里一个眼睛就相当于一个卷积核,不过这个卷积核内的参数是通过神经网络通过各种算法训练出来的,而非人为设置的。当卷积核遇到符合该特征的区域时就会显示高亮。
卷积本质上是融合多个像素值的信息输出一个像素值。
如下图所示,这种卷积核内的参数设置为边缘检测算子即可提取出图像中的边缘信息。
训练模型的过程实质上就是在找卷积核参数的过程。
神经网络通过训练后得出了合适的卷积核参数,并将这些参数保存为模型。之后再检测一张全新的图像,通过比对图像中是否存在这些特征,再通过分类或回归操作即可输出用户需要的结果。
1.1 卷积的计算方法
卷积运算
卷积运算本质上就是在滤波器和输入数据的局部区域间做点积。
同理,可以计算其他各点,得到最终结果
1.2 padding
在上述卷积过程中,特征图比原始图减小了很多,我们可以在原图像的周围进行padding来保证在卷积过程中特征图大小不变。
一般都填充0
1.3 stride
1.4 感受野
卷积核扫描过程中停留的地方叫做感受野。
1.5 卷积核的数量 filters
决定输出的特征图数量。通常从较少的卷积核开始(如32或64),随着网络加深逐渐增加(如128、256等)。
1.6 卷积核内的参数
卷积核内的参数(即权重和偏置)是通过训练过程自动学习得到的,而不是人为设定的。
具体步骤如下:
- 初始化:使用随机或预训练值初始化权重和偏置。
- 前向传播:卷积核与输入数据卷积,生成特征图。
- 损失计算:计算预测值与真实标签的误差。
- 反向传播:计算损失函数对卷积核参数的梯度。
- 参数更新:使用优化算法更新卷积核的权重和偏置。
- 迭代训练:重复上述过程,直到模型收敛
1.7 多通道卷积
当输入是多通道时,卷积核也要相应的设置为多通道。
但是一个卷积核仍然只对应一个特征图的输出(将各个通道的输出整合为一个输出)
几个卷积核,产生几个特征图
2. 池化层(Pooling)
一个卷积核会产生一个特征图,而在训练过程中通常会设置32、64 、256个,甚至更多的卷积核,从而产生大量的参数。
通过池化就可以将数据维度减小,达到模糊的效果从而防止过拟合。
池化层的本质是一个下采样,因为数据经过卷积之后维度越来越高,而且特征图没有多大改变,在连续多个卷积之后,会产生一个很大的参数量,不仅会大大的增加网络训练的难度,还容易造成过拟合的现象,所以通常会在卷积层之后放一个池化层对数据进行压缩,降低维度,减少参数量。
具体操作是将一个像素点与它周围的数据点进行聚合统计,缩减特征图的尺寸,然后对其相邻的区域取均值或最大值,进一步减少参数量。通过池化操作,提取的特征对光线等因素的适应能力也有所增强。池化操作能够对上一层的特征图进行融合,因为相邻区域的参数具有较强的关联性,还能够防止发生过拟合现象。
池化层迎来降低了后续网络层的输入维度,缩减模型大小,提高计算速度,并提高了Feature Map的鲁棒性,防止过拟合, 它主要对卷积层学习到的特征图进行下采样(subsampling)处理,主要由两种
2.1 最大池化
Max Pooling,取窗口内的最大值作为输出,这种方式使用比较广泛
tf.keras.layers.MaxPool2D(
pool_size=(2.2).strides=None. padding= 'valid"
)
参数说明
pool_size
:池化窗口的大小
strides
:窗口移动的步长,默认为1
padding
:是否进行填充,默认是不进行填充的
2.2 平均池化
Avg Pooling,取窗口内的所有值的均值作为输出
tf.keras.layers.AveragePooling2D(
pool_size=(2,2), strides=None,padding="valid"
)
参数说明
pool_size
:池化窗口的大小
strides
:窗口移动的步长,默认为1
padding
:是否进行填充,默认是不进行填充的
由于平均函数、最大值函数的存在,使池化层具有了平移不变性,下图可以形象的看出。
3. Dopout
4. 全连接层
全连接层位于CNN网络的末端,经过卷积层的特征提取与池化层的降维后,将特征图转换成一维向量送入到全连接层中进行分类或回归的操作。
5. 经典卷积神经网络
5.1 LeNet-5
首先输入一个32\times32\times3的图像
Conv1层:
- f=5:卷积核大小
- s=1:步长为1
- n=6:卷积核个数,6个
输出28\times28\times6的特征图
Pool1层:
- f=2:窗口大小为2\times2
- s=2:步长为2
输出14\times14\times6的特征图
Conv2层:
- f=5:卷积核大小
- s=1:步长为1
- n=16:卷积核个数,16个
输出10\times10\times16的特征图
Pool2层:
- f=2:窗口大小为2\times2
- s=2:步长为2
输出5\times5\times16的特征图
展平层:
展平成一维向量
全连接层:
展平后得到一维向量,送入神经元个数为120的全连接层,计算后再送入神经元为84的全连接层,最后计算后送入神经元个数为10的输出层
输出层:
输出层使用softmax,因为lenet-5是在1998年提出的,那时候还没有relu函数