我有一个带有图层Embedding
,LSTM
和Dropout
的Keras模型,以及CRF
的{{1}}实现。
我正在尝试恢复我之前保存的部分训练模型权重的训练。但是,当我尝试通过keras_contrib
的{{1}}加载以前训练过的模型时,我收到了以下错误。
第108行,在load_all_weights中:
model.optimizer.set_weights(optimizer_weight_values)
第113行,在set_weights中:
'优化器(' + str(len(params))+')')
ValueError:指定权重列表的长度(36)与优化程序(0)model.optimizer.set_weights(optimizer_weight_values)的权重数不匹配
显然,优化程序权重列表的长度为0.在keras implementation of the optimizers.py中,表示只应在计算渐变后调用set_weights "否则优化程序没有权重"
我想知道如何以某种方式手动初始化优化器权重,以便我尝试加载的模型权重可以覆盖它们。我想用一个大小为1的虚拟批次来训练模型的单个时代,但还有其他更优雅的方法来实现这个目标吗?
The entire code在Github上,但下面是我训练的模型,提供简要参考。
save_load_utils.load_all_weights
答案 0 :(得分:0)
我最终做的几乎就是我在问题中提到的。
我创建了一个小型假人训练&验证集,并为单个时期训练模型,以便初始化网络权重。然后我只使用load_all_weights
中的keras_contrib.utils.save_load_utils
来加载上一个会话中的权重并继续培训。下面的代码示例大致描述了我使用的过程。
# Initialize real_training_set as a 2-tuple with (input, expected_result)
if load_model_file is not None:
# Initialize dummy_training_set as a 2-tuple with (input, expected_result)
model.fit_generator(batch_generator_function(dummy_training_set[0],
dummy_training_set[1], ... ), epochs = 1)
save_load_utils.load_all_weights(model, load_from_model_file)
model.fit_generator(batch_generator_function(real_training_set[0],
real_training_set[1], ... ), epochs = 1)
您可以在Github上查看实际代码。