我正在 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关闭前,loss在0.8左右。
重启IDE,重新加载模型,重新运行上面的代码,loss变成了1.5。
但是,根据Keras FAQ ,model_save
应该保存整个模型(架构 + 权重 + 优化器状态),load_model
应该返回一个与前一个模型相同的编译模型。
所以我不明白为什么恢复训练后loss变大了。
编辑:如果我不使用 multi_gpu_model
而只使用普通模型,我可以从我离开的地方继续。
最佳答案
当您调用 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)
希望对您有所帮助。
关于python - 在 Keras 中使用 multi_gpu_model 恢复训练,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48447371/