/CNN-repository

classical CNN impelementation with pytorch.Include VGGNet,Inception-v1,BN-Inception,Resnet-v1,Resnet-v2 and so on.

Primary LanguagePython

[TOC]

经典CNN的复现

包括VGG、BN-VGG、Inception-v1、BN-Inception、Inception-v3、resnet-v1、resnet-v2等等。适用于新手学习入门CNN。

持续更新...

在CIFAR10上的正确率

这里我都是最好的结果,同一模型还有更细致的对比实验,详情参见实验对比

MODEL ACCURACY
VGG16 90.06%
BN-VGG16 92.31%
BN-Inception 92.41%
Inception-v3 92.94%
ResNet-v1 93.54%
ResNet-v2 95.35%
DenseNet 94.13

实验对比

在__CIFAI10__上的测试结果:

ResNet:

这里是原论文中描述的实现18,34,50,101,154层resnet-v1的效果,忘记加标记了,左边是18和34层。右边是50,101,154层。层数越多acc越低。

为了适应CIFAR10的低分辨率,我把第一层的卷积核从7x7改成了3x3,并且保持分辨率,后面遵从原论文的设置。为了对比v1和v2的效果,达到实验中说的v1层数越多效果反而越差的效果,我最高设到了301层,但是没有明显的效果,1000多层的实在是跑不动,302层我在GTX 2080Ti上跑了10个小时。看实验图:

可以看到随着网络加深,v1版本的正确率基本不变了,但是v2版本的还有微小的提升。而且横向对比,ResNet-v2也更有优势。

VGG16:

vgg16_bn初始学习率0.1,vgg初始学习率为0.01

如果vgg初始学习率也为0.1的话,整个网络就发散了,之后也不会再收敛,可以看到BN版的vgg对步长不是那么敏感,而且效果有明显的提升。而且加了BN层在100个epoch之前是不如原始vgg的,原因应该是步长太大,步长减少10倍之后,效果就超过了原始VGG。

Inception:

BN-Inception:

我都对0.01和0.001的测试率做了测试。但是按照原论文中设置weight-decay=0.00001怎么也到不了90%以上的正确率,所以我设置了weight-decay分别为1e-5(左图)、5e-5(右图)。这个结果比较有意思,左图不同学习率最终结果没什么差别,说明加了BN之后确实对学习率有一定的容忍性。右图的差别就大了,我个人分析应该是BN并不具备正则的作用,所以还是得到额外的正则项来防止过拟合,但是这次学习率的影响又比较大了,这我还不知道怎么解释,我猜想是因为学习率太小,被正则项限制之后欠拟合了,但是这还需要更多的实验去证明。

Inception-v3

比BN-Inception效果稍好。

Inception-v3

DenseNet

Inception-v3

效果比resNet v1稍好,比resnet v2差一点。而且我加到了85层之后结果不再上升,由于不同层之间feature map的累加,网络层数增加会导致计算量飞速增加。不过可以看到的是DenseNet的收敛速度非常快,应该是梯度传播比较顺利的原因。