缩小Keras下的Densenet 121

2024-09-25 04:19:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似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的实现,我有:

^{pr2}$

[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的等价物?在


Tags: nameimageinputbasemodel性能kerasdense
1条回答
网友
1楼 · 发布于 2024-09-25 04:19:54

像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]列表。在

^{pr2}$

请注意,keras目前只支持具有4个块的DenseNet,因此如果您要修改DenseNet的keras实现,则必须向它传递一个大小为4的列表。在

并改变following linekeras-applications/keras_applications/densenet.py中的硬编码增长率。 只需更改:

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

收件人:

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

相关问题 更多 >