卷积神经网络学习

时间:2024-02-25 19:47:23

Part 1 视频学习心得及问题总结

  • 通过对视频的学习,了解了卷积神经网络整体的内容和一些思想,卷积神经网络主要包括卷积,池化,激活函数,损失函数等部分,通过不同的卷积核对数据进行不同的提取,池化对提取的数据进行收缩,减小数据的规模,可能是之前的视频学习没看明白,不太理解激活的函数的作用,最后进行损失函数的分析,又反过来修改卷积核等参数,如此不断进行,使预测更加准确。
  • 主要的问题就是不太理解激活函数。

Part2 代码练习

1. CNN_MNIST

  • MNIST数据集的引入

  • 显示数据集中的部分图像

  • 网络创建
    定义网络时,需要继承nn.Module,并实现它的forward方法,把网络中具有可学习参数的层放在构造函数init中。只要在nn.Module的子类中定义了forward函数,backward函数就会自动被实现(利用autograd)。

  • 定义训练和测试函数

  • 在小型全连接网络上训练(Fully-connected network)

  • 在卷积神经网络上训练
    需要注意的是,上在定义的CNN和全连接网络,拥有相同数量的模型参数

通过上面的测试结果,可以发现,含有相同参数的 CNN 效果要明显优于 简单的全连接网络,是因为 CNN 能够更好的挖掘图像中的信息,主要通过两个手段:

  • 卷积:Locality and stationarity in images
  • 池化:Builds in some translation invariance

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

首先下面代码展示随机打乱像素顺序后,图像的形态:

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

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

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

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

2. CNN_CIFAR10(数据集)

导入数据集并展示一些图片

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

训练网络:

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

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

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

  • 60 多的准确率真的可以吗??

3. 使用 VGG16 对 CIFAR10 分类

  • VGG是由Simonyan 和Zisserman在文献《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出卷积神经网络模型,其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写。该模型参加2014年的 ImageNet图像分类与定位挑战赛,取得了优异成绩:在分类任务上排名第二,在定位任务上排名第一。

定义 dataloader

VGG 网络定义

  • 这里对代码进行了小小的改动,是因为后面报错了,不过问题不大。
  • 一个是cfg 报未定义,加一个self 就可以了,已经定义过了。
  • 另一个是对nn.Linear 参数的修改,因为后面出现RuntimeError: mat1 and mat2 shapes cannot be multiplied (128x512 and 2048x10)报错,就把2048改成了512。

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

  • 200 在哪里??不明白。

网络训练

测试验证准确率: