【发布时间】:2018-01-25 23:32:27
【问题描述】:
我正在尝试在 Keras 中微调修改后的 InceptionV3 模型。
我按照this page 上的示例“在一组新的类上微调 InceptionV3”。
所以我首先使用以下代码训练了添加到 InceptionV3 基础模型的顶层密集层:
model = Model(inputs=base_model.input, outputs=predictions)
for layer in base_model.layers:
layer.trainable = False
parallel_model = multi_gpu_model(model, gpus=2)
parallel_model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
history = parallel_model.fit_generator(generate_batches(path), steps_per_epoch = num_images/batch_size, epochs = num_epochs)
之后,我尝试微调 InceptionV3 中的前 2 个初始块。根据示例,我应该做的是:
for layer in model.layers[:249]:
layer.trainable = False
for layer in model.layers[249:]:
layer.trainable = True
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy')
model.fit_generator(...)
但我使用的是multi_gpu_model,所以我不知道如何冻结前 249 层。
我的意思是,如果我冻结 no-gpu 模型中的层(如示例),并使用 parallel_model = multi_gpu_model(model, gpus=2) 冻结 parallel_model 中的层,那么刚刚训练的顶部密集层中的权重并且包含在parallel_model 中的会被覆盖,对吧?
另一方面,我尝试直接使用for layer in parallel_model.layers[:249]: layer.trainable = False,但是当我检查parallel_model中的图层时,它显示:
for i, layer in enumerate(parallel_model.layers):
print(i, layer.name)
(0, 'input_1')
(1, 'lambda_1')
(2, 'lambda_2')
(3, 'model_1')
(4, 'dense_3')
那么“lambda_1”、“lambda_2”和“model_1”层是什么?为什么它在parallel_model中只显示5层?
更重要的是,如何冻结parallel_model中的图层?
【问题讨论】: