一、视频学习
1.CNN的基本结构
1.1卷积
卷积是对两个实变函数的一种数学操作。
1.2池化
·保留了主要特征的同时减少参数和计算量,防止过拟合,提高模型泛化能力。
·它一般处于卷积层和卷积层之间,全连接层与全连接层之间。
注:池化有两个类型,分别是最大值池化和平均池化,常用最大值池化。
1.3全连接
通常全连接层在卷积神经网络尾部。
2.典型的网络结构
2.1AlexNet
·大数据训练:百万级ImageNet图像数据。
·非线性激活函数:ReLU。
·防止过拟合:Dropout,Data augmentation。
·其他:双GPU实现。
2.2VGG
变得更深,参数同样大多数在FC。
2.3GoogleNet
·多卷积核增加特征多样性。
·V2插入1*1卷积核进行降维减少计算量。
·V3对V2的参数数量进行降低且增加非线性激活函数。
2.4ResNet
·残差的思想:去掉相同的主体部分,从而突出微小变化。
·可以被用来训练非常深的网络。
·有效防止出现梯度消失的现象。
二、代码练习
1.MNIST 数据集分类
# 加载数据(MNIST)
# 显示数据集中的部分图像
接下来创建网络并定义训练和测试函数之后,在不同的网络上训练
# 在小型全连接网络上训练
# 在卷积神经网络上训练
打乱像素顺序再次在两个网络上训练与测试
# 在小型全连接网络上训练
# 在卷积神经网络上训练
·从训练结果明显看出,小型全连接神经网络的性能基本无变化,但是卷积神经网络在打乱顺序后性能明显不如打乱之前。
·因为卷积神经网络会运用到像素的局部关系,打乱顺序后无法利用到像素之间的关系。
2.CIFAR10数据集分类
# 展示CIFAR10里的一些图片
# 训练网络
# 取出八张图片
# 把图片输入模型
Ship→plane、frog→deer
# 查看在整个数据集上的准确率
遇见的一些问题
# 在此步骤时遇见错误
改成就可以了
查了一下是因为 DataLoader 对象被设计为使用 for 循环进行迭代。next() 方法通常与迭代器一起使用,但 DataLoader 对象本身不是迭代器。
3.使用VGG16对CIFAR10分类
# VGG网络定义
#网络训练
#结果
结果显著提升!
遇见的一些问题
·问题一
改成就可以啦
这可能是因为变量 cfg 旨在成为类属性,而不是 __init__ 方法中的局部变量。
·问题二
问题是图片大小不对称,2048改成512*1*1就好啦。
三、问题总结
(1)dataloader里面shuffle 取不同值有什么区别?
Shuffle为是否进行随机打乱顺序的操作,其值为true时数据随机,打乱;为false时数据顺序固定。
(2)transform里,取了不同值,这个有什么区别?
Transform是一种函数或变换,大致分为四大类,裁剪、翻转和旋转、图像变换、使数据增强更灵活。
(3) epoch 和 batch 的区别?
Epoch指整个训练数据集被神经网络完整地遍历一次的次数。
Batch指每次模型权重更新时所使用的样本数。
(4)1x1的卷积和 FC 有什么区别?主要起什么作⽤?
1*1卷积中参数量少,比FC计算速度更快。
在GoogleNet V2中插入1*1卷积核进行降维减少计算量,所以应该还有降维的作用。
(5)residual leanring 为什么能够提升准确率?
可以用来训练更深的网络。
不会出现梯度消失的现象。
(6)代码练习二里,网络和1989年 Lecun 提出的 LeNet 有什么区别?
代码练习二中定义了两层卷积层,一层池化层,三层全连接层。
其中激活函数使用的是ReLU。
(7)代码练习二里,卷积以后feature map 尺⼨会变小,如何应⽤ Residual Learning?
利用padding零填充。
使用1*1的卷积调整feature map的尺寸。
(8)有什么方法可以进⼀步提升准确率?
使用更清楚,、分类明显的数据集。
选择合适的神经网络。
选择合适的激活函数、损失函数、优化器。