在Keras中使用multi_gpu_model恢复培训

时间:2018-01-25 16:13:59

标签: python machine-learning deep-learning keras multi-gpu

我在Keras中使用multi_gpu_model训练修改后的InceptionV3模型,并使用model.save来保存整个模型。

然后我关闭并重新启动IDE并使用load_model重新实现模型。

问题是我无法在我离开的地方恢复训练。

以下是代码:

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)

model.save('my_model.h5')

在IDE关闭之前,损失大约是0.8。

重新启动IDE后,重新加载模型并重新运行上面的代码,损失变为1.5。

但是,根据Keras FAQmodel_save应该保存整个模型(架构+权重+优化器状态),load_model应该返回一个与之前相同的编译模型之一。

所以我不明白为什么在恢复训练后损失会变大。

编辑:如果我不使用multi_gpu_model而只使用普通模型,我就可以在我离开的地方恢复。

2 个答案:

答案 0 :(得分:1)

调用multi_gpu_model(...)时,Keras会自动将模型的权重设置为某些默认值(至少在我当前使用的2.2.0版本中)。这就是为什么您无法在保存培训的同时恢复培训。

我只是通过将并行模型的权重替换为顺序模型的权重来解决此问题:

parallel_model = multi_gpu_model(model, gpus=2)

parallel_model.layers[-2].set_weights(model.get_weights()) # you can check the index of the sequential model with parallel_model.summary()

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)

我希望这会对您有所帮助。

答案 1 :(得分:0)

@ saul19am编译时,您只能加载权重和模型结构,但仍然会丢失optimizer_state。我认为this可以提供帮助。