我在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 FAQ,model_save
应该保存整个模型(架构+权重+优化器状态),load_model
应该返回一个与之前相同的编译模型之一。
所以我不明白为什么在恢复训练后损失会变大。
编辑:如果我不使用multi_gpu_model
而只使用普通模型,我就可以在我离开的地方恢复。
答案 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可以提供帮助。