第三次作业

卷积神经网络学习

首先加载CIFAR10使用torchvision。

 

1. 加载数据 (MNIST)

PyTorch里包含了 MNIST, CIFAR10 等常用数据集,调用 torchvision.datasets 即可把这些数据由远程下载到本地。

 

 

2. 创建网络

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

只要在nn.Module的子类中定义了forward函数,backward函数就会自动被实现(利用autograd)。

并且定义训练和测试函数

 

 

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

可以看出识别的准确率在87%

 

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

需要注意的是,上在定义的CNN和全连接网络,拥有相同数量的模型参数

此时识别的准确率高达95%

 

CNN可以通过卷积和池化两种方式来更好的获取图像中的信息,所以正确率相较全神经网络高。

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

考虑到CNN在卷积与池化上的优良特性,如果我们把图像中的像素打乱顺序,这样 卷积 和 池化 就难以发挥作用了,为了验证这个想法,我们把图像中的像素打乱顺序再试试。

重新定义训练与测试函数,我们写了两个函数 train_perm 和 test_perm,分别对应着加入像素打乱顺序的训练函数与测试函数。

与之前的训练与测试函数基本上完全相同,只是对 data 加入了打乱顺序操作

 

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

 


在卷积神经网络上训练与测试:

从打乱像素顺序的实验结果来看,全连接网络的性能基本上没有发生变化,但是 卷积神经网络的性能明显下降。

这是因为对于卷积神经网络,会利用像素的局部关系,但是打乱顺序以后,这些像素间的关系将无法得到利用。

 

3.2 CIFAR10数据集分类

下面将使用CIFAR10数据集,它包含十个类别:‘airplane’, ‘automobile’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’。CIFAR-10 中的图像尺寸为3x32x32,也就是RGB的3层颜色通道,每层通道内的尺寸为32*32。

展示 CIFAR10 里面的一些图片:

 

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

 训练网络:

 

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

 

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

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

 可以看到,由于色彩变得更为丰富,图像变得更为复杂,即使网络进行了优化,其准确率也仅有62%。

 

使用VGG16对CIFAR10进行分类

VGG是由Simonyan 和Zisserman在文献《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出卷积神经网络模型,其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写。

它是一种新型的卷积神经网络,具有非常良好的准确性。

1. 重新定义 dataloader

 

2. VGG 网络定义

在这VGG网络模型中,我们需要修改一些参数,将其中 self.classifier = nn.Linear(2048, 10)改为 self.classifier = nn.Linear(512, 10),

self.features = self._make_layers(cfg)改为self.features = self._make_layers(self.cfg)

 将网络放在GPU上

3. 网络训练

训练的代码和以前是完全一样的:

 

4. 测试验证准确率:

测试的代码和之前也是完全一样的。

 

 

可以看到,使用一个简化版的 VGG 网络,就能够显著地将准确率由 62%,提升到 83.37%

 

posted @ 2021-10-17 20:35  Drew。  阅读(41)  评论(0)    收藏  举报