1.介绍
DenseNet模型,它的基本思路与ResNet一致,但是它建立的是前面所有层与后面层的密集连接(dense connection),它的名称也是由此而来。DenseNet的另一大特色是通过特征在channel上的连接来实现特征重用(feature reuse)。这些特点让DenseNet在参数和计算成本更少的情形下实现比ResNet更优的性能,DenseNet也因此斩获CVPR 2017的最佳论文奖
2.模型结构
A 5-layer dense block
A deep DenseNet with three dense blocks
3.模型特点
DenseNet具有以下两个明显的优点, 加强了feature的传递 ;更有效地利用了feature ;它与ResNet主要区别,可以通过一下两个公式来表现:
4.代码实现 keras
"""
论文原文中提出使用1*1卷积核的卷积层作为bottleneck层来优化计算效率
"""
def DenseLayer(x, nb_filter, bn_size=4, drop_rate=0.2):
x = BatchNormalization(axis=3)(x)
x = Activation('relu')(x)
x = Conv2D(bn_size * nb_filter, (1, 1), strides=(1, 1), padding='same')(x)
x = BatchNormalization(axis=3)(x)
x = Activation('relu')(x)
x = Conv2D(nb_filter, (3, 3), strides=(1, 1), padding='same')(x)
if drop_rate: x = Dropout(drop_rate)(x)
return x
""""
如论文中所述,将每一个Dense层的输出与其输入融合之后作为下一Dense层的输入,来实现密集连接
"""
def DenseBlock(x, nb_layers, growth_rate, drop_rate=0.2):
for ii in range(nb_layers):
conv = DenseLayer(x, nb_filter=growth_rate, drop_rate=drop_rate)
x = concatenate([x, conv], axis=3)
return x