卷积神经网络(CNN)

深度卷积神经网络中,有如下特性

  • 很多层: compositionality

  • 卷积: locality + stationarity of images

  • 池化: Invariance of object class to translations【第二部分】代码练习_数据

 


1. 加载数据 (MNIST)

PyTorch里包含了 MNIST, CIFAR10 等常用数据集,调用 torchvision.datasets 即可把这些数据由远程下载到本地,下面给出MNIST的使用方法:

torchvision.datasets.MNIST(root, train=True, transform=None, target_transform=None, download=False)

  • root 为数据集下载到本地后的根目录,包括 training.pt 和 test.pt 文件

  • train,如果设置为True,从training.pt创建数据集,否则从test.pt创建。

  • download,如果设置为True, 从互联网下载数据并放到root文件夹下

  • transform, 一种函数或变换,输入PIL图片,返回变换之后的数据。

  • target_transform 一种函数或变换,输入目标,进行变换。

另外值得注意的是,DataLoader是一个比较重要的类,提供的常用操作有:batch_size(每个batch的大小), shuffle(是否进行随机打乱顺序的操作), num_workers(加载数据的时候使用几个子进程)

 

【第二部分】代码练习_全连接_02

显示数据集中的部分图像

【第二部分】代码练习_数据集_03

 


2. 创建网络

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

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


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

【第二部分】代码练习_数据集_04

 


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

需要注意的是,上在定义的CNN和全连接网络,拥有相同数量的模型参数【第二部分】代码练习_全连接_05

 

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

  • 卷积:Locality and stationarity in images

  • 池化:Builds in some translation invariance


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

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

    首先下面代码展示随机打乱像素顺序后,图像的形态:【第二部分】代码练习_池化_06

     

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

 【第二部分】代码练习_数据_07

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

【第二部分】代码练习_全连接_08

 


6.对于视觉数据

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

训练网络并从测试集中读取8张图片

【第二部分】代码练习_数据集_09

 CNN识别

【第二部分】代码练习_卷积_10

网络在整个数据集上的表现【第二部分】代码练习_数据_11

 

通过改进网络结构,性能还可以进一步提升。在 Kaggle 的LeaderBoard上,准确率高的达到95%以上。


7.使用 VGG16 对 CIFAR10 分类

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

该模型参加2014年的 ImageNet图像分类与定位挑战赛,取得了优异成绩:在分类任务上排名第二,在定位任务上排名第一。

16层网络的结节信息如下:

  • 01:Convolution using 64 filters

  • 02: Convolution using 64 filters + Max pooling

  • 03: Convolution using 128 filters

  • 04: Convolution using 128 filters + Max pooling

  • 05: Convolution using 256 filters

  • 06: Convolution using 256 filters

  • 07: Convolution using 256 filters + Max pooling

  • 08: Convolution using 512 filters

  • 09: Convolution using 512 filters

  • 10: Convolution using 512 filters + Max pooling

  • 11: Convolution using 512 filters

  • 12: Convolution using 512 filters

  • 13: Convolution using 512 filters + Max pooling

  • 14: Fully connected with 4096 nodes

  • 15: Fully connected with 4096 nodes

  • 16: Softmax

定义 dataloader与VGG网络,根据实际需要,修改分类层。

【第二部分】代码练习_数据集_12

 需修正传入参数,并将最终池化层删除使之匹配全连接层输出2048

【第二部分】代码练习_池化_13

 最终测试验证准确率

【第二部分】代码练习_池化_14