第三次作业
1. 视频学习
卷积神经网络
基本应用
分类 检索 检测 分割
深度学习
1.搭建神经网络结构
2.找到合适的损失函数
3.找到合适的优化函数,更新参数

损失函数(用于衡量吻合度)

全连接网络处理图像的问题
1.参数太多:权重矩阵参数太多导致过拟合
卷积神经网络的解决方式
局部关联,参数共享?
(同层神经元间参数共享?)
参考资料:https://blog.csdn.net/yjl9122/article/details/70198357
卷积(对两个实变函数的一种数学操作)
卷积核?参数是怎么选取的
padding零补充
深度(为filter个数,本层深度由上层卷积核数目决定)
不同的卷积核关注不同的信息

池化(类似缩放)
识别类工作用最大值池化

池化分类:

全连接
百度百科:全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的。例如在VGG16中,第一个全连接层FC1有4096个节点,上一层POOL2是7*7*512 = 25088个节点,则该传输需要4096*25088个权值,需要耗很大的内存。
激活函数
百度百科:如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机。
如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
防止过拟合
1.增加标注数据集
2.减少参数
AlexNet:
dropout(防止过拟合)
数据增强


GoogleNet:

inception???

v2降维?

v3


参考资料:https://zhuanlan.zhihu.com/p/52802896
ResNet:

代码:不同激活函数;是否加入dropout
总结:
深度学习由构建神经网络、利用合适损失函数、利用合适优化函数更新参数并不断循环往复完成。传统神经网络对图像整体把握较好,但参数量较大,容易过拟合;卷积神经网络更注重图像的局部特征,参数量较小,降低过拟合的可能。卷积神经网络由卷积层、池化层、全连接层、激活函数等构成。需要注意防止过拟合(dropout),梯度消失(relu)等。优秀的卷积神经网络应该是运用合适的方法尽量增加深度而避免过拟合、梯度消失等。
问题:
1.卷积神经网络的特性:局部关联,参数共享。具体是怎么体现的?(同层神经元间参数共享吗)
2.我们知道不同的卷积核关注不同的内容。那么卷积核内容、参数是怎么得到的?
3.不理解inception的结构以及降维是怎么完成的。
2. 代码练习
●1 .MNIST 数据集分类
传统学习网络FC2Layer:

可以看到,该学习网络仅用了全连接层,各层之间采用了Relu激活函数。
Logsoftmax()用处是什么呢?
Sequential():

参考资料:https://blog.csdn.net/dss_dssssd/article/details/82980222
LogSoftmax():

参考资料:https://blog.csdn.net/lanchunhui/article/details/51248184
卷积神经网络CNN:

该卷积神经网络结构为:卷积层1- Relu -池化层2-卷积层2- Relu -池化层2-全连接层1- Relu -全连接层2。
除了卷积层与全连接层后还有什么时候要用到激活函数呢?
torch.nn.Conv2d():?卷积核在哪里体现?

参考资料:https://blog.csdn.net/qq_34243930/article/details/107231539
卷积核通道数与卷积输出层通道数(深度):
参考资料:https://blog.csdn.net/qq_41088475/article/details/105766758
FC2Layer:

CNN:

可对比得出:CNN模型正确率高于FC2Layer模型,平均损失小。且FC2Layer测试花费了31s,CNN仅花费17s。(但是fnn测试明显有一个十几秒的启动过程?)
打乱像素顺序后:
FC2Layer:

CNN:

打乱像素顺序后,CNN的正确率低于FC2Layer。这次两者测试的时间相同,均为17s。
为什么这种情况下FC2Layer会优于CNN?什么情况下CNN才是更优解呢?
(猜想:由于FC2Layer从大体上把握图像特点,打乱像素顺序对其影响不大。而CNN是从局部特征入手,打乱像素顺序对其来说就是完全不同的两张图了)
● CIFAR10 数据集分类


Net网络结构:卷积层1-Relu-池化层-卷积层2- Relu -池化层-全连接函数1- Relu -全连接函数2- Relu -全连接函数3
参考资料:https://www.cnblogs.com/CATHY-MU/p/7760570.html

梯度归零:

参考资料:https://blog.csdn.net/PanYHHH/article/details/107361827
正向传播、反向传播:

参考资料:https://www.jianshu.com/p/765d603c76a0
● 使用 VGG16 对 CIFAR10 分类

这里有两个问题:
1.cfg应该要定义在VGG外
2.图片的大小应为512

该VGG网络结构:按照cfg中内容,数字为构建卷积层的参数,M为构建最大池化层,依次构建网络结构(卷积-池化-卷积-池化-卷积-卷积-池化……)。每个卷积层后通过bathnorm2d()将数据归一化,再通过relu。
torch.nn.BathNorm2d():
在卷积神经网络的卷积层之后总会添加BatchNorm2d进行数据的归一化处理,这使得数据在进行Relu之前不会因为数据过大而导致网络性能的不稳定


归一化:
数据归一化是当数据 x 按照最小值中心化后,再按极差(最大值-最小值)进行缩放。最终的数据移动了最小值个单位,并且会被收敛到【0,1】之间。归一化的目的就是使得预处理的数据被限定在一定的范围内(比如[0,1]或者[-1,1]),从而消除奇异样本数据导致的不良影响。
作用:
1.归一化后加快了梯度下降求最优解的速度;
2.归一化有可能提高精度(如KNN)
参考资料:https://blog.csdn.net/zenghaitao0128/article/details/78361038
self.classifier:?
这个函数的作用?
_make_layers:
make layer是对每一层的层自定义,有点类似于nn.Sequential(),但是layer是将每一层所要的网络或者激活函数归一化存在一个数组,目前看来他的优点,可以用一个for循环去定义整个网络,不用对对每一层都写同样的函数。从而只改变他的参数就行了。
上小节的Net网络:训练时长3分半

VGG:六分钟

虽然时间增加了,但是正确率大幅增加,可以看出合适的卷积神经网络结构对训练模型大有裨益。
总结:一般情况下卷积神经网络的效果优于传统神经网络,但传统神经网络也有更适用的场景。optimizer.zero_grad()使梯度归零,防止与上个数据相关,写在反向传播与梯度下降之前。Sequential()、forward()、make layer()三个函数都可作为构建网络架构的容器,make layer()可以通过循环而简化编码。torch.nn.BathNorm2d():归一化处理,加快收敛速度,写在relu之前。
问题:
1. Logsoftmax()用处是什么呢?
2. 除了卷积层与全连接层后还有什么时候要用到激活函数?
3. torch.nn.Conv2d():?卷积核在函数中哪里体现?
4. 为什么第一次FC2Layer测试明显有一个十几秒的启动过程?
5. 为什么这种情况下FC2Layer会优于CNN?什么情况下CNN才是更优解呢?
(猜想:由于FC2Layer从大体上把握图像特点,打乱像素顺序对其影响不大。而CNN是从局部特征入手,打乱像素顺序对其来说就是完全不同的两张图了)
6. self.classifier()这个函数的作用?

浙公网安备 33010602011771号