在 Keras 下缩小 Densenet121

Posted

技术标签:

【中文标题】在 Keras 下缩小 Densenet121【英文标题】:Downsizing a Densenet121 under Keras 【发布时间】:2018-07-12 20:06:33 【问题描述】:

我有一个类似 VGG 的网络,它性能很好,但需要永远训练(~30 小时)超过 600 个 epoch

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

    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)

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

如果我去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]

参考实现有:

[Torch DenseNets] (https://github.com/liuzhuang13/DenseNet/blob/master/models/densenet.lua) [TensorNets] (https://github.com/taehoonlee/tensornets/blob/master/tensornets/densenets.py)

但他们使用深度和增长作为参数:-depth 100 -growthRate 12,我无法弄清楚 depth/growthratelayers 之间的关系。

如何在 Keras 下缩小此模型的大小,使其具有与 DenseNet40 等价的功能?

【问题讨论】:

嗨,我现在正在经历类似的问题。您找到制作自己的 Densenet40 的方法了吗? 不行,我直接在代码中修改了keras层,多种方式都没有成功。所以我结束了经典的微调。我没能在论文中找到对深度/增长/层的全面描述 好的,谢谢你告诉我。 【参考方案1】:

DenseNet121、DenseNet169、DenseNet201、DenseNet264 等标准实现使用每个密集块的明确层数。前面提到的所有网络中的致密黑色数为 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 中更改following line 中的硬编码增长率。 只需更改:

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

到:

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

【讨论】:

以上是关于在 Keras 下缩小 Densenet121的主要内容,如果未能解决你的问题,请参考以下文章

无法将 chexnet 预训练的权重文件加载到 Densenet121

无法在 pytorch 中替换 Densenet121 上的分类器

Keras ImageDataGenerator 不处理符号链接文件

Tensorflow 量化感知训练

Keras CIFAR-10图像分类 DenseNet 篇

Keras CIFAR-10图像分类 DenseNet 篇