一、传统神经网络和卷积神经网络比较
- 传统的BP神经网络是一种由大量的节点(神经元)之间相互联接构成,按照误差逆向传播算法训练的多层前馈神经网络。
- 卷积神经网络是包含卷积计算且具有深度结构的前馈神经网络。在原来多层神经网络的基础上,加入了特征学习部分,这部分可以模仿人脑对信号的处理;其中隐藏层可以进一步分为卷积层和池化层,卷积层通过一块块卷积核在原始图像上平移来提取特征,池化层是一个筛选过滤的过程。
- 传统的神经网络在处理图像问题时权重矩阵的参数太多,容易造成过拟合现象;而卷积神经网络可以通过局部关联、参数共享方式,可以用较少的参数,训练出更好的模型,避免出现过拟合现象。
二、卷积神经网络的基本机构
1.卷积
- 卷积是对两个实变函数的一种数学操作。
- 卷积层是卷积网络的核心,大多数计算都是在卷积层中进行的。卷积层中的每一个节点的输入只是上一层神经网络中的一小块,卷积层通过一块块卷积核在原始图像上平移来提取特征;一般来说,卷积层的参数是有一些可学习的滤波器集合构成的,每个滤波器在宽度和高度上都比较小,但是深度输入和数据保持一致。
- 另外,由于卷积具有“参数共享”的特性,可以降低参数数量,防止由于参数过多而造成过拟合。
2.池化
- 池化层和卷积层一样也有一个空间窗口,通常取这些窗口中的最大值或平均值作为输出的结果,然后不断滑动窗口,对输入数据体的每一个深度切片单独处理,减少数据体的尺寸空间。
- 池化层的作用是在保留主要特征的同时减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。
- 另外,池化前后深度不变。
3.全连接
- 全连接层与一般的全连接层相同。其输入层是前面的特征图,会将特征图中所有的神经元变成全连接的形式。这个过程为了防止过拟合会引入Dropout。在进入全连接层之前,使用全局平均池化能够有效的防止过拟合。
- 全连接层通常位于卷积神经网络尾部。
三、卷积神经网络的典型结构
1.AlexNet
- AlexNet使用了relu激活函数、dropout、数据增强、LRN归一化,后来研究发现LRN的作用并不大,更多使用BatchNormal做归一化。
- AlexNet使用GPU训练, 证明了CNN在复杂模型下的有效性,具有开创性的意义。
下面是AlexNet的分层解析:
第二层、第三层、第四层、第五层......
2.ZFNet
ZFNet从可视化的角度,解释了CNN,得到以下的一些结论:特征是分层次的;深层特征更鲁棒;深层特征更有区分度;深层特征收敛更慢等。
3.VGG
- VGG证明了更深的网络,能够提取更好的特征;
- 结构更加规整、简单:全部使用3x3的小卷积核和2x2的最大池化;
- 每次池化后,特征图宽高减半,通道数增加一倍;
- 参数大多数在全连接层中;
4.GoogleNet
- Inceptionv1利用1x1卷积核进行通道降维,减小了参数量和计算量;Inceptionv2使用多个小卷积核代替一个大卷积核,如两个3x3代替5x5;Inceptionv3使用1xn和nx1代替nxn。
- Inception的设计使得网络更深更宽,卷积数量增加,每个卷积后面都跟着激活函数,使得网络的非线性能力更强。
5.ResNet
使用Average Pooling代替一个FC层。每个卷积层之后都配合一个BN进行归一化,加快网络训练速度和收敛的稳定性,防止过拟合。
对每层的输入做一个reference(X), 学习形成残差函数。这种残差函数更容易优化,能使网络层数大大加深
四、代码练习
1.构建简单的CNN对 mnist 数据集进行分类
1.1加载数据集
1.2显示部分图像
1.3构建神经网络结构
定义网络时,需要继承nn.Module,并实现它的forward方法。
1.4定义训练和测试函数
1.5在小型全连接网络上训练,结果如下
1.6在卷积神经网络上训练,结果如下
通过上面的测试结果,可以发现,含有相同参数的 CNN 效果要明显优于简单的全连接网络,是因为 CNN 能够更好的挖掘图像中的信息。
1.7打乱像素顺序再次在两个网络上训练与测试
在全连接网络上训练与测试:
在卷积神经网络上训练与测试:
- 根据测试结果我们可以发现:全连接网络的性能基本上没有发生变化,但是卷积神经网络的性能明显下降。
- 这是因为对于卷积神经网络,会利用像素的局部关系,但是打乱顺序以后,这些像素间的关系将无法得到利用。
2.使用 CNN 对 CIFAR10 数据集进行分类
2.1加载数据
2.2下面展示 CIFAR10 里面的一些图片:
2.3定义网络,损失函数和优化器:
2.4训练网络
2.5现在我们从测试集中取出8张图片:
我们把图片输入模型,可以看到CNN有几个识别错了
2.6网络在整个数据集上的表现:
通过改进网络结构,性能还可以进一步提升。在 Kaggle 的LeaderBoard上,准确率高的达到95%以上。
3.使用 VGG16 对 CIFAR10 分类
3.1定义 dataloader
3.2VGG 网络定义
3.3进行网络训练
3.4 测试验证准确率:
可以看到,使用一个简化版的 VGG 网络,就能够显著地将准确率由 64%,提升到 83.55%。
五、问题回答
1、dataloader 里面 shuffle 取不同值有什么区别?
- dataloader中设置shuffle值为True,表示每次加载的数据都是随机的,将输入数据的顺序打乱。shuffle值为False,表示输入数据顺序固定。
2、transform 里取了不同值,这个有什么区别?
- transform 对数据进行某种统一处理,进行标准化、降维、归一化、正则化等变换操作。
3、epoch 和 batch 的区别?
- batch大小是在更新模型以前处理的多个样本。epoch数是经过训练数据集的完整传递次数。批处理的大小必须大于或等于1且小于或等于训练数据集中的样本数。能够将epoch设置为1和无穷大之间的整数值。
4、1x1的卷积和 FC 有什么区别?主要起什么作用?
- 1x1的卷积层采用参数共享方式,需要的参数量会比FC层所使用的参数量少,计算速度更快;1*1的卷积可以用于降维(减少通道数),升维(增加通道数),代替fc成为一个分类器;另外,FC层对于训练样本要求统一尺寸,但是1x1的卷积不会受该规定的限制;
5、residual leanring 为什么能够提升准确率?
- 残差学习通过残差网络结构,使用恒等映射直接将前一层输出传到后面,可以把网络层弄的很深,并且最终的分类效果也非常好,使得整个学习模型的错误率下降。
6、代码练习二里,网络和1989年 Lecun 提出的 LeNet 有什么区别?
- 模型构造不同。以AlexNet为例,AlexNet网络包含8层,其中包括5层卷积和2层全连接隐藏层,以及1个全连接输出层。
- 激活函数不同。传统的LeNet网络使用的是sigmoid激活函数,而AlexNet使用的是ReLU函数。ReLU函数比sigmoid函数计算上更为简单,且ReLU函数在不同的参数初始化方法下可以让模型更容易训练。
7、代码练习二里,卷积以后feature map 尺寸会变小,如何应用 Residual Learning?
- Residual Learning在shortcut中采用1x1的卷积,设置步长为2;1x1在卷积的时候设置输出维度为残差连接相同的维度,上述操作也被称为线性变换,进而对大小不同的feature map进行调整。
8、有什么方法可以进一步提升准确率?
- 使用特征更明显、分类更合理的数据集,对数据预处理
- 选择性能最优的神经网络结构,例如: VGG、Resnet、谷歌的 Inception 网络等
- 选择合适的优化器、损失函数、激活函数