由于优化器权重,keras_contrib load_all_weights导致值错误

2024-06-02 06:11:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Keras模型,它具有层EmbeddingLSTM、和{},以及{}实现{}。在

我试图恢复训练一个我之前保存的部分训练模型的重量。但是,当我试图通过keras_contribsave_load_utils.load_all_weights加载一个先前训练过的模型时,我收到了以下错误。在

line 108, in load_all_weights:

model.optimizer.set_weights(optimizer_weight_values)

line 113, in set_weights:

'of the optimizer (' + str(len(params)) + ')')

ValueError: Length of the specified weight list (36) does not match the number of weights of the optimizer (0)model.optimizer.set_weights(optimizer_weight_values)

显然,优化器权重列表的长度为0。在keras implementation of the optimizers.py中,声明set_weights“只应在计算梯度后调用(否则优化器没有权重)。”

我想知道如何以某种方式手动初始化优化器权重,以便我尝试加载的模型权重可以覆盖它们。我曾想过用一个大小为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])

Tags: ofthe模型addmodelembeddingoptimizer权重
1条回答
网友
1楼 · 发布于 2024-06-02 06:11:14

我最后所做的几乎就是我在问题中提到的。在

我创建了一个小的虚拟训练和验证集,并为单个历元训练模型,以便初始化网络权重。然后我只加载上一节课的权重并继续训练,使用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上查看实际代码。在

相关问题 更多 >