目录
inception structure(GoogLeNet)
RNN(循环神经网络,Recurrent Neural Network)
经典网络
谷歌家的inception系列,mobilenet系列,nasnet系列,deeplab系列;旷视家的shufflenet系列;msra家的deformable系列;pjreddie的yolo系列;何恺明的resnet系列;rbg的rcnn系列
https://www.cnblogs.com/wj-1314/p/9754072.html
https://blog.youkuaiyun.com/jiaoyangwm/article/details/80011656
CNN(卷积神经网络)
https://www.jianshu.com/p/1ea2949c0056
https://blog.youkuaiyun.com/weixin_42451919/article/details/81381294
- 数据输入层/ Input layer
- 卷积计算层/ CONV layer
- ReLU激励层 / ReLU layer
- 池化层 / Pooling layer
- 全连接层 / FC layer
一般CNN结构依次为
1.INPUT
2.[[CONV -> RELU]N -> POOL?]M
3.[FC -> RELU]*K
4.FC
BN层
https://zhuanlan.zhihu.com/p/75603087
LeNet
在图像分类中取得较好成绩
LeNet-5共包含8层
-
C1层是一个卷积层,由6个特征图Feature Map构成。特征图中每个神经元与输入为5*5的邻域相连。特征图的大小为28*28,这样能防止输入的连接掉到边界之外(32-5+1=28)。C1有156个可训练参数(每个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器,共(5*5+1)6=156个参数),共156(28*28)=122,304个连接。
-
S2层是一个下采样层,有6个14*14的特征图。特征图中的每个单元与C1中相对应特征图的2*2邻域相连接。S2层每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。每个单元的2*2感受野并不重叠,因此S2中每个特征图的大小是C1中特征图大小的1/4(行和列各1/2)。S2层有12(6(1+1)=12)个可训练参数和5880(14*14(2*2+1)*6=5880)个连接。
-
C3层也是一个卷积层,它同样通过5x5的卷积核去卷积层S2,然后得到的特征map就只有10x10个神经元,但是它有16种不同的卷积核,所以就存在16个特征map了。 C3中每个特征图由S2中所有6个或者几个特征map组合而成。为什么不把S2中的每个特征图连接到每个C3的特征图呢?原因有2点。第一,不完全的连接机制将连接的数量保持在合理的范围内。第二,也是最重要的,其破坏了网络的对称性。由于不同的特征图有不同的输入,所以迫使他们抽取不同的特征(希望是互补的)。
例如,存在的一个方式是:C3的前6个特征图以S2中3个相邻的特征图子集为输入。接下来6个特征图以S2中4个相邻特征图子集为输入。然后的3个以不相邻的4个特征图子集为输入。最后一个将S2中所有特征图为输入。这样C3层有1516(6*(3*25+1)+6(4*25+1)+3(4*25+1)+(6*25+1)=1516)个可训练参数和151600(10*10*1516=151600)个连接。
-
S4层是一个下采样层,由16个5*5大小的特征图构成。特征图中的每个单元与C3中相应特征图的22邻域相连接,跟C1和S2之间的连接一样。S4层有32个可训练参数(每个特征图1个因子和一个偏置16*(1+1)=32)和2000(16*(2*2+1)5*5=2000)个连接。
-
C5层是一个卷积层,有120个特征图。每个单元与S4层的全部16个单元的55邻域相连。由于S4层特征图的大小也为5*5(同滤波器一样),故C5特征图的大小为11(5-5+1=1):这构成了S4和C5之间的全连接。之所以仍将C5标示为卷积层而非全相联层,是因为如果LeNet-5的输入变大,而其他的保持不变,那么此时特征图的维数就会比11大。C5层有48120(120*(16*5*5+1)=48120由于与全部16个单元相连,故只加一个偏置)个可训练连接。
-
F6层有84个单元(之所以选这个数字的原因来自于输出层的设计),与C5层全相连。有10164(84*(120*(1*1)+1)=10164)个可训练参数。如同经典神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置。然后将其传递给sigmoid函数产生单元i的一个状态。
-
最后,输出层由欧式径向基函数(Euclidean Radial Basis Function)单元组成,每类一个单元,每个有84个输入。
1、输入层:N个32x32的训练样本
输入图像大小为32x32,比MNIST数据库中的字母大,这样做的原因是希望潜在的明显特征,如笔画断点或角点能够出现在最高层特征监测子感受野的中心。
2、C1层
- 输入图像大小:32x32
- 卷积核大小:5x5
- 卷积核个数:6
- 输出特征图数量:6
- 输出特征图大小:28x28(32-5+1)
- 神经元数量:4707(28x28x6)
- 连接数:122304((28x28x5x5x6)+(28x28x6))
- 可训练参数:156(5x5x6+6,权值+偏置)
3、S2层
- 输入图像大小:(28x28x6)
- 卷积核大小:2x2
- 卷积核个数:6
- 输出特征图数量:6
- 输出特征图大小:14x14(28/2,28/2)
- 神经元数量:1176(14x14x6)
- 连接数:5880((2x2x14x14x6)+(14x14x6))
- 可训练参数:12(1x6+6,权值+偏置)
备注:S2层每个单元的4个输入相加(没有权重系数),乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid函数计算。可训练系数和偏置控制着sigmoid函数的非线性程度。
如果系数比较小,那么运算近似于线性运算,下采样相当于模糊图像。
如果系数比较大,根据偏置的大小下采样可以被看成是有噪声的“或”运算或者有噪声的“与”运算。
每个单元的2*2感受野并不重叠,因此S2中每个特征图的大小是C1中特征图大小的1/4(行和列各1/2)。
4、C3层
- 输入图像大小:(14x14x6)
- 卷积核大小:5x5
- 卷积核个数:16
- 输出特征图数量:16
- 输出特征图大小:10x10(14-5+1)
- 神经元数量:1600(10x10x16)
- 连接数:151600(1516x10x10)
- 可训练参数:1516
备注:C3层也是一个卷积层,通过5x5的卷积核去卷积S2层,然后得到的特征图map就有10x10个神经元,但是有16种不同的卷积核,就存在16个不同的特征map。
C3中每个特征图由S2中的所有6个或几个特征图组合而成,为什么不把S2中的所有特征图都连接到C3的特征图呢:
- 第一,不完全的连接机制将连接的数量保持在合理的范围内
- 第二,也是最重要的,这样一来就可以破坏网络的对称性,由于不同的特征图有不同的输入,所以迫使他们抽取不同的特征。
5、S4层
- 输入图像大小:(10x10x16)
- 卷积核大小:2x2
- 卷积核个数:16
- 输出特征图数量:16
- 输出特征图大小:5x5x16
- 神经元数量:400(5x5x16)
- 连接数:2000((2x2x5x5x16)+(5x5x16))
- 可训练参数:32((1+1)x16)
备注:S4是一个下采样层,由16个5x5大小的特征图构成,特征图的每个单元与C3中相应的特征图的2x2邻域相连,S4层有32个可训练参数(每个特征图1个因子和一个偏置)和2000个连接。
6、C5层
- 输入图像大小:5x5x16
- 卷积核大小:5x5
- 卷积核个数:120
- 输出特征图数量:120
- 输出特征图大小:1X1(5-5+1)
- 神经元数量:120(1x120)
- 连接数:48120(5x5x16x120x1+120x1)
- 可训练参数:48120(5x5x16x120+120)
备注:C5层是一个卷积层,有120个特征图,每个单元与S4层的全部16个单元的5x5邻域相连,构成了S4和C5的全连接,之所以仍将C5标识为卷积层而非全连接层是因为如果LeNet-5的输入变大,而其他的保持不变,那么此时特征图的维数就会比1x1大。
7、F6层
- 输入图像大小:(1x1x120)
- 卷积核大小:1x1
- 卷积核个数:84
- 输出特征图数量:1
- 输出特征图大小:84
- 神经元数量:84
- 连接数:10164(120x84+84)
- 可训练参数:10164(120x84+84)
备注:F6有84个单元(之所以选择84是源于输出层的设计),与C5层相连,有10164个可训练参数,类似经典的全连接神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置,之后将其传递给sigmoid函数产生一个单元i的状态。
8、output层
- 输入图像大小:1x84
- 输出特征图数量:1x10
AlexNet
参考:https://www.cnblogs.com/wangguchangqing/p/10333370.html
AlexNet是在LeNet的基础上加深了网络的结构,学习更丰富更高维的图像特征。
- 更深的网络结构
- 使用层叠的卷积层,即卷积层+卷积层+池化层来提取图像的特征
- 使用Dropout抑制过拟合
- 使用数据增强Data Augmentation抑制过拟合
- 使用Relu替换之前的sigmoid的作为激活函数
- 多GPU训练
数据增强
为了增加数据集AlexNet中对数据做了以下操作:
-
随机裁剪,对256×256256×256的图片进行随机裁剪到227×227227×227,然后进行水平翻转。
- 测试的时候,对左上、右上、左下、右下、中间分别做了5次裁剪,然后翻转,共10个裁剪,之后对结果求平均。
- 对RGB空间做PCA(主成分分析),然后对主成分做一个(0, 0.1)的高斯扰动,也就是对颜色、光照作变换,结果使错误率又下降了1%。
层叠池化
在AlexNet中使用的池化(Pooling)却是可重叠的,也就是说,在池化的时候,每次移动的步长小于池化的窗口长度。
dropout
每次迭代时随机删除一些结点
VGGNet
参考:https://my.oschina.net/u/876354/blog/1634322
用来提取图像特征,
将AlexNet中的大卷积核都替换为小的卷积核,使用的卷积核size=3x3,stride=1。因为两个3x3的卷积叠加等价于一个5x5的卷积,3个3x3的卷积叠加等价于一个7x7的卷积叠加。下图可说明这点:
小卷积核替换大卷积核的优点:
本来只有一个非线性层,替换后增加到3个,这增加了网络的深度和非线性,有利于决策函数辨别。
减少了参数数量,本来有7x7=49,减少到3x3x3=27,这可以看做是对7x7卷积滤波器进行正则化,迫使他们分解为3x3滤波器。
inception structure(GoogLeNet)
消除尺寸对于识别结果的影响,一次性使用多个不同filter size来抓取多个范围不同的概念,并让网络自己选择需要的特征。
如何在有限的计算资源内,提升网络性能。而提升网络性能的方法有很多,最直接的方法是增加网络的深度和宽度(深度:网络层数;宽度:每层网络的通道数)。但是直接的方法往往会带来一些麻烦:
(1)随着网络深度和宽度的增加,参数不断增加,容易发生过拟合
(2)网络规模不断扩大,参数增加,计算量增大
因此为了解决这个问题我们应该引入稀疏特性和将全连接层换成稀疏连接(将拥挤的网络不失性能的简化,很像dropout)。但由于目前的计算框架对稀疏数据(不均匀)的计算非常低效。因此大量文献指出,将稀疏矩阵聚类成相对密集的子矩阵,可以提高性能,于是提出了Inception结构。
Inception V1
一方面增加了网络的width,
另一方面增加了网络对尺度的适应性;
蓝色部分是起作用的卷积核,黄色部分是为了降低计算量去降低维度的1x1卷积核。多个尺度上卷积再聚合,能提取到不同尺度的特征。特征更为丰富也意味着最后分类判断时更加准确。
使用1x1卷积核的作用
在相同尺寸的感受野中叠加更多的卷积,能提取到更丰富的特征。(多了一个Relu);
使用1x1卷积进行降维,降低了计算复杂度
同样是输入一组有192个特征、32x32大小,输出256组特征的数据,第一张图直接用3x3卷积实现,需要192x256x3x3x32x32=452984832次乘法;第二张图先用1x1的卷积降到96个特征,再用3x3卷积恢复出256组特征,需要192x96x1x1x32x32+96x256x3x3x32x32=245366784次乘法,使用1x1卷积降维的方法节省了一半的计算量。
参考:https://www.cnblogs.com/leebxo/p/10315490.html(Network in Network)
GooLeNet
RFBnet
https://blog.youkuaiyun.com/u014380165/article/details/81556769
ResNet残差网路
Encoder-Decoder
U-Net
参考:https://blog.youkuaiyun.com/qq_42450404/article/details/91415295
attention block
参考:https://www.zhihu.com/question/68482809/answer/263764017
主要分为两种,一种是spatial attention, 另外一种是channel attention。
CNN每一层都会输出一个C x H x W的特征图,C就是通道,代表卷积核的数量,亦为特征的数量,H 和W就是原始图片经过压缩后的图,spatial attention就是对于所有的通道,在二维平面上,对H x W尺寸的图学习到一个权重,对每个像素都会学习到一个权重。你可以想象成一个像素是C维的一个向量,深度是C,在C个维度上,权重都是一样的,但是在平面上,权重不一样。这方面的论文已经很多了,重点关注一下image/video caption。相反的,channel attention就是对每个C,在channel维度上,学习到不同的权重,平面维度上权重相同。spatial 和 channel attention可以理解为关注图片的不同区域和关注图片的不同特征。
DenseNet
压缩视频增强网络MFQE2.0中,质量增强网络QE-net(右图)就使用DenseNet结构,但网络不好训练。
HRNet
https://zhuanlan.zhihu.com/p/143385915
WARB
https://blog.youkuaiyun.com/zhangwl27/article/details/86723475
渐进式模块(通道可分离)
https://zhuanlan.zhihu.com/p/260688242
SqueezeNet
RecursiveNet
Gan
RNN(循环神经网络,Recurrent Neural Network)
参考:https://www.jiqizhixin.com/articles/2018-12-14-4
ConvLSTM
卷积层
https://blog.youkuaiyun.com/gwplovekimi/article/details/89890510
1x1卷积核
原文参考
https://blog.youkuaiyun.com/amusi1994/article/details/81091145
https://www.zhihu.com/question/56024942
- 降维/升维
由于 1×1 并不会改变 height 和 width,改变通道的第一个最直观的结果,就是可以将原本的数据量进行增加或者减少。这里看其他文章或者博客中都称之为升维、降维。但我觉得维度并没有改变,改变的只是 height × width × channels 中的 channels 这一个维度的大小而已
- 跨通道信息交互(channal 的变换)
例子:使用1x1卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化,3x3x64channels的卷积核后面添加一个1x1x28channels的卷积核,就变成了3x3x28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互。
注意:只是在channel维度上做线性组合,W和H上是共享权值的sliding window
- 增加非线性
多了一层Relu
inception用到了1x1卷积核
3D卷积
在 3D 卷积中,3D 过滤器可以在所有三个方向(图像的高度、宽度、通道)上移动。在每个位置,逐元素的乘法和加法都会提供一个数值。因为过滤器是滑过一个 3D 空间,所以输出数值也按 3D 空间排布。也就是说输出是一个 3D 数据。
可参考https://zhuanlan.zhihu.com/p/55567098
可变形卷积
https://www.cnblogs.com/yanghailin/p/12321832.html
Depthwise卷积与Pointwise卷积
https://zhuanlan.zhihu.com/p/166736637
https://blog.youkuaiyun.com/tintinetmilou/article/details/81607721
Depthwise Convolution
不同于常规卷积操作,Depthwise Convolution的一个卷积核负责一个通道,一个通道只被一个卷积核卷积。上面所提到的常规卷积每个卷积核是同时操作输入图片的每个通道。
Pointwise Convolution
Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M为上一层的通道数。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map。如下图所示。
PixelShuffle
pixelshuffle算法的实现流程如上图,其实现的功能是:将一个H × W的低分辨率输入图像(Low Resolution),通过Sub-pixel操作将其变为rH x rW的高分辨率图像(High Resolution)。
但是其实现过程不是直接通过插值等方式产生这个高分辨率图像,而是通过卷积先得到r^2个通道的特征图(特征图大小和输入低分辨率图像一致),然后通过周期筛选(periodic shuffing)的方法得到这个高分辨率的图像,其中r为上采样因子(upscaling factor),也就是图像的扩大倍率。
网络训练基本概念
epoch, batch size,iteration
参考:https://www.jianshu.com/p/22c50ded4cf7?from=groupmessage
batch size是一次训练所选取的样本数,Batch Size的大小影响模型的优化程度和速度。同时其直接影响到GPU内存的使用情况,假如你GPU内存不大,该数值最好设置小一点。
通常设为2的n次幂,常用的包括64,128,256。 网络较小时选用256,较大时选用64。
参考:https://blog.youkuaiyun.com/qq_34886403/article/details/82558399
Epoch:前向计算,后向反馈,更新参数的一轮称为一个epoch
反卷积
https://www.jianshu.com/p/ff99a7e6c39d
反向传播 链式求导
梯度消失和梯度爆炸
- 产生原因
最终对loss函数求导可以分解为很多个小部分(链式求导,层数越高链式越少),每部分都要对激活函数求导,如果激活函数大于1,随着层数减少梯度呈指数上升,小于1则指数下降。因此梯度爆炸时前几层梯度过大,后几层难以更新,梯度消失时前几层梯度过小,难以更新。
- 解决方法:
激活函数:sigmoid梯度小于0.25,容易产生梯度消失,而ReLU导数值恒为1,可解决此问题。
残差网络:使得梯度能够更容易地流向前几层。