【第3次作业】卷积神经网络

【第一部分】视频学习心得及问题总结

  通过本次视频的学习,我了解到了深度学习是需要通过概率学来得到规律,通过数据结构来优化模型。所以如果想要专研深度学习,需要具备很好的数学基础。第二个视频是关于卷积神经网络的,它不仅解决了我上一次作业中对于卷及神经相关的问题,同时让我了解了CNN的原理和基础结构:由卷积和池化互相交替,最后加上全连接(大部分参数量都在全连接中)。同时让我了解到了典型网络结构的发展史和各个阶段代表结构的原理(从AlexNet到VGG又到GoogleNet再到ResNet),在层数不断增加的情况下仍然能保证不会出现梯度消失的情况,并且将top5的误差率从16.7%下降到最后的3%左右。不得不再一次佩服这些大佬的智慧。问题:越深的网络越难训练吗?如果用Resnet的方法来解决梯度消失的问题,是不是可以无限制的加深层数?

 

【第二部分】代码练习

1.MNIST 数据集分类

1.1.加载数据

将本次CNN的训练和测试的数据加载进来。

 

 

 

加载成功后,显示数据集中的部分图像。

 

 

 

1.2.创建网络

定义网络,继承nn.Module并实现其中的forward方法,把网络中具有可学习参数的层放在构造函数init中。

 

 

 

 

 

 

定义训练和测试函数

 

 

 

1.3.在小型全连接网络上训练

 

 

 

1.4.在卷积神经网络上训练

通过上面的测试结果,可以发现:含有相同参数的 CNN 效果要明显优于简单的全连接网络。(卷积和池化)

 

 

 

1.5.打乱像素顺序再次在两个网络上训练与测试

如果我们把图像中的像素打乱顺序,卷积和池化是否就难以发挥作用了?为了验证这个想法,我们把图像中的像素打乱顺序再试试。随机打乱像素顺序后图像的形态:

 

 

 

重新定义训练与测试函数:train_perm 和 test_perm,分别对应着加入像素打乱顺序的训练函数与测试函数。与之前相比只是吧data 加入了打乱顺序操作。

 

 

 

在全连接网络上训练与测试:

 

 

 

在卷积神经网络上训练与测试:与上面相比较可以看出,在打乱顺序之后的训练和测试中全连接网络的效果更好。

 

 

 

 

2.CIFAR10 数据集分类

2.1.下载数据

 

 

 

展示加载的数据(CIFAR10) 里面的一些图片:

 

 

 

2.2.创建网络

定义网络,损失函数和优化器:

 

 

 

训练网络:

 

 

 

 

 

 

2.3.测试

从测试集中取出8张图片:

 

 

 

把图片输入模型,看看CNN对图片的识别结果:

 

 

 

看看网络在整个数据集上的表现:(准确率还可以,通过改进网络结构,性能还可以进一步提升)

 

 

 

 

3.使用 VGG16 对 CIFAR10 分类

3.1.定义 dataloader

这里的 transform和dataloader 与之前实验中的定义的有所不同:

 

 

 

 

 

 

3.2. VGG 网络定义

现在的结构基本上是:(64 conv, maxpooling, 128 conv, maxpooling, 256 conv, 256 conv, maxpooling, 512 conv, 512 conv, maxpooling, 512 conv, 512 conv, maxpooling, softmax)

 

 

 

因为 tiny-imagenet 是对200类图像分类,这里把输出修改为200:

 

 

 

3.3.网络训练

 

 

 

使用一个简化版的 VGG 网络,就能够显著地将准确率由 63%,提升到 83.94%:

 

 

 

 

4.感受和总结:

  通过三个实验,让我们体验到了从最简单的全连接网络到卷积神经网络到VGG16的实施以及效率逐步提升。让我对于之前的视频学习有了一个更具体形象的理解,能大概理解代码的意思和内容,但是靠自己依然无法写出(很多库和函数的调用并不是很会)。希望能够慢慢进步!

 

 

 

 

 

posted @ 2020-10-25 15:57  OUCLJF  阅读(114)  评论(0)    收藏  举报