小白的经典CNN复现(三):AlexNet (2)

在网络的具体结构方面,AlexNet又引入了许多的比较先进的思想,并且有一部分的东西到现在还在用,当然啦还是有一部分东西被淘汰了,不过大体上讲还是都挺有意思的:

激活函数方面:不同于在以前的全连接网络以及LeNet-5中常用的Sigmoid以及Tanh,在AlexNet中使用的函数为ReLU函数,并且论文提到,使用ReLU函数大概能将训练速度提高6倍左右(相较于传统的Tanh),并且基本解决了梯度消失现象。

池化层的改进:在之前的LeNet-5以及LeNet-1989模型中,池化层的核在移动的过程中是不发生重叠的(比如说核尺寸为2,那么步长也为2,不发生重叠),但是在AlexNet中,作者提到如果池化的核在移动过程中发生重叠,会降低过拟合的风险。

Dropout:在全连接层中,AlexNet使用了Dropout技术,该技术也是为了降低模型的过拟合风险(话说我咋觉得这篇文章的大部分内容都是着重于降低过拟合风险呢┓(\'∀\')┏),大致的原理呢我会在后面的具体复现和分析部分里面简单的说一下,总之大家在这里先留个印象比较好。

标准化处理:由于训练过程中数据的分布一定会发生比较大的变化,因此这里使用了一个叫做Local Response Normalize的标准化方法,用来将数据的分布进行重新计算,其实这个思想在后来演化成了BatchNormalization,并且后面也有论文指出,在AlexNet中使用的这个LRN它就是个垃圾(希望论文原作者不会看到这篇博客┓(\'∀\')┏)。

损失函数:在AlexNet,正儿八经的交叉熵损失可算是用起来了,毕竟从概率论的角度上讲,交叉熵损失在这种典型的分类问题中肯定是比较合适的嘛。

训练策略:训练中主要有两个比较需要重点关注的地方(除了两个GPU以外的内容):首先,在训练时使用的梯度下降法,是基于mini-batch以及动量(momentum)的SGD,从之前我在LeNet-5的末尾反思部分提到的内容可以看出,mini-batch思想肯定是十分重要的,然后关于动量的内容,等放到后面的具体复现以及分析的部分中再简单说一下;其次,为了在之后能让模型尽快收敛,学习率仍然是需要下降的,只不过下降的策略发生了小小的变化,以前的下降就是不考虑任何因素直接在指定的epoch处下降,而AlexNet中则是用在验证集上的错误率作为评价指标,当错误率不再下降时进行学习率的下降。

总之这篇论文中大致的需要我们初学者小白们学习的内容就是这些了,当然如果大家对于其他的一些像多GPU训练等内容感兴趣的话,也可以再把其他的内容也读一读,不过在这篇博客中我就不管那些啦。那么接下来我们就开始进行论文的具体分析以及复现吧(≧∀≦)

具体分析以及复现

这篇论文虽然说杂七杂八的东西蛮多的,但是实际上复现难度并不是很高,毕竟大部分的内容在Pytorch里面有现成的东西可以用,我们犯不上为了这个模型非要自己造个轮子(点名批评C++,干啥都要造个轮子,滑稽.jpg)。里面唯一需要我们自己写的东西就只有一个论文提到的LRN,不过这个也挺简单的啦。

还是先介绍一下我复现所使用的环境吧:

硬件:Intel i7-8750H,GTX1050Ti(垃圾笔记本所以ImageNet就别想了,跑个CIFAR-10都费劲┓(\'∀\')┏)

软件:python 3.6.x,pytorch1.4.1,就anaconda那一套装好完事,操作系统是win10,因为代码中不涉及跨平台的部分,所以把里面的文件路径改一改应该是可以在Linux上正常运行的。平常用notepad++比较多,不太习惯用pycharm(不过我估计以后写大型项目还是会真香.jpg吧┓(\'∀\')┏)

为了防止我们之后忘记引用模块,所以老规矩,我们这里把所有需要用到的模块和包全都一股脑放在开头:

import torch import torch.nn as nn from torchvision import transforms as T from torchvision import datasets import torch.optim as optim from torch.utils.data import DataLoader

可以看到我们相比之前的论文复现,多引用了一个DataLoader的类,这个类是为了我们进行数据的mini-batch划分用的,之后我们会简单介绍一下,这里就先不提啦

在介绍具体的AlexNet之前,我们还是先把这篇论文使用的数据集及其处理方式简单介绍一下吧,毕竟我们只有知道数据集处理方式,才能更好理解模型的各种输入参数是怎么回事嘛。

数据集简介及数据增强手段

之所以把数据增强也放在这里,是希望大家能把所有关于数据处理的部分都一下子在这个部分了解了,就不用了来回来去翻论文了,是不是挺贴心?绝对不是因为我懒得再分一个小章节写了哦!

这篇论文中使用的数据集是大名鼎鼎的ImageNet在ILSVRC2010的一个子集,在训练集里面大概有1.2millon个图片,验证集里有50000图片,测试集150000图片,数据集的压缩包我记得大概132G左右,解压完我估计更大,一共1000个分类,图片尺寸大小不一而且都很大,所以我家里这台破电脑实在是无能为力啊TAT,所以这篇论文的复现工作就先不正经训练了哈。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxyjy.html