第3次作业:卷积神经网络
一、视频学习心得及问题总结
1、卷积神经网络可以用于分类、检索、检测、分割、人脸识别(表情识别)、图像生成、图像风格转化、自动驾驶
2、传统神经网络是和图片上的每一个像素点连接,参数太多,容易过拟合,而卷积神经网络是局部关联,参数共享。池化在保留了主要特征的同时减少参数和计算量,防止过拟合,提高模型泛化能力。
3、卷积神经网络典型结构有:AlexNet(有百万级ImageNet图像数据训练,使用了非线性激活函数ReLU,使用Dropout,Data,augemntation防止过拟合,使用双GPU实现),ZFNet(网络结构与AlexNet相同,将卷积层1中的感受野大小由1111改为77,步长由4改为2;卷积层3,4,5中的滤波器个数由384,384,256改为512,512,1024);VGG(一个更深网络);GoogleNet(网络包含22个才参数的层,独立成块的层总共有100个,参数量大概是Alexnet的1/12,没有FC层);ResNet(可以被用来训练非常深的网络)
二、代码练习
(一)卷积神经网络(CNN)
1、加载数据(MNIST)
PyTorch里包含了 MNIST, CIFAR10 等常用数据集,调用 torchvision.datasets 即可把这些数据由远程下载到本地,可以使用如下函数:
torchvision.datasets.MNIST(root, train=True, transform=None, target_transform=None, download=False)
(1)root 为数据集下载到本地后的根目录,包括 training.pt 和 test.pt 文件
(2)train,如果设置为True,从training.pt创建数据集,否则从test.pt创建。
(3)download,如果设置为True, 从互联网下载数据并放到root文件夹下。
(4)transform, 一种函数或变换,输入PIL图片,返回变换之后的数据。
(5)target_transform 一种函数或变换,输入目标,进行变换。


显示数据集中的部分图像

2、创建网络


定义训练和测试函数


3、在小型全连接网络上训练

4、在卷积神经网络上训练

通过上面的测试结果,可以发现,含有相同参数的 CNN 效果要明显优于 简单的全连接网络,是因为 CNN 能够更好的挖掘图像中的信息,主要通过两个手段:
(1)卷积:Locality and stationarity in images
(2)池化:Builds in some translation invariance
池化在保留了主要特征的同时减少参数和计算量,防止过拟合,提高模型泛化能力。
5、打乱像素顺序再次在两个网络上训练与测试:
考虑到CNN在卷积与池化上的优良特性,如果我们把图像中的像素打乱顺序,这样 卷积 和 池化 就难以发挥作用了,为了验证这个想法,我们把图像中的像素打乱顺序再试试。
首先下面代码展示随机打乱像素顺序后,图像的形态:


重新定义训练与测试函数,写了两个train_perm 和 test_perm,分别对应着加入像素打乱顺序的训练函数与测试函数。与之前的训练与测试函数基本上完全相同,只是对 data 加入了打乱顺序操作。



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



(二)视觉数据
对于视觉数据,PyTorch 创建了一个叫做 totchvision 的包,该包含有支持加载类似Imagenet,CIFAR10,MNIST 等公共数据集的数据加载模块 torchvision.datasets 和支持加载图像数据数据转换模块 torch.utils.data.DataLoader。
首先,加载并归一化 CIFAR10 使用 torchvision 。torchvision 数据集的输出是范围在[0,1]之间的 PILImage,将他们转换成归一化范围为[-1,1]之间的张量 Tensors。
下面展示 CIFAR10 里面的一些图片:


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

训练网络:


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


将图片输入模型,看看CNN把这些图片识别成什么:


可以看到,有几个都识别错了,看看网络在整个数据集上的表现:


通过改进网络结构,性能还可以进一步提升。
(三)使用 VGG16 对 CIFAR10 分类
1. 定义 dataloader

2、VGG网络定义

初始化网络,根据实际需要,修改分类层。因为 tiny-imagenet 是对200类图像分类,这里把输出修改为200。

3、网络训练


4、测试验证准确率:


可以看到,使用一个简化版的 VGG 网络,就能够显著地将准确率由 64%,提升到 84.92%。
个人想法:
通过这一次的代码练习,我学习了如何使用PyTorch进行CNN的训练与测试,同时学会使用了池化与卷积操作,并且了解了他们的作用。 我知道PyTorch里包含了 MNIST, CIFAR10 等常用数据集,调用 torchvision.datasets 即可把这些数据由远程下载到本地。我对传统传统神经网络和CNN的区别有了更深的体会。同时通过测试结果我发现,含有相同参数的 CNN 效果要明显优于简单的全连接网络,这是因为CNN通过卷积和池化,局部关联,参数共享,同时池化在保留了主要特征的同时减少参数和计算量,防止过拟合,提高模型泛化能力。在打乱像素顺序之后,全连接网络的性能基本上没有发生变化,但是卷积神经网络的性能明显下降。这是因为对于卷积神经网络,会利用像素的局部关系,但是打乱顺序以后,这些像素间的关系将无法得到利用。所有传统神经网络和CNN各有利弊。
对于视觉数据,PyTorch 创建了一个叫做 totchvision 的包,该包含有支持加载类似Imagenet,CIFAR10,MNIST 等公共数据集的数据加载模块 torchvision.datasets 和支持加载图像数据数据转换模块 torch.utils.data.DataLoader。最终对整个数据集识别的准确率相对一般,通过改进网络结构,性能还可以进一步提升。VGG是由Simonyan 和Zisserman在文献《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出卷积神经网络模型,其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写。通过对比可以看出,使用一个简化版的 VGG 网络,就能够显著地将准确率由 64%,提升到 84.92%。
浙公网安备 33010602011771号