第一部分:代码练习
卷积神经网络在MNIST 数据集分类
在导入库,加载完数据之后,显示数据集中的部分图像
定义全连接网络和卷积神经网络,训练函数和测试函数,然后分别在小型全连接网络上和卷积神经网络上,进行训练并比较结果
可以很明显的发现相同参数下的卷积神经网络训练效果要优于小型全连接网络,这是因为卷积神经网络进行了,卷积和池化两种操作,能够更好的挖掘图像中的信息
打乱像素顺序,并展示图像的形态,可以看见倒数两行图片模糊了
然后再次在全连接网络和卷积神经网络进行训练与测试
可以看到因为打乱了像素顺序,卷积神经网络无法通过池化和卷积利用像素的局部关系,导致性能明显下降,甚至低于全连接网络,同时全连接网络性能保持稳定
卷积神经网络在CIFAR10 数据集分类
导入重要的库之后,展示数据集中的一些图片
这里会出现一个错误 ,在查阅next函数的使用方法之后,修改代码,next函数要和iter函数一起使用,而不是作为iter函数的属性
接下来定义网络,损失函数,优化器,并进行训练
从测试集中取出八张图片,并放入模型中,查看网络模型识别结果 ,可以看到识别效果相当糟糕
最后查看网络在整个数据集上的效果
准确率并不高需要进一步提升
VGG16在CIFAR10 数据集分类
定义VGG网络
这里会出现两个错误,在定义的时候不仔细看看不出来,但在运行之后的代码会报错,需要修改
self._make_layers(cfg)中的参数cfg为指向self会报错未定义,需要修改为self._make_layers(self.cfg)
nn.Linear(2048, 10)中的参数2048与网络最后一层的参数512不匹配,不能相乘,需要修改为nn.Linear(512, 10)
然后进行训练和测试
可以看到,即使是使用简化版的VGG对准确率提升也非常大,从65%到85%
第二部分:问题总结
1.dataloader 里面 shuffle 取不同值有什么区别?
当shuffle为True时,打印的数据集将会被随机打乱顺序
当shuffle为False时,打印的数据集将不会被随机打乱顺序
2.transform 里,取了不同值,这个有什么区别?
input[channel] = (input[channel] - mean[channel]) / std[channel]
当取0.5时,就是:((0,1)-0.5)/0.5=(-1,1),图像正常显示
因为要做分母不能取0,取0.1看看效果,就是((0,1)-0.1)/0.5=(-0.2,1.8),得到结果是图像整体非常白,甚至看不清物体
取0.9看看效果,就是((0,1)-0.9)/0.5=(-1.8,0.2),得到结果是图像整体偏暗,影响识别物体
3.epoch 和 batch 的区别?
Epoch(批次)是指将整个数据集迭代一遍的过程。在一个 Epoch 中,模型会对整个数据集进行一次前向传播和反向传播,更新所有的参数。
Batch(批量)是指为了加速训练而将大规模数据划分成小批次数据的过程。每个 Batch 中包含多个样本,模型会对这些样本进行前向传播和反向传播,计算出参数的梯度并进行更新。Batch 的大小决定了每次迭代更新参数的样本数量,也对模型收敛速度和效果有一定影响。
4.1x1的卷积和 FC 有什么区别?主要起什么作用?
FC的输入尺寸是固定的只能是n x 1 x 1,并需要将数据展开成一维,1✖️1卷积层的输入尺寸是任意的,数据不需要展开,并且可以升维降维,减少参数量,引入非线性的激活函数,可以实现信息的跨通道整合和交互
5.residual leanring 为什么能够提升准确率?
因为使用了残差算法,避免了在网络加深的同时出现的梯度消失现象,第一周的学习让我们知道随着网络的加深,准确率会越来越高。
6.代码练习二里,网络和1989年 Lecun 提出的 LeNet 有什么区别?
代码练习二中的网络使用relu激活函数,最大池化,有三层全连接层
lenet使用sigmoid激活函数,平均池化,只有一层全连接层
7.代码练习二里,卷积以后feature map 尺寸会变小,如何应用 Residual Learning?
使用带padding的卷积改变feature map的尺寸,再应用residual learni
8.有什么方法可以进一步提升准确率?
1.使用数据增强技术,图像切割,图像翻转,图像白化等
2.使用权重衰减,dropout,批正则化,lrn
3.加深网络层数