概述
卷积是什么
卷积是对两个实变函数的一种数学操作。在图像处理中,图像是以二维矩阵的形式输入到神经网络的,因此我们需要二维卷积。
给定一个图像 X ∈ R M × N X in mathbb{R}^{M times N} X∈RM×N,和滤波器 W ∈ R m × n W in mathbb{R}^{m times n} W∈Rm×n
池化
- 保留了主要特征的同时减少参数和计算量,防止过拟合,提高模型泛化能力。
- 它一般处于卷积层与卷积层之间,全连接层与全连接层之间。
- 池化的常用类型:
- Max pooling: 最大值池化
- Average pooling: 平均池化
全连接层
- 两层之间所有神经元都有权重链接
- 通常全连接层在卷积神经网络尾部
- 全连接层参数量通常最大
AlexNet
AlexNet通过DropOut(随机失活)和数据增强(Data Augmentation)来防止数据的过拟合,同时采用ReLU激活函数,收敛速度远快于sigmod,同时可以解决梯度消失的问题。
VGG
GoogleNet
- 原始inception采用多卷积核来增加特征多样性
- Inception V2插入1x1卷积核进行降维
- Inception V3用小的卷积核代替大的卷积核,降低了参数量
ResNet
残差学习网络的思想:去掉相同的主体部分,从而突出微小的变化。
将 x x x本身加入到输出中,使得倒数的结果永远都不为零。
MNIST 数据集分类
构建简单的CNN对 mnist 数据集进行分类,同时学习池化与卷积操作的基本作用。
- 1.加载数据
PyTorch里包含了 MNIST, CIFAR10 等常用数据集,调用 torchvision.datasets 即可把这些数据由远程下载到本地。 - 2.创建网络
定义网络时,需要继承nn.Module,并实现它的forward方法,把网络中具有可学习参数的层放在构造函数init中。只要在nn.Module的子类中定义了forward函数,backward函数就会自动被实现(利用autograd)。其中创建了两个网络:小型的全连接网络和卷积神经网络。 - 3.网络训练
- 小型的全连接网络
- 卷积神经网络通过上面的测试结果,可以发现,含有相同参数的 CNN 效果要明显优于 简单的全连接网络,是因为 CNN 能够更好的挖掘图像中的信息,主要通过两个手段:
- 卷积:Locality and stationarity in images
- 池化:Builds in some translation invariance
- 4.打乱像素顺序再次在两个网络上训练与测试
全连接网络:卷积神经网络:可以看出卷积神经网络的性能大大下降。
使用 CNN 对 CIFAR10 数据集分类
对于视觉数据,PyTorch 创建了一个叫做 totchvision 的包,该包含有支持加载类似Imagenet,CIFAR10,MNIST 等公共数据集的数据加载模块 torchvision.datasets 和支持加载图像数据数据转换模块 torch.utils.data.DataLoader。
下面将使用CIFAR10数据集,它包含十个类别:‘airplane’, ‘automobile’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’。CIFAR-10 中的图像尺寸为3x32x32,也就是RGB的3层颜色通道,每层通道内的尺寸为32*32。
首先,加载并归一化 CIFAR10 使用 torchvision 。torchvision 数据集的输出是范围在[0,1]之间的 PILImage,我们将他们转换成归一化范围为[-1,1]之间的张量 Tensors。
- 1.加载数据
- 2.创建网络并训练网络
- 3.测试将图片输入模型后得到结果:
其中有一半识别错了,网络在整个数据集上的准确率为62%
使用 VGG16 对 CIFAR10 分类
VGG是由Simonyan 和Zisserman在文献《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出卷积神经网络模型,其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写。
该模型参加2014年的 ImageNet图像分类与定位挑战赛,取得了优异成绩:在分类任务上排名第二,在定位任务上排名第一。
VGG16的网络结构如下图所示:
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
-
1.加载数据
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
transform_train = transforms.Compose([
transforms.RandomCrop(32, padding=4),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
transform_test = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform_test)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)
testloader = torch.utils.data.DataLoader(testset, batch_size=128, shuffle=False, num_workers=2)
classes = ('plane', 'car', 'bird', 'cat',
'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
- 2.定义VGG网络
网络结构:
64 conv, maxpooling,
128 conv, maxpooling,
256 conv, 256 conv, maxpooling,
512 conv, 512 conv, maxpooling,
512 conv, 512 conv, maxpooling,
softmax
遇到问题:name ‘cfg’ is not defined 改为self.cfg之后问题解决
self.features = self._make_layers(self.cfg)
- 3.网络训练
遇到问题:mat1 and mat2 shapes cannot be multiplied (128x512 and 2048x10), 因为图像大小不一样,所以要把class里面的self.classifier = nn.Linear(512, 10)(原本是2048)
self.classifier = nn.Linear(512, 10)
- 4.测试
可以看到准确率由62%提升到了83.15%。
问题探讨
1、dataloader 里面 shuffle 取不同值有什么区别?
shuffle取值为True的时候,会随机选取数据集中的数据,数据的输入顺序会被打乱;shuffle取值为False(默认值)的时候,输入数据的顺序是固定的。
2、transform 里,取了不同值,这个有什么区别?
不同之处在于训练部分的数据集增加了数据的增强,利用随机裁剪以及随机翻转,以增强模型的泛化能力。
3、epoch 和 batch 的区别?
Batch大小是在更新模型之前处理的多个样本。Epoch数是通过训练数据集的完整传递次数。Batch大小必须大于或等于1且小于或等于
训练数据集中的样本数。而epoch可以设置为1和无穷大之间的整数值。
4、1x1的卷积和 FC 有什么区别?主要起什么作用?
这个我也不是很清楚,我看网上的回答有说一样的。我理解这两个就是一个东西。作用:将前面经过多次卷积后高度抽象化的特征进行整合,然后可以进行归一化,对各种分类情况都输出一个概率,之后的分类器可以根据全连接得到的概率进行分类。
5、residual leanring 为什么能够提升准确率?
残差网络结构图中,通过“shortcut connections(捷径连接)”的方式,直接把输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,那么H(x)=x。于是,ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) := H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。
6、代码练习二里,网络和1989年 Lecun 提出的 LeNet 有什么区别?
区别在于LeNet使用的sigmoid激活函数,而实验中使用的则是ReLU激活函数。
7、代码练习二里,卷积以后feature map 尺寸会变小,如何应用 Residual Learning?
通过增加短路机制形成残差学习。
8、有什么方法可以进一步提升准确率?
使用特征更明显、分类更合理的数据集,数据预处理。
最后
以上就是机智苗条为你收集整理的深度学习第二周卷积是什么池化全连接层AlexNetVGGGoogleNetResNetMNIST 数据集分类使用 CNN 对 CIFAR10 数据集分类使用 VGG16 对 CIFAR10 分类问题探讨的全部内容,希望文章能够帮你解决深度学习第二周卷积是什么池化全连接层AlexNetVGGGoogleNetResNetMNIST 数据集分类使用 CNN 对 CIFAR10 数据集分类使用 VGG16 对 CIFAR10 分类问题探讨所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复