在 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/growthrate 和 layers 之间的关系。
如何在 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 上的分类器