Densenet
简要说说干了啥
Resnet表明在靠近输入层与靠近输出层之间设置shortcut能够更好地训练网络。Densenet在其基础上加上了更多连接,每一层的输入均为前面所有层的特征。Densenet有以下几个优点:
- 缓解了梯度消失的问题
- 加强了特征的传播
- 鼓励了特征的重用
- 减少了参数的数量
下图是DenseNet部分模型结构:
为啥这样做
随着网络结构越来越深,神经网络逐渐出现梯度消失等问题,为了解决这些问题出现了诸如resnet、highway_network等工作,这些工作的本质都是创建离输入层近的层与离输出层近的层之间的快速通道。Densenet为了更好的利用各个层之间的信息,将所有层直接连接在一起,这样做的好处可能是网络中每一层的特征值能够被更好的利用, 从而让网络更浅。
DenseNet 网络模型
在DenseNet中最重要的便是DenseBlock,DenseBlock提出了一种新的连接方式可以将当前层直接连接到它之后的所有层。其公式如下:
x
l
=
H
l
(
[
x
0
,
x
1
,
.
.
.
,
x
l
−
1
]
)
x_l = H_l([x_0, x_1,...,x_{l-1}])
xl=Hl([x0,x1,...,xl−1])
其中
[
x
0
,
x
1
,
.
.
.
,
x
l
−
1
]
[x_0, x_1,...,x_{l-1}]
[x0,x1,...,xl−1]代表
l
l
l层之前的所有层产生的特征图通过通道连接的结果,
H
l
H_l
Hl被定义为三个连续的操作,分别是批量归一化、ReLU激活函数以及一个
3
×
3
3\times3
3×3的卷积。由于需要进行通道连接,所以
x
0
,
x
1
,
.
.
.
,
x
l
−
1
x_0, x_1,...,x_{l-1}
x0,x1,...,xl−1层的特征图大小应该是一样的,在DenseBlock中不会存在有池化操作,而是在三个Dense Block之间加入transpose layer。
transpose layer 包含池化层以及卷积核为
1
×
1
1\times1
1×1的卷积来实现DenseBlock中不能使用的池化操作以及特征降维(这里不是很清晰)。
如果DenseBlock中每一层神经网络产生 k k k个特征图的话,那么第 l l l层网络的特征图数就是 k 0 + k × ( l − 1 ) k_0+k\times(l-1) k0+k×(l−1)个特征图,其中 k 0 k_0 k0是输入层特征图的通道数,而 k k k是我们可以设置的超参数,称作Growth rate。DenseNet中由于每一层都能够访问其前面所有层的特征图,所以这个Growth rate设置的较小也能取得不错的结果。
实验与结果
实验采用了三个数据集分别是
- CIFAR
- SVNH
- IMAGENET
并对这三个数据集进行了介绍,同时给出了训练时的超参数的设计。
在这三个数据集上面训练的效果如下图所示
同时在准确率、容量大小、以及过拟合三个方面分析了DenseNet。
其中可以用在隐写分析中的特点应该是DenseNet更不容易过拟合。因为隐写分析中如果使用高维特征的话应该很容易过拟合。