卷积神经网络(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(加载数据的时候使用几个子进程)
显示数据集中的部分图像
2. 创建网络
定义网络时,需要继承nn.Module,并实现它的forward方法,把网络中具有可学习参数的层放在构造函数init中。
只要在nn.Module的子类中定义了forward函数,backward函数就会自动被实现(利用autograd)。
3. 在小型全连接网络上训练(Fully-connected network)
4. 在卷积神经网络上训练
需要注意的是,上在定义的CNN和全连接网络,拥有相同数量的模型参数
通过上面的测试结果,可以发现,含有相同参数的 CNN 效果要明显优于 简单的全连接网络,是因为 CNN 能够更好的挖掘图像中的信息,主要通过两个手段:
-
卷积:Locality and stationarity in images
-
池化:Builds in some translation invariance
5.打乱像素顺序再次在两个网络上训练与测试
考虑到CNN在卷积与池化上的优良特性,如果我们把图像中的像素打乱顺序,这样 卷积 和 池化 就难以发挥作用了,为了验证这个想法,我们把图像中的像素打乱顺序再试试。
首先下面代码展示随机打乱像素顺序后,图像的形态:
在卷积神经网络上训练与测试:
6.对于视觉数据
PyTorch 创建了一个叫做 totchvision 的包,该包含有支持加载类似Imagenet,CIFAR10,MNIST 等公共数据集的数据加载模块 torchvision.datasets 和支持加载图像数据数据转换模块 torch.utils.data.DataLoader。首先,加载并归一化 CIFAR10 使用 torchvision 。torchvision 数据集的输出是范围在[0,1]之间的 PILImage,我们将他们转换成归一化范围为[-1,1]之间的张量 Tensors。
训练网络并从测试集中读取8张图片
CNN识别
网络在整个数据集上的表现
通过改进网络结构,性能还可以进一步提升。在 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网络,根据实际需要,修改分类层。
需修正传入参数,并将最终池化层删除使之匹配全连接层输出2048
最终测试验证准确率