python - 在 Keras 中使用 multi_gpu_model 恢复训练

标签 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关闭前,loss在0.8左右。

重启IDE,重新加载模型,重新运行上面的代码,loss变成了1.5。

但是,根据Keras FAQmodel_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/

相关文章:

machine-learning - 如何同时训练有两组不同数据集的单个模型?

machine-learning - 如何训练神经网络来打乒乓球游戏?

neural-network - TensorFlow 中的连体神经网络

image-processing - 小图像数据集的数据增强技术?

python - 如何将整数转换为以 256 为基数的表示形式?

python - 如何检查 Tensorflow LinearClassifier 的特征权重?

hadoop - 如何使用Stanford NER CFR训练大型数据集

machine-learning - 在 Caffe 中创建新层

Python。使用单词列表中的任何单词拆分字符串

python - 删除单元测试之间对 Python 类的引用