第三次作业
卷积神经网络学习
1. 加载数据 (MNIST)

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),

将网络放在GPU上

3. 网络训练
训练的代码和以前是完全一样的:

4. 测试验证准确率:
测试的代码和之前也是完全一样的。

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



浙公网安备 33010602011771号