文章目录
一、卷积神经网络
1.1 图片的数据格式
通常是3通道的RGB图
- 由于全连接层处理图片这种数据量较大的数据时,会需要学习到很大的参数,考虑到计算机硬件的配置,应该使用卷积处理
1.2 卷积原理
-
创建卷积核,使其作为输入的共享权重,执行卷积操作,以此减少参数量
-
卷积操作
-
卷积操作考虑的是局部的输入数值
-
信号处理的卷积过程
1.3 卷积层
- 可设置 same(设置padding以保持卷积前后图片尺寸不变) 与 valid(不设置padding,卷积后图片变小) 卷积
注:① input_channels:表示输入特征图的通道数(输入层一般为RBG_num=3)
② Kernel_channels:a)表示与input_channels对应的数量;b)>表示卷积核的个数
③ Kernel_size:表示卷积核的尺寸
④ Stride:表示卷积步长
⑤ Padding:表示使用same卷积时的边缘填充大小
-
实际卷积场景举例
-
pytorch实现卷积层
nn.Conv2d(input_channel,kernel_num,kernel_size,stride,padding)
① input_channel:输入特征图通道数
② kernel_num:卷积核个数
③ kernel_size:卷积核尺寸
④ stride:卷积步长
⑤ padding:填充大小
注意:pytorch提供 out = layer(x) 的实现方式,尽量不使用forward()方法
1.4 池化层
- 池化层实现对卷积后的数据进行降采样,一般取size=2,stride=2,这样就是减少一半的数据
-
pytorch实现池化层
-
上采样的原理与pytorch实现
上采样:即使用最近邻内插法、双线性内插法、双三次内插法实现特征图放大
-
F.interpolate(input,scale_factor,mode)
① input:输入特征图tensor
② scale_factor:放大倍数
③ mode:上采样方式(‘nearest’,‘bilinear’,‘bicubic’)
-
ReLu激活函数接入在池化层之后
注:标准的CNN网络,各层接法如下:
卷积层 + BN + 池化层 + ReLu
or
卷积层 + BN + ReLu + 池化层
-
pytorch实现
1.5 BatchNorm
对输入值进行批量归一化,从而控制激活函数输出在有效梯度范围内,从而提高学习效率
-
transforms.Normalize()可以实现设定分布的的归一化处理
-
Batch Norm:实际上是对batch中各tensor的对应channel上数据进行归一化操作
-
batch Norm中涉及仿射过程, γ \gamma γ、 β \beta β是需要学习的参数
-
pytorch实现BatchNorm
① nn.BatchNorm1d(channel)适用于一维数据的归一化
a) channel:即输入通道数
② nn.BatchNorm2d(channel)适用于二维数据的归一化
a) channel:即输入通道数
layer.weight 对应
γ
\gamma
γ
layer.bais 对应
β
\beta
β
③ nn.BatchNorm1d()、nn.BatchNorm2d()中的参数意义
a) affine:表示是否引入
γ
\gamma
γ、
β
\beta
β做仿射变换(True or False)
b) eps:表示设置使归一变换中使分母不为0的最小值
c) momentum:动量值,默认为0.1
d) track_running_stats:是否追踪训练过程
e) training:表示是否处于训练过程(True or False)
-
在测试过程中,由于没有batch(批量)输入,因此需要手动的关闭BatchNorm1d\BatchNorm2d的功能,layer.eval()。同时,Test过程的BatchNorm会使用全部量做归一化
-
BatchNorm效果可视化展示
-
总结
使用BatchNorm的优点
① 收敛速度更快
② 更好的表现(得到更好的最优解)
③ 更加稳定
二、经典卷积神经网络
2.1 LeNet-5
2.2 AlexNet
2.3 VGG
提出 1*1、3*3 作为更有效的卷积大小
2.4 GoogLeNet-2
使用 1*1 的kernel可以减小特征图的channel数,减少参数量
-
单元结构
-
网络结构
2.5 ResNet
2.6 网络结构发展
- pytorch实现ResNet
2.7 DenseNet
三、nn.Moudule类
- 使用继承nn.Module的好处
① 可以使用众多的 nn 下的模型块组件(均是nn.Module的子类)
② nn.Sequential提供容器化组建各个模型块的方式
注:在nn.Sequential()内即可以写入已有的模块(nn下的模块),同时也可以写入用户自定义实现的继承自nn.Moudle的类
③ net.parameters() 返回所有的学习参数,便于管理
④ 自定义继承nn.Module类
⑤ 定义使用CPU、GPU加速
⑥ save and load
提供定时保存学习过程中的中间状态
⑦ train/test
a) 使用net.train() 可以开启模型训练
b) 使用 net.eval() 可以将模型从 train 向 test 进行切换
⑧ 应用自定义层
- 应用 nn.Parameter()可以自动的将要学习的参数添加进自定义模型中,在optim.SGD()中传入的net.parameter()会包含自定义的参数
四、数据增强
通过一系列的变换,扩充数据集
- 数据增强的方式
① 翻转
② 旋转
③ 随机捕捉
④ GAN
4.1 翻转
- pytorch实现
在传入参数中使用:
① transforms.RandomHorizontalFlip()调整图像水平翻转
② transforms.RandomVerticalFlip()调整图像竖直翻转
4.2 旋转
- pytorch实现
在传入参数中使用:transforms.RandomRotation()调整图像旋转角度
a) 传入数值var,表示(-var,var)角度范围内随机旋转
b) 传入list,表示随机对图片进行选定值的旋转
4.3 缩放
- pytorch实现
在传入参数中使用:transforms.Resize([w,h])调整缩放大小
4.4 裁剪
- pytorch实现
在传入参数中使用:transforms.RandomCrop([w,h])选择裁剪区域大小