一、网络设计
(1) 网路设计要点
网络设计考虑重点:1. 精度 2.容量 3. 效率
精度:网络预测样本的精度(TP / (TP +FP))
容量:容纳数据量的多少,神经元越多,容量越大。
效率:网络运行的效率,这是一个很重要的指标。
总结:层次要深,信息要充分融合,计算量要足够小。
(2)、网络计算成本
H x W 表示输出特征图的空间大小,N代表输入通道数,K x K 代表卷积核的大小,M代表输出通道数,那么标准卷积的计算成本就变成了H * W * N * K * K * M
这里重要的一点就是,标准卷积的计算成本与以下因素成比例:
(1) 输出特征图的空间大小 H * W
(2) 卷积核的大小 K * K
(3)输入通道和输出通道的数量N x M
从以上几个因素对网络的性能进行改进。
(3) 高效的卷积网络
高效的网络应该具备以下特点:
- 参数量小,占用内存低
- 效率高
- 计算量低
- 并行化程度高
- 性能与大的网络模型相当
二、网络设计技术
(1) 网络深度的设计
为什么加深网络可以提升性能?
答:1. 更深的网络模型具有更好的非线性表达能力。2. 网络更深每一层要做的事情更加简单,各个深度的网络各司其职。
具体设计怎样的深度?
答:一般常见的深度是5~8层,不超过30层。
加深网络容易出现的问题?
答:
- 达到一定深度后性能反而下降,难以优化。
- 更加容易过拟合。
- PLD (processing level deprivation )现象,网络无法学到简单但是必要的函数来描述数据
- PLS (processing level saturation)现象,网络的浅层饱和,无法发挥网络的性能。
(2) 网络宽度的设计
宽度:一般都指输出的通道数。
网络宽度变大有什么作用?
答:网络宽度变大会提取更加丰富的不同颜色和纹理信息。如:AlexNet 第一个卷积层输出96个通道,使它提取更加丰富的特征信息。
一般网络宽度怎么设置?
答: 1. 第一层输出通道32 即可,此后逐渐增加,计算量随通道数的增加为O(N ^2)。 但提高网络宽度可以提高性能,在达到一定临界点后饱和。
网络宽度设计的原则?
答:
- 主流模型第一个卷积层宽度不超过64,加宽后参数的增长量比较块。
- 增加网络宽度比增加网络深度更有利于性能的提升,但是计算量也增加的较快。
- 多使用1 * 1 卷积、分组卷积、 跨层连接等技术。
(3) Dropout 和 BN 设计
- Dropout基本结构
它的主要思想就是:在训练神经网络的每一轮迭代中,随机地关闭一些神经元,以此降低神经网络的复杂程度
Dropout可以有效的缓解过拟合的发生,在一定程度上达到正则化的效果,它能够提高模型的泛化能力。
对于一个有n个节点的神经网络,有了dropout后,就可以看作是2^n个模型的集合了,消除或者减弱了神经元节点间的联合,降低了网络对单个神经元的依赖,从而增强泛化能力。
- Dropout的优点
- 使用dropout正则化的神经网络,不会过分依赖于某个或某些特征,使得权重分散。因为在每一轮迭代中隐藏层的任何一个结点都有可能被删除,那么原本属于它的权重就会被分配到其他结点上,多次迭代平均下来,就能降低对某个特征或者是某个结点的依赖了。
- 缓解Relu的dead issue 。dead issue 是指:一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,那么这个神经元的梯度就永远都会是 0.
- Dropout 使用的注意事项
- Dropout降低了模型的性能,所以对于原本需要容量为N的网络才能解决的问题,现在需要N/p, p表示保留该节点的概率,这个概率一般是0.5~0.9之间,在测试的时候需要乘以p。
- Dropout 相当于增加了噪声,造成梯度的损失,所以需要更大的学习率和动量项,训练更久才能收敛。
- BN 概述
BN(Batch Normalization), 归一化分布,增强梯度有效性。
- Batch Normalization的作用是他适用的归一化过程不只是输入层,甚至同样适用于神经网络的深度隐藏层。
- 在用于隐藏层时,我们也许不想隐藏单元值必须是平均值0和方差1(比如使用sigmoid函数的时候)。
- 有了γ和β两个参数后,我们可以确保所有Z(i)的值是我们想赋予的任意值(均值和方差由两个参数γ和β控制)。
- 它的真正作用是保证隐藏的单元均已使用均值和方差标准化(即:Z(i)有固定的均值和方差)
- BN 的优点
- 调整了数据的分布,不考虑激活函数,它让每一层的输出归一化到均值为0,方差为1的分布,这保证了梯度的有效性,减轻了对参数初始化的依赖。
- 训练更快,可以使用更高的学习率。
- 使得损失平面更加平滑。
- BN 使用注意事项
- 小的Batchsize不稳定
- 尝试Layer Normalization、group Normalization、instance Normalization等变种。
(4) 卷积核、步长、池化的设计
1、 卷积核设计
大型卷积核比较少用,3 * 3 卷积核用的较多。
为什么要使用3 * 3 卷积核:1. 使用多个较小的卷积核代替大的卷积核,使得网络层数增加,所以非线性表达能力增强。2. 小的卷积核使得网络参数量减少,更加容易训练。
2、步长设计
- 保证输出分辨率的情况下,分类任务中网络低层的分辨率很重要,对于目标检测/图像分割等任务,需要同时保证最后特在图的分辨率。所以一般第一个卷积层步长不超过2,如果步长过大就会影响图片的分辨率,进而影响后续特征的提取。
- 建议: a. 使用带步长的卷积代替池化 b. 前两个卷积层不要超过2倍的下采样率。
- 高性能网络可以采用大卷积核+大采样率。
3、池化设计
- 刚开始训练网络的时候,池化确实有利于提高抗变形能力,不管池不池化,模型最后学习完都能获得同样的抗变形能力。
- 初始化的时候不同的池化方法是有差异的,但是学习完之后不管什么池化方法效果都差不多。
(5)卷积方式的使用和设计
- 卷积拆分(分组卷积)
- 通道补偿和特征重用:
a. 提升单层通道利用率:特征通道补偿
b. 提升多层通道利用率:密集连接网络- 分数 + 整数的分组卷积
(6) 剪枝
剪枝发生在模型训练完之后。它的步骤:
- 训练一个网络
- 删除权重小于一定阈值的连接,得到稀疏网络。
- 对稀疏网络再训练
(7) 量化
量化:从高精度(位宽)转化成低精度(位宽),如32位浮点数到8位。
量化分为:权重量化 输入量化 激活值量化 误差量化
量化优点:a. 更小的模型尺寸 b.更低的内存和缓存 c.更快的计算d. 更低的功耗
(8) 通道混洗
import torch
x = torch.randn(1, 6, 6, 6)
x = x.reshape(1, 2, 3, 6, 6)# 分组,每组3个通道
x = x.permate(0, 2, 1, 3, 4)# 交换轴
x = x.reshape(1, 6, 6, 6)# 重新变为1,6,6,6
print(x)