深度学习第二周

卷积是什么

卷积是对两个实变函数的一种数学操作。在图像处理中,图像是以二维矩阵的形式输入到神经网络的,因此我们需要二维卷积。
在这里插入图片描述

给定一个图像 X ∈ R M × N X \in \mathbb{R}^{M \times N} XRM×N,和滤波器 W ∈ R m × n W \in \mathbb{R}^{m \times n} WRm×n

在这里插入图片描述

池化

  • 保留了主要特征的同时减少参数和计算量,防止过拟合,提高模型泛化能力。
  • 它一般处于卷积层与卷积层之间,全连接层与全连接层之间。
  • 池化的常用类型:
    • Max pooling: 最大值池化
    • Average pooling: 平均池化

全连接层

  • 两层之间所有神经元都有权重链接
  • 通常全连接层在卷积神经网络尾部
  • 全连接层参数量通常最大

AlexNet

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示例

首先,加载并归一化 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的网络结构如下图所示:

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、有什么方法可以进一步提升准确率?
使用特征更明显、分类更合理的数据集,数据预处理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值