卷积神经网络
卷积神经网络(CNN)是一种深度学习算法,其仿照生物视觉机制来提取特征。
卷积层
为了减少参数以防过拟合,卷积层中的神经元被分组,每组神经元共享权重并仅连接上层神经元中的一部分,也可以看成一个神经元以“扫描”的方式连接上层神经元(如下图),但这种扫描并不代表卷积层神经元与上层不同神经元的连接存在时间上的先后顺序。每组输出“图像”尺寸都与输入尺寸相同,输入和输出的“图像”数量往往不同,输出的“图像”数量取决于组数。
上述分组即卷积核,卷积核中的每一个神经元权重矩阵都一样。
下图中输入为 X + \textbf{X}^+ X+而非 X \textbf{X} X的原因是:为了使输入和输出尺寸一致对输入进行填充(参考下图中 Y \textbf{Y} Y变为 Y + \textbf{Y}^+ Y+的过程,是在输出矩阵四周增加一些不影响计算正确性的值,一个值的下标可能变化但本身与其它值的相对位置不变,图中 Y \textbf{Y} Y变为 Y + \textbf{Y}^+ Y+的过程是对图中所示卷积层的下一层的输入进行填充,不一定非要这么做)。
池化层
池化层位于卷积层之后,对卷积层提取的特征进行选择,即从输入的一部分值中选取一个值作为对应输出。池化层的输出尺寸小于输入尺寸,但池化层的输出的“图像”数目与输入“图像”数目相同。可以理解为池化层负责以特有的方式对“图像”进行缩小,缩小后保留“图像”特征,这些特征的位置的略微差异并不影响其输出。
逆传播时,池化层神经元仅对其已经选择的卷积层神经元传递误差,即池化层神经元仅对每一部分卷积层神经元中输出值最大的一个(组)神经元传递误差,如下图所示。哪个上层神经元的输出通过池化层传递到了下一层,逆传播时梯度就传递到哪个上层神经元。
池化层神经元本身没有可训练参数,也就是不学习。
全连接层
每一个神经元都与上层的所有神经元连接,普通神经网络的隐层就是全连接层,前几层输出的特征“图像”在被全连接层处理前需要处理为线性结构。
LeNet-5
LeNet-5是最早的卷积神经网络之一,用作快速识别手写数字。入门的不错的选择。
from tensorflow.keras import * # tensorflow-gpu 2.5.0、python3.8.10
from tensorflow.keras.layers import *
# LeNet结构
layers = [
Conv2D(filters=20, kernel_size=(5, 5), strides=1, activation='relu'