卷积神经网络


一、MINIST的分类

1、数据集介绍

	MINIST数据集是由0~9数字图像构成,包含了60000个训练集样本和10000个测试集样本,每个样本是28*28的黑白图片。

2、数据集加载

	数据集加载是有两种方式:第一种,从MNIST官网下载,地址:http://yann.lecun.com/exdb/mnist/  ;第二种,是使用torchvision.datasets和transforms模块加载和处理数据集。下面是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 一种函数或变换,输入目标,进行变换。

训练集与测试集的加载

	这里需要注意的是,对于MNIST数据集的标准化,标准化处理指的是,data减去它的均值,再除以它的标准差,最终data将呈现
	均值为0方差为1的数据分布。这里使用的transforms((0.1307,(0.3081,))指的对数据进行均值是0.1307,标准差是
	0.3081的处理。

3、构建两种模型,一种是小型全连接网络模型,另一种是卷积神经网络模型

全连接网络
卷积网络

	这两个模型的区别在于,全连接网络的第N层的每个神经元和第N-1层的所有神经元相连,第N-1层神经元的输出就是第N层神经元
	的输入,参数量与计算量都会比较大;而卷积神经网络是一个基于窗口滑动的模型,它有两个特点,一个特点是权重共享,另一个就是局
	部连接,参数量与计算量相比少得多。

4、训练模型

	全连接网络模型对输入数据需要做view的处理,把MNIST数据集的数据重塑为n行28*28列的数据。x=x.view(-1,self.input_size)
	以下是两个模型的结果。

结果

5、对每一张图片的像素进行随机打乱再训练模型

在这里插入图片描述
在这里插入图片描述

	训练结果发现,对于全连接神经网络模型的影响不大,影响的是卷积神经网络模型的训练结果,进一步证明了卷积神经网络会注
	重局部联系。	

二、VGG16实现对CIFAR10的分类

1、数据加载

数据加载

1、此次练习与代码联系2中的不同的是,对数据标准化的处理,此次输入的图片全为彩色图片,channel=3,对每一个channel进行标准
化处理。
2、batch_size=128表示每个批次包含128张图像,shuffle表示是否打乱数据集顺序。
3、num_works的工作是提前将几个batch加入到RAM中供训练模型迭代使用,它的好处是batch速度快,坏处是内存开销大,加重了CPU负担。

2、模型训练

Mini-batch 是指从训练数据集中选择的较小的数据子集。在训练模型时,通常将整个训练数据集划分为多个 mini-batch。每个 mini-batch 包含一定数量的训练样本。模型使用每个 mini-batch 的样本来进行前向传播、计算损失和反向传播,然后根据这些样本的梯度更新模型的参数。使用 mini-batch 的主要目的是减少计算开销和内存占用,并提高训练的效率。

在这里插入图片描述

三、问题总结

1. dataset的使用
torchvision主要处理图像数据,包含一些常用的数据集、模型、转换函数等。torchvision.dataset类是一些加载数据的函数以及常用的数据集接口,设计上继承 torch.utils.data.Dataset,数据集比如MNIST、CIFAR10\100、ImageNet、COCO等。加载数据的同时使用torchvision.transforms对数据进行各种处理,可以使用transforms.Compose将数据的各种处理写在一起,比如对图片的randomcrop,RandomHorizontalFlip,RandomVerticalFlip,ToTensor,Normalize等处理。
compose 以CIFAR10数据集加载和处理为例,
在这里插入图片描述
root:数据集的根目录,如果download设置为True,则将保存到该目录。
train:如果为True,则从训练集创建数据集,否则(即为Flase)从测试集创建。
transform:接受PIL图像并返回变换后图像的function/transform。
download:如果为true,则从internet下载数据集并将其放在根目录中。如果数据集已下载,则不会再次下载。
2. dataloader 里面 shuffle 取不同值有什么区别?
dataloader第一个参数为dataset;第二个参数为一个batch的大小,第三个则为shuffle参数,如果为True,则表示每个epoch都会打乱数据集,否则反之;第四个参数为work进程的数目。
3. transform 里,取了不同值,这个有什么区别?
transforms是指常见的图像变换功能,经常与compose功能使用。主要有以下几类,针对PIL image的处理,针对torch.tensor的处理,转换处理,自动转化处理以及转化函数(更加细粒度的图像处理函数)。
(1)针对PIL image的处理
①裁剪
a.中心裁剪:transforms.CenterCrop(size) 依据给定的size从中心裁剪
b.随即裁剪 torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode=‘constant’) 依据size随即裁剪
c.随机长宽比裁剪 class torchvision.transforms.RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(0.75, 1.33333 33333333333), interpolation=2) 随即长宽比裁剪原始图片
d、上下左右中心裁剪后翻转 torchvision.transforms.TenCrop(size, vertical_flip=False) 对图片进行上下左右以及中心裁剪,然后全部翻转(水平或者垂直),获得 10 张图片,返回一个 4D-tensor。
②翻转
a.依概率水平翻转torchvision.transforms.RandomHorizontalFlip(p=0.5)
b.依概率垂直翻转transforms.RandomVerticalFlip(p=0.5)
c.随机旋转 torchvision.transforms.RandomRotation(degrees, resample=False, expand=False, center=None, fill=None) degree随机角度

(2)针对torch.tensor的处理
a.标准化处理 torchvision.transforms.Normalize(mean, std) 对数据按通道进行标准化,即先减均值,再除以标准差,注意是 hwc
b.线性变换 torchvision.transforms.LinearTransformation(transformation_matrix) 对矩阵做线性变化,可用于白化处理!
c.随机选择图像中的矩形区域并删除其像素torchvision.transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)
(3)数据形式转化处理
a.转为tensor,并归一化至[0,1] 。transforms.ToTensor 将 PIL Image 或者 ndarray 转换为 tensor
b.转为PIL Image类型。torchvision.transforms.ToPILImage(mode=None)将 tensor 或者 ndarray 的数据转换为 PIL Image 类型数据
4. epoch 和 batch 的区别?
Epoch:是指的将整个训练集传入神经网络的次数。每个epoch会遍历整个数据集。
Batch:是指每次传递给神经网络的一部分数据集。
5. 1x1的卷积和 FC 有什么区别?主要起什么作用?
1×1的卷积作用在局部区域,是常规的卷积操作,只考虑一个像素点的信息;而全连接是作用在整个区域,并且进行的是线性变换。
1×1的卷积核可以给图片降维和升维,控制网络复杂度以及在某些模型中进行特征融合(YOLO);并且1×1的卷积核可以减少参数量和计算量。
FC层主要的作用是前一层的特征进行线性组合,并通过激活函数进行非线性变换,用于学习输入特征之间的复杂关系,通常用于组后的分类任务,将网络的输入映射到指定的类别数量上。
6. residual leanring 为什么能够提升准确率?
Residual learning是残差学习,通过引入残差连接提升准确率,原因如下:
(1)解决梯度消失问题。深层网络经常会出现梯度消失问题,导致深层网络难以训练,通过引入残差链接,把上一层的输入直接加入到后一层的输出,解决了梯度消失的问题。
(2)解决退化问题。随着网络层数的增加,准确率反而会下降的现象。通过残差学习,网络通过去点相同的主体部分,从而突出微小的变化,从而避免了退化问题的发生。
(3)增加更强的非线性拟合能力。
不加残差的梯度计算:在这里插入图片描述
加入残差的梯度计算:在这里插入图片描述
7. 代码练习二里,网络和1989年 Lecun 提出的 LeNet 有什么区别?
激活函数不同:CNN网络使用的ReLU激活函数;而LeNet使用的是Sigmoid激活函数和tanh函数
池化方式不同:CNN采用的是MaxPool;而LeNet采用的是AvgPool
8. 代码练习二里,卷积以后feature map 尺寸会变小,如何应用 Residual Learning?
可以使用1×1的卷积或者使用填充padding的方法来调整feature map的尺寸。
9. 有什么方法可以进一步提升准确率?
(1)增加网络的深度
(2)增大数据集,比如各种数据增强的方法。
(3)调整优化算法
(4)正则化方法,包括L1、L2、Dropout等。

四、动态神经网络(待更新)

论文学习:
● 【NeurIPS2019】CondConv: Conditionally Parameterized Convolutions for Efficient Inference
● 【CVPR2021】Dynamic Region-Aware Convolution

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值