Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python keras_contrib-加载所有权重,由于优化器权重导致值错误_Python_Tensorflow_Machine Learning_Keras_Deep Learning - Fatal编程技术网

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

Python keras_contrib-加载所有权重,由于优化器权重导致值错误,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我有一个Keras模型,它具有层嵌入,LSTM,和退出,以及CRF实现Keras\u contrib 我试图恢复训练一个我以前保存的部分训练模型重量。但是,当我尝试通过keras\u contrib的save\u load\u utils.load\u all\u weights加载以前训练过的模型时,我收到了以下错误 第108行,所有负载重量: model.optimizer.set_权重(优化器_权重_值) 第113行,在集合权重中: 优化器的“+str(len(params))+”) 值错

我有一个Keras模型,它具有层
嵌入
LSTM
,和
退出
,以及
CRF
实现
Keras\u contrib

我试图恢复训练一个我以前保存的部分训练模型重量。但是,当我尝试通过
keras\u contrib
save\u load\u utils.load\u all\u weights
加载以前训练过的模型时,我收到了以下错误

第108行,所有负载重量:

model.optimizer.set_权重(优化器_权重_值)

第113行,在集合权重中:

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

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

显然,优化器权重列表的长度为0。其中指出,set_权重“应仅在计算梯度后调用(否则优化器没有权重)。”

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

是在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])

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

我创建了一个小的虚拟训练和验证集,并针对单个历元训练模型,以便初始化网络权重。然后,我刚刚加载了上一节课的重量,并使用
keras\u contrib.utils.save\u load\u utils
中的
load\u all\u weights
继续训练。下面的代码示例大致描述了我使用的过程

# 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)

您可以在上查看实际代码。

设置
load\u中包含\u optimizer=False
所有权重也对我有效,无需初始化为虚拟数据上的模型。