代码之家  ›  专栏  ›  技术社区  ›  ilim

keras_contrib-加载所有权重,由于优化器权重导致值错误

  •  1
  • ilim  · 技术社区  · 7 年前

    我有一个Keras模型,有很多层 Embedding , LSTM Dropout ,以及 CRF 实施 keras_contrib .

    我正试图恢复训练一个部分训练过的模型重量,我之前保存了这个重量。然而,当我尝试通过 save_load_utils.load_all_weights 属于 克拉斯·康特里布 ,我收到了以下错误。

    第108行,加载所有重量:

    模型优化器。设置权重(优化器权重值)

    第113行,在集合权重中:

    优化器的“+str(len(params))+”)

    ValueError: 指定权重列表(36)的长度与优化器(0)模型的权重数不匹配。优化器。设置权重(优化器权重值)

    显然,优化器权重列表的长度为0。在里面 keras implementation of the optimizers.py 有人说,设置_权重 “只应在计算梯度后调用(否则优化器没有权重)。”

    我想知道如何手动初始化优化器权重,以便我尝试加载的模型权重可以覆盖它们。我想用一个1号的虚拟批次来训练一个单一时代的模型,但是还有其他更优雅的方法来实现这一点吗?

    The entire code 是在Github上,但下面是我培训的模型,提供一个简短的参考。

    # Initialize vocab_size & embedding_weights
    # Initialize C, U, N, M, H
    
    model = Sequential()
    embedding_layer = Embedding(vocab_size, N,
                                weights=[embedding_weights], mask_zero=True,
                                embeddings_regularizer=regularizers.l2(0.0001))
    model.add(TimeDistributed(embedding_layer,
                              input_shape=(C, U)))
    model.add(TimeDistributed(Bidirectional(LSTM(M // 2, return_sequences=True,
                                                 kernel_regularizer=regularizers.l2(0.0001)))))
    model.add(TimeDistributed(Dropout(0.2)))
    model.add(TimeDistributed(GlobalMaxPooling1D()))
    model.add(Bidirectional(LSTM(H // 2, return_sequences = True,
                                 kernel_regularizer=regularizers.l2(0.0001))))
    model.add(Dropout(0.2))
    crf = CRF(num_tags, sparse_target=False, kernel_regularizer=regularizers.l2(0.0001))
    model.add(crf)
    model.compile(optimizer, loss = crf.loss_function, metrics=[crf.accuracy])
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   ilim    7 年前

    我最后做的几乎和我在问题中提到的一模一样。

    我创建了一个小的虚拟训练&验证集,并针对单个历元对模型进行训练,以便初始化网络权重。然后我只加载上一节课的重量,继续训练,使用 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 .

    推荐文章