配套教材:北京交通大学《专知-深度学习》
01-CNN(Convolutional Neural Networks)
卷积神经网络最大的优点为:局部连接、权值共享。有效的减少了网络的参数个数,缓解了模型的过拟合问题。
一、基本组成结构
1. 卷积层
-
局部感受野:在处理图像这样的高维度输入时,我们让每个神经元只与输入数据的一个局部区域连接。在深度方向上,这个连接的大小总是和输入量的深度相等。
需要强调的是,我们对待空间维度(宽和高)与深度维度是不同的:连接在空间(宽高)上是局部的,但是在深度上总是和输入数据的深度一致。
-
卷积核也称为过滤器(filter):
- 每个卷积核具有长宽深三个维度;
- 在某个卷积层中,可以有多个卷积核:下一层需要多少个feather map,本层就需要多少个卷积核。
- 指定卷积核时,只需指定其长和宽两个参数,所以一般深度省略。例如,在原始图像层 ,如果图像是灰度图像,其feather map数量为1,则卷积核的深度也就是1;如果图像是grb图像,其feather map数量为3,则卷积核的深度也就是3。
-
权值共享:不同神经元之间的参数共享可以减少需要求解的参数,使用多种滤波器去卷积图像就会得到多种特征映射。权值共享其实就是对图像用同样的卷积核进行卷积操作,其主要的能力就能检测到不同位置的同一类型特征。
-
卷积运算:
-
对于feather map输出尺寸的计算,常用公式为( N - F ) / stride + 1;
加padding后为( N + padding*2 - F ) / stride + 1;
其中N为输入尺寸,F为过滤器尺寸,stride为步长,1代表偏置项,padding为零填充的边缘。 -
参数量的计算为 (F * F + 1 ) * 个数。
-
池化层
保留主要特征的同时减少参数和计算量,防止过拟合,提高模型泛化能力;一般处于卷积层和卷积层之间,全连接层和全连接层之间。池化前后深度不变。
主要类型:Max Pooling,Average Pooling
-
全连接层:在整个卷积神经网络中起到“分类器”的作用。全连接层和卷积层可以相互转换,其核心操作为 y = Wx + b; W,b为可优化的参数,x为前一层的数据;通过softmax函数预测标签。
二、典型网络结构
- AlexNet
-
该网络的亮点在于:
- 首次双GPU进行网络加速训练。
- 使用了ReLU激活函数,解决梯度消失问题,且收敛速度快。
- 使用了Dropout随机失活神经元操作,以减少过拟合。
-
模型结构
- VGG
- 模型结构
- GoogleNet
- 亮点:
-
插入1x1卷积核进行降维
-
Inception V3 进一步对 V2的参数数量进行降低,并增加非线性激活函数
-
辅助分类器解决模型过深的梯度消失问题
-
- ResNet
- 亮点:
-
引入残差Block:去掉相同的主体部分,从而突出微小的变化。
-
可以被用来训练非常深的网络。
-
三、实验结果
- LeNet_MNIST
- 使用torch.utils.data.DataLoader进行数据预处理操作,其中transforms众多函数的作用为图像增强处理,详情见链接。batch_size和shuffle可以进行分批次随机训练,避免数据投入的顺序对网络造成影响,增加随机性,提高网络的泛化性能,避免导致过拟合。
- 定义网络时,需要继承nn.Module,并实现它的forward方法。
- view方法类似于reshape,将多维数据flatten,常用于全连接层之前的操作,某些代码中的size(0)代表的是batch_size。
- torch.max(outputs, 1),返回每一行中最大值的那个元素,且返回其索引。
- 通过调整batch_size,优化函数等可进一步提高模型准确率,且CNN明显优于小型全连接网络。
但是将图像像素打乱后,CNN准确率大幅下降,这是因为对于卷积神经网络,会利用像素的局部关系,但是打乱顺序以后,这些像素间的关系将无法得到利用。
- LeNet_CIFAR
- 训练的 shuffle 是 True,测试的 shuffle 是 false;即训练时可以打乱顺序增加多样性,测试是没有必要。
- torch.nn.Module有train和eval两种模式,在train模式下启用 BatchNormalization 和 Dropout,将BatchNormalization和Dropout置为True;在eval模式下不启用 BatchNormalization 和 Dropout,将BatchNormalization和Dropout置为False。
- 经过上述( N - F ) / stride + 1与池化后逐层计算,最后feature map大小为5x5,所以x.view(-1,16x5x5)
- 可以看到对于较复杂的数据集,网络准确率还有可提升空间。
- VGG_CIFAR
- BatchNorm2d:归一化可以让不同的特征得到相同的权重倾向,可以加速收敛。
- 网络构建
- VGG网络增加深度,有效提高正确率
四、Q&A
- dataloader 里面 shuffle 取不同值有什么区别?
shuffle取值为True,表示打乱数据集中顺序;取值为False,表示按照原有顺序。
默认为False,且先打乱再取batch。 - transform 里,取了不同值,这个有什么区别?
transform用于图像预处理,包括图像变换、归一化等操作,提高泛化能力,加快模型收敛。 - epoch 和 batch 的区别?
epoch表示对一个完整数据集训练的总次数;batch为epoch内分批次训练的样本数,表示进行一次训练并更新参数的批次。 - 1x1的卷积和 FC 有什么区别?主要起什么作用?
首先1x1的卷积核具有增加网络深度(增加非线性转换能力,因为卷积后要经过ReLU激活函数)、升/降维、减少参数计算量等作用。
1x1卷积核其实是1×1×通道数,所以说,1x1卷积操作是在每个像素位置上,不同feature channels的线性叠加;
全连接层 y=Wx,可以看作是一个全局的卷积操作,所以1x1卷积可代替全连接层,具有权值共享、参数量较少的优点。
全连接层的权重矩阵是固定的(即与权重矩阵正好可以相乘的大小),卷积不需要固定大小。
有待进一步学习… - residual leanring 为什么能够提升准确率?
通过残差块输入x传到输出F(x)+x,并作为下一层的输入结果,可以跳过不起作用的网络,且解决了梯度消失问题,可以训练更深的网络。 - 代码练习二里,网络和1989年 Lecun 提出的 LeNet 有什么区别?
代码练习二中激活函数为ReLU,而LeNet激活函数是Sigmoid。 - 代码练习二里,卷积以后feature map 尺寸会变小,如何应用 Residual Learning?
通过使用1*1卷积、填充、池化等方法保持尺寸一致。 - 有什么方法可以进一步提升准确率?
对数据进行预处理;
适当增加训练轮次;
调整batch_size大小;
合理调节网络结构;
寻找更好的激活和优化函数。