我有一个像网一样的VGG表现不错但需要永远训练(~30小时)600多个时代
我试图切换到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)
不过,我想测试这种架构。
如果我执行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
的效果?
答案 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))