经典的卷积神经网络
LeNet
模型

大小\(1\times32\times32\)的灰度图像,通过\(6\times1\times5\times5\)的filter,此时输出图像维度为\(6\times28\times28\),
通过Sigmoid激活函数后,再经过\(2\times2\)的平均池化(\(\mathrm{stride=2}\)),此时输出图像维度为\(6\times14\times14\);
通过\(16\times6\times5\times5\)的filter,此时输出图像的维度为\(16\times10\times10\),
通过Sigmoid激活函数后,再经过\(2\times2\)的平均池化(\(\mathrm{stride=2}\)),此时输出图像维度为\(16\times5\times5\)
通过\(120\times16\times5\times5\)的filter,此时输出图像维度为\(120\times1\times1\),也就是每个通道处只剩下一个像素点,我们可以当成全连接层的输入,
将\(120\times1\times1\)的图像平铺成一维向量,注意,对于\(N\)个样本,此时的输入图像维度是\(N\times120\times1\times1\),使用nn.Flatten()
即可平铺为\(N\times120\)的矩阵
通过nn.Linear(120, 84)
的全连接层,再通过nn.Linear(84, 10)
的全连接层,通过Softmax
后就是对10类预测的概率
torchvision.datasets.MNIST
数据集是手写数字识别,一共10个类别,输入图像维度为\(1\times28\times28\),因此,我们需要将其先padding到\(1\times32\times32\)的维度,可以在第一个卷积中实现,也可以在预处理中实现
代码
1 |
|
AlexNet
模型
相比于LeNet,AlexNet神经网络模型深度更深,有8层(5个卷积层和3个全连接层),而LeNet只有5层(2个卷积和3个全连接层)
AlexNet使用了ReLU作为激活函数,而LeNet使用的是Sigmoid激活函数
AlexNet在卷积层后使用了LRN,这种技术模仿了生物神经系统的“侧抑制”机制,但后来人们发现并没有什么作用
AlexNet在训练过程中使用了数据增强技术,如图像翻转、裁剪和颜色变换等,这些技术有效地减少了过拟合,提高了模型的泛化能力
AlexNet在全连接层使用了Dropout技术,这是一种正则化方法,可以在训练过程中随机丢弃一些神经元,以减少模型复杂度,防止过拟合
代码
由于ImageNet数据集太大,训练成本较高,这里我们选用CIFAR10数据集
1 |
|
VGG
模型
相比于AlexNet,VGG(Visual Geometry Group)统一使用\(3\times3\)的小卷积核和\(2\times2\)的池化层,网络结构更加简单规范
VGG将多个卷积层和一个池化层打包成一个模块,可以用模块的方式构建神经网络
原始VGG网络有5个卷积块,其中前两个块各有一个卷积层,后三个块各包含两个卷积层,第一个模块有64个输出通道,每个后续模块将输出通道数量翻倍,直到该数字达到512。由于该网络使用8个卷积层和3个全连接层,因此它通常被称为VGG-11
VGG块不通过卷积层减小图像的宽高,VGG的卷积层通常采用same卷积,保证输出的图像宽高尺寸和输入的图像宽高尺寸相同。VGG块通过最大池化层(最大汇聚层)减小图像的宽高
代码
使用函数将一个VGG块打包,包装到nn.Sequential()
中,
1 |
|
NiN
模型
NiN(Network in Network),NiN引入了\(1\times1\)的卷积核,这种卷积核可以在不改变空间维度的情况下,增加网络的深度和非线性能力,同时减少参数数量。在网络的末端,NiN使用全局平均池化层来代替传统的全连接层。这种方法不仅减少了参数数量,还使得模型更加灵活,能够适应不同尺寸的输入。
\(1\times1\)卷积核实际上就是将每个像素当成一个样本,通道当成一个像素的特征,应用全连接层。
LeNet、AlexNet、VGG都有一个共同的设计模式:通过一系列的卷积层和池化层来提取空间特征结构,然后通过全连接层对特征的表征进行处理。然而,如果使用了全连接层,可能会完全放弃表征的空间结构。NiN提供了一个非常简单的解决方法:在每个像素的通道上分别使用多层感知机
代码
1 |
|
GoogLeNet
模型
在GoogLeNet中,基本的卷积块被称为Inception块(Inception block)
GoogLeNet的核心是Inception模块。每个Inception模块都包含了多个并行的卷积层和池化层,它们以不同的方式处理输入数据,并将结果拼接起来。这种设计允许网络在多个尺度上捕获特征,增强了特征提取的能力。
Inception模块中广泛使用了1x1卷积,这种卷积可以减少特征图的深度,降低计算量,同时增加非线性。
GoogLeNet的一个重点是解决了什么样大小的卷积核最合适的问题,该论文的一个观点是有时使用不同大小的卷积核组合是有利的
Inception块由四条并行路线组成。前三条路径使用窗口大小为\(1\times1\)、\(3\times3\)、和\(5\times5\)的卷积层,从不同空间大小中提取信息。中间两条路径在输入上执行\(1\times1\)卷积,以减少通道数,从而降低模型的复杂性。第四条路径使用\(3\times3\)最大池化层,然后使用\(1\times1\)卷积层来改变通道数。这四条路径都使用合适的填充来使输入与输出的高和宽一致,最后我们将每条线路的输出在通道维度上连结,并构成Inception块的输出。在Inception块中,通常调整的超参数是每层输出通道数。
GoogLeNet一共使用9个Inception块和全局平均池化层的堆叠来生成其估计值,Inception块之间的最大池化层可降低维度。第一个模块类似于AlexNet和LeNet,Inception块的组合从VGG继承,全局平均池化层避免了在最后使用全连接层
代码
先构建Inception块然后构建GoogLeNet
1 |
|
ResNet
模型
代码
1 |
|