在Keras下缩小Densenet121

时间:2018-02-02 10:29:55

标签: python machine-learning keras

我有一个像网一样的VGG表现不错但需要永远训练(~30小时)600多个时代 enter image description here

我试图切换到keras.applications.densenet.Densenet121以获得更好的性能和更快的训练时间,但即使在密集层中的高压差也显然过度拟合。

    from keras.applications.densenet import DenseNet201, DenseNet121

    input_image = Input(shape=input_shape)
    x = BatchNormalization()(input_image)

    base_model = DenseNet121(
            include_top=False,
            weights='imagenet' if weights else None,
            input_shape=input_shape,
            pooling='max')

    x = base_model(x)
    x = Flatten()(x)
    x = Dense(128, activation='relu', name='fc2')(x)
    x = BatchNormalization()(x)
    x = Dropout(0.9, name='dropout_fc2')(x)
    predictions = Dense(nb_classes, activation="softmax", name="predictions")(x)

enter image description here

不过,我想测试这种架构。

如果我执行keras.applications.densenet.DenseNet121,我有:

    def DenseNet121(include_top=True,
                weights='imagenet',
                input_tensor=None,
                input_shape=None,
                pooling=None,
                classes=1000):
    return DenseNet([6, 12, 24, 16],
                    include_top, weights,
                    input_tensor, input_shape,
                   pooling, classes)

[6, 12, 24, 16]作为图层大小。

分别:

DenseNet201 = [6, 12, 48, 32]
DenseNet169 = [6, 12, 32, 32]
DenseNet121 = [6, 12, 24, 16]

参考实施是:

但是他们使用深度和增长作为参数:-depth 100 -growthRate 12我无法确定深度/增长率图层之间的关系。

如何在Keras下缩小此模型,以获得相当于DenseNet40的效果?

1 个答案:

答案 0 :(得分:4)

像DenseNet121,DenseNet169,DenseNet201,DenseNet264这样的标准实现对每个Dense块使用显式的层数。在前面提到的所有网络中,浓黑的数量为4,增长率为32。但是其中的层数变化如下:

DenseNet121 = [6, 12, 24, 16]
DenseNet169 = [6, 12, 32, 32]
DenseNet201 = [6, 12, 48, 32]
DenseNet264 = [6, 12, 64, 48]

对于具有自定义层数和增长率的实现,您可以提出自己的每个密集块的层数,也可以统一分配每个密集块的层数。

DenseNet中的层数形式为3 N + 4。您可以在自定义网络中使用自己的增长率。 (例如12)。

如果要使用keras实现来制作自定义网络,则必须将每个块的层列表传递给它。 因此,如果要使用100层网络,请传递一个[25, 25, 25, 25]列表。

DenseNet([25, 25, 25, 25],
         include_top, weights,
         input_tensor, input_shape,
         pooling, classes)

请注意,keras当前仅支持4个块的DenseNet,因此,如果要修改DenseNet的keras实现,则必须将其传递给大小为4的列表。

然后在keras-applications/keras_applications/densenet.py的{​​{3}}中更改硬编码增长率。 只需更改:

x = conv_block(x, 32, name=name + '_block' + str(i + 1))

收件人:

x = conv_block(x, your_growth_rate, name=name + '_block' + str(i + 1))
相关问题