keras_contrib - 由于优化程序权重导致ValueError的load_all_weights

时间:2018-05-17 14:20:06

标签: python tensorflow machine-learning keras deep-learning

我有一个带有图层EmbeddingLSTMDropout的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

1 个答案:

答案 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上查看实际代码。