GooLeNet 炼丹日记 (cifar-100)

进行cifar-100的分类任务,打算采取GooLeNet(v1)模型进行识别。目标是准确度达到60%以上。

GoogLeNet采用了模块化的结构(Inception结构),在Inception中采用不同核的卷积层来保证在不同的尺度上提取特征。

GooLeNet 炼丹日记 (cifar-100)_第1张图片

其中采用了1*1的卷积层来进行降维,减少计算复杂度。同时由于在不同的卷积核上提取特征,产生的特征包含多个密集联系的子特征集(如下图),使得非关键特征被弱化,从而减少冗余,加快计算。

GooLeNet 炼丹日记 (cifar-100)_第2张图片

goolenet具体结构如下:

GooLeNet 炼丹日记 (cifar-100)_第3张图片

goolenet最后采用了average pooling(平均池化)来代替全连接层,具体方法就是对每一个feature上的所有点做平均,有n个feature就输出n个平均值作为最后的softmax的输入,这样可以有效地防止过拟合。

可以看到在网络的中间有两个辅助分类器,因为在中间产生的特征也有很强的分类型,在训练的时候使用三个分类器结合判断损失函数的方式可以有效地提升精确度。

下面是训练参数和细节

第一次炼丹:

学习率为0.0002

batch为128

采用Adam优化器

训练30次

跑了一天,准确度为48%

GooLeNet 炼丹日记 (cifar-100)_第4张图片

后期波动较大

打算采用学习率衰减

每过8次训练学习率减半

改进后投入炼丹炉,等待结果。

第二次炼丹

准确度为50.6%,提升了2%

GooLeNet 炼丹日记 (cifar-100)_第5张图片

第三次炼丹

今天看gpu利用率的时候,发现我的gpu利用率为0%,然后我就明白为什么的的模型只跑了30个epoch就要跑一整天了。。

于是在dataloder中加上num_workers=8,pin_memory=True,gpu的利用率直接就达到了99%,训练一个epoch只要两分钟。。。(我觉得我可以直接跑200个epoch了)

发现结果loss如下:

GooLeNet 炼丹日记 (cifar-100)_第6张图片

 依旧是过拟合的问题,考虑数据增强,暂时先对于图片数据进行随机水平反转,并采用训练集随机读入的方式。

第四次炼丹

效果显著(应该是随机读入的方式使网络避免产生惯性),最高准确度达到了55.4%,提升了5%。

loss如下:

GooLeNet 炼丹日记 (cifar-100)_第7张图片

 可以看见在最末尾还是loss有上涨的趋势,说明过拟合问题没有完全解决。

在最后准确度还有上涨的趋势,所以打算增加训练轮数为40轮。

然后我发现之前我在定义adam优化器的时候把它放在训练循环里,导致它无法使用自适应学习率。所以把它移到最开始的超参数定义的地方。

第五次炼丹

最高准确度为58%,提升了3%

后期又出现了过拟合的趋向。

打算再加大训练轮数。

GooLeNet 炼丹日记 (cifar-100)_第8张图片

第六次炼丹

这次我直接训练100轮,终于在其中一轮中出现了一个准确率为60.05735759493671的模型。

GooLeNet 炼丹日记 (cifar-100)_第9张图片

初步目标算是完成了,但是过拟合造成的高损失也到了一个很离谱的状态:

GooLeNet 炼丹日记 (cifar-100)_第10张图片

部分结果可视化如下:

GooLeNet 炼丹日记 (cifar-100)_第11张图片

以后有空了在看看怎么优化吧。

第七次炼丹

这次使用了图像反转和随机亮度来扩增数据集并且在第六次炼丹的权重基础上再进行100轮次训练。

其中最高准确率达到了63.1%,增加了3.1%

GooLeNet 炼丹日记 (cifar-100)_第12张图片

可见数据集扩增是有效的。

你可能感兴趣的:(深度学习,pytorch,神经网络)