深度学习作业_Week2

第一部分:基础练习

卷积神经网络(CNN)的初认识

1.创建/下载数据集

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.定义网络

定义两种不同的网络,分别是全连接和卷积神经网络,两种模型要求有相同大小的参数方便后续的效率比对。

 创建训练函数和测试函数:

 3.测试准确率

从上面的结果不难看出,卷积神经网络的准确率高于全连接网络,相比全连接网络,卷积神经网络多的两个操作过程是卷积和池化,我们想知道是否是由于这个两个过程导致卷积神经网络对特征的提取能力大于全连接,因此我们将通过打乱像素顺序使卷积和池化操作无法发挥作用,重新计算这一组结果,观察两者准确率。

4.打乱像素顺序

 为了打乱后的元素集合,重新定义训练与测试函数, train_perm 和 test_perm,分别对应着加入像素打乱顺序的训练函数与测试函数。这两个函数与之前的基本上完全相同,只是对 data 加入了打乱顺序操作:

 

 5.重新测试

从打乱像素顺序的实验结果来看,全连接网络的性能基本上没有发生变化,但是 卷积神经网络的性能明显下降。可能是由于卷积神经网络,会利用像素的局部关系,但是打乱顺序以后,这些像素间的关系将无法得到利用。

CIFAR10 数据集分类

1.加载库和数据集

2.展示数据集

 当展示数据集时,images, labels = iter(trainloader).next()这行代码报错,原因大概是因为版本问题 iter().next()方法写法更替为next(iter()):

 3.定义网络并训练

 4.选取图片并观察识别结果

 经过长时间训练(整整十轮)再从测试集中选取8张图片,把图片输入模型,看看CNN把这些图片识别成什么: 

我们可以发现有几张图片识别出现了错误,看看放在整个数据集上正确率有多少:

准确率能达到63% 

使用 VGG16对CIFAR10 数据集分类

加载库和数据集以及训练网络的步骤与之前的方法并无太大出入,同光经历十次训练后检验分类正确率如下所示:

 我们能很明显的看到准确率由一开始的63%上升至84%

第二部分:问题总结

1、dataloader 里面 shuffle 取不同值有什么区别?

shuffle的意思就是让序列乱序,本质上就是让序列里面的每一个元素等概率分布在序列的任何位置,进行洗牌。

shuffle取值为True的时候,会随机选取数据集中的数据,数据的输入顺序会被打乱;

shuffle取值为False(默认值)的时候,输入数据的顺序是固定的。

2、transform 里,取了不同值,这个有什么区别?

在数据转换(transform)中,不同的取值可以导致不同的数据转换结果,这会对模型的训练和性能产生不同的影响。以下是一些常见的transform取值及其可能的影响:

随机旋转(Random Rotation):训练过程中数据集中的图像会被随机旋转一定的角度。

随机裁剪(Random Cropping):训练过程中数据集中的图像会被随机裁剪掉一部分。

数据增强(Data augmentation):训练过程中数据集中的图像会被进行一些修改,例如随机翻转、旋转、缩放等。

归一化(Normalization):当取不同值时,数据集中的特征值会被映射到不同的范围内,这可以帮助模型更快地收敛并提高训练的稳定性。

3、epoch 和 batch 的区别?

epoch是指一个完整的训练过程,它定义了学习算法在整个训练数据集中的工作次数。epoch意味着训练数据集中的每个样本都有机会更新内部模型参数,epoch由一个或多个batch组成。

batch指的是将整个训练集分成若干个小块(即批量),每次训练时只使用其中一个批量数据进行训练。在每个batch中,模型将使用当前批量数据进行一次前向传播和反向传播,并更新模型的参数。然后,模型将移动到下一个batch,继续进行训练。

4、1x1的卷积和 FC 有什么区别?主要起什么作用?

从数学计算的角度上来讲似乎1x1的卷积和 FC没有什么区别,但从实际的功能上考虑1x1的卷积和通过加入非线性函数增加非线性,使得网络可以表达出更多的特征,1x1的卷积和可以增加或减少特征图的层数也是FC无法做大的。

全连接的输入是特征图所有元素乘以权重再求和,但是这个权重向量是在设计网络的时候就需要固定的,所以全连接没办法适应输入尺寸的变化。

5、residual learning 为什么能够提升准确率?

残差学习避免了网络层数增加梯度随之消失的问题,并且增加了网络的非线性使其能表达更多的特征,因此能够提高准确率。

6、代码练习二里,网络和1989年 Lecun 提出的 LeNet 有什么区别?

LeNet1使用的是平均值池化,而代码二使用的是最大值池化。

LeNet1的激活函数是sigmoid,而代码二的激活函数是ReLu。

7、代码练习二里,卷积以后feature map 尺寸会变小,如何应用 Residual Learning?

使用填充padding或者使用1*1的卷积。

8、有什么方法可以进一步提升准确率?

(1)优化网络结构,使用更深、更宽的网络

(2)选择更好的激活函数

(3)使用更大的训练集和增加更多的训练时间

(4)对数据进行预处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值