DenseNet

参考:学习 Densely Connected Convolutional Networks

DenseNet通过密集连接设计,将每一层输出作为后续所有层的输入,通过加强特征传播,能够减轻梯度消失的问题;同时通过鼓励特征重用,大大减少了参数数量

DenseNet主要由两个模块组成:

  1. Dense Block(负责特征提取)
  2. Transition Layer(负责特征图衰减)

其中Dense Block中使用3\times 3卷积进行特征提取,同时利用1\times 1卷积来控制输入特征图个数,所以组成一个Dense Layer模块(Conv(1x1) + Conv(3x3))进行实现

Dense Layer

  • 实现文件:py/lib/models/densenet/dense_layer.py

其实现流程如下:

BN -> ReLU -> Conv(1x1) -> BN -> ReLU -> Conv(3x3)

Dense Block

  • 实现文件:py/lib/models/densenet/dense_block.py

在每个Dense Block中,由多个Dense Layer组成,同时其每个Dense Layer的输出都作为后续Dense Layer的输入。不同的输入数据通过连接(concatenating)方式合并

Transition Layer

  • 实现文件:py/lib/models/densenet/transition.py

通过Trantition Layer模块进行特征图减半操作,每个Tranisition由一个Conv(1x1)和一个2\times 2大小的平均池化组成,其实现流程如下:

BN -> ReLU -> Conv(1x1) -> AvgPool(2x2)

DenseNet

参考:pytorch densenet.py

  • 实现文件:py/lib/models/densenet/denset_net.py

训练

比较DenseNet-121ResNet-34_v2

  • 数据集:voc 07+12
  • 迭代次数:100
  • 批量大小:
    • 48(train)
    • 48(test)
  • 图像预处理:

    • 训练:缩放+随机裁剪+随机水平翻转+颜色抖动+随机擦除+数据标准化
    • 测试:缩放+Ten Crop+数据标准化
  • 损失函数:标签平滑正则化,平滑因子0.1

  • 优化器:Adam,学习率3e-4,权重衰减3e-5
  • 学习率策略:warmup(共5轮)+余弦退火(95轮)

训练结果

完整训练日志参考训练日志

检测精度

  • Top-1 Accuracy
    • DenseNet-121: 89.86%
    • ResNet-34_v2: 90.50%
  • Top-5 Accuracy
    • DenseNet-121: 99.20%
    • ResNet-34_v2: 99.29%

Flops和参数数目

densenet_121: 5.731 GFlops - 30.437 MB
resnet-34: 7.349 GFlops - 83.177 MB

小结

CNN Architecture Data Type (bit) Model Size (MB) GFlops (1080Ti) Top-1 Acc(VOC 07+12) Top-5 Acc(VOC 07+12)
ResNet-34_v2 32 83.177 7.349 90.50% 99.29%
DenseNet-121 32 30.437 5.731 89.86% 99.20%

从训练轨迹上看,DenseNet-121在前期能够得到更快的收敛速度,在后期两者逐渐趋同。DenseNet-121ResNet-34_v2拥有更小的模型和Flops,两者也能够训练得到相近的准确度

进一步训练方向:

  1. 更大批量训练
  2. 更多数据集训练
  3. 使用预训练模型