深度学习调试技巧汇总

1 一些通用技巧

  1. 使用 ADAM 优化器
  2. ReLU 是最好的非线性
  3. 不要在输出层使用激活函数
  4. 为每一层添加一个偏置项
  5. 使用方差缩放初始化
  6. 白化(归一化)输入数据
  7. 以合理地保留动态范围的方式对输入数据进行缩放
  8. 一般不要使用学习率衰减
  9. 卷积层有 64 或 128 个滤波器,这就已经足够了
  10. 池化是为了变换不变性

2 一些调试技巧

  1. 调整学习率
  2. 调整(小)批量处理的规模
  3. 删掉批归一化层
  4. 检查你矩阵的重构
  5. 检查损失函数

3 卷积神经网络的设计思想

  1. 从LeNet5到VGG(基于深度的设计)
  2. 1*1卷积(基于升维降维的设计)
  3. GoogLeNet(基于宽度和多尺度的设计)
  4. MobileNets(基于分组卷积的设计)
  5. 残差网络
  6. 非正常卷积(基于不规则卷积和感受野调整的设计)
  7. 密集连接网络(残差网络的升级,极致的不同层间的信息融合)
  8. 非局部神经网络(充分提高层内感受野的设计)
  9. 多输入网络(一类有多种应用的网络)
  10. 3D卷积(将卷积升维到3D空间设计)
  11. RNN和LSTM(时序网络结构模型)
  12. GAN(近两年最火的下一代无监督深度学习网络)
  13. VGG
  14. NASNet
  15. 轻量化网络(适用于移动端的算法)- MobileNet系列和ShuffleNet系列

4 CNN中的奇技淫巧

  1. 卷积只能在同一组进行吗?-- Group convolution
  2. 卷积核一定越大越好?-- 3×3卷积核
  3. 每层卷积只能用一种尺寸的卷积核?-- Inception结构
  4. 怎样才能减少卷积层参数量?-- Bottleneck
  5. 越深的网络就越难训练吗?-- Resnet残差网络
  6. 卷积操作时必须同时考虑通道和区域吗?-- DepthWise操作
  7. 分组卷积能否对通道进行随机分组?-- ShuffleNet
  8. 通道间的特征都是平等的吗? -- SEnet
  9. 能否让固定大小的卷积核看到更大范围的区域?-- Dilated convolution
  10. 卷积核形状一定是矩形吗?-- Deformable convolution 可变形卷积核

上面10个技巧的主要思想总结如下:
卷积核方面

  • 大卷积核用多个小卷积核代替;
  • 单一尺寸卷积核用多尺寸卷积核代替;
  • 固定形状卷积核趋于使用可变形卷积核;
  • 使用1×1卷积核(bottleneck结构)。

卷积层通道方面

  • 标准卷积用depthwise卷积代替;
  • 使用分组卷积;
  • 分组卷积前使用channel shuffle;
  • 通道加权计算。

卷积层连接方面

  • 使用skip connection,让模型更深;
  • densely connection,使每一层都融合上其它层的特征输出(DenseNet)

5 工业界使用的深度学习高效网络结构设计

首先是三巨头的雏形

  • squeezenet
  • mobilenet
  • shufflenet

升级版

  • squeezenext
  • mobilenetv2
  • shufflenetv2

还有一个耿直boy

  • mnasnet(从名字上看和NASNet很像)

高效网络的设计思想有:
1、depthwise separable convolutions
2、low rank filter
3、pointwise group convolution
4、避免网络分支太多,或者group太多
5、减少element wise的操作

6 图像分类算法优化技巧

加快模型训练部分
1、增大学习率
2、用一个小的学习率先训几个epoch(warmup)
3、每个残差块的最后一个BN层的γ参数初始化为0
4、不对bias参数执行weight decay操作

优化网络结构部分
1、ResNet-B
2、ResNet-C
3、ResNet-D

模型训练调优部分
1、学习率衰减策略采用cosine函数
2、采用label smoothing
3、知识蒸馏(knowledge distillation)
4、引入mixup

你可能感兴趣的:(深度学习调试技巧汇总)