DenseNet

DenseNet for CIFAR-100

代码

下期开始会逐步实现一些有意思的Computer Vision相关内容。本期实现一个DenseNet在CIFAR-100上分类。

首先介绍一下Pytorch自带专注处理图像相关任务的库torchvision,主要有3个包。

  • datasats:数据相关,包括CIFAR,SVHN, MNIST等等,所有对象都继承于一个抽象类data.Dataset
  • models:计算机视图模型,包括DenseNet,ResNet,AlexNet等等,代码中还有所有模型对应的已经训练好的模型参数下载地址,方便用于迁移训练。
  • transforms:用于图片预处理。 这里举个图片提取和预处理的样例,代码出处

DenseNet论文浅析

CNN作为图像识别主要手段,从最早的LeNet5到VGG,GoogleNet,ResNet,DenseNet,可见模型层数越来越深,就有一个无法绕过的问题:特征随着模型的深入而丢失。GoogleNet解决方法是每一个block使用不同size的kernel、ResNet则是使用 $y = f( x,{ \omega }) + x$ ,DenseNet的思想可以使用图1诠释:

模型使用一层BN-ReLU-Conv(3×3)接入,中间为N个Dense Block和N-1个Transition,最后一层BN-ReLU-avgPool-FC作为输出。

DenseNet-B中Dense Block使用k个BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3),k个层与层之间的输入来自于1 ~ k-1层的输出按channel维度拼接在一起(如图1所示),更多细节会在代码实现中解释。

代码实现

DenseBlock中单层layer实现

41行 - 本层的总输出是本层输入通过本层网络输出后按channel维度拼接输入后输出

DenseBlock实现

51行 - 按num_layers生成denselayer组,growth_rate是增长率,具体可查看图2中35行

Transition实现,使用AvgPool

DenseNet

60 ~ 64行 - 第一层接入 BN-ReLU-Conv(3×3)

70行 - DenseBlock与DenseBlock中间的输出/输入处理

74 ~ 83行 - 最后一层BN-ReLU-avgPool-FC作为输出

超参数

学习率初始0.1,每1/3总迭代数变为lr/10

args.layer_nums = [(args.depth-4)//6 for _ in range(3)]
Nevermore Written by:

步步生姿,空锁满庭花雨。胜将娇花比。