Python 为什么保存的模型在加载到Keras后以初始损失和精度值开始?

Python 为什么保存的模型在加载到Keras后以初始损失和精度值开始?,python,tensorflow,keras,neural-network,deep-learning,Python,Tensorflow,Keras,Neural Network,Deep Learning,我正在建立一个机器理解模型。这是一个需要大量数据训练的沉重模型,这需要我更多的时间。我使用keras回调在每个时代之后保存模型,还保存了丢失和准确性的历史记录 问题是,当我加载一个经过训练的模型,并尝试使用initial\u epoch参数继续训练时,损失和精度值与未经训练的模型相同 代码如下: 用于保存和加载模型的代码位于/models/bidaf.py中 我用于加载模型的脚本是: from .models import BidirectionalAttentionFlow from .sc

我正在建立一个机器理解模型。这是一个需要大量数据训练的沉重模型,这需要我更多的时间。我使用keras回调在每个时代之后保存模型,还保存了丢失和准确性的历史记录

问题是,当我加载一个经过训练的模型,并尝试使用
initial\u epoch
参数继续训练时,损失和精度值与未经训练的模型相同

代码如下: 用于保存和加载模型的代码位于/models/bidaf.py中 我用于加载模型的脚本是:


from .models import BidirectionalAttentionFlow
from .scripts.data_generator import load_data_generators
import os
import numpy as np


def main():
    emdim = 400
    bidaf = BidirectionalAttentionFlow(emdim=emdim, num_highway_layers=2,
                                       num_decoders=1, encoder_dropout=0.4, decoder_dropout=0.6)
    bidaf.load_bidaf(os.path.join(os.path.dirname(__file__), 'saved_items', 'bidaf_29.h5')) 
    train_generator, validation_generator = load_data_generators(batch_size=16, emdim=emdim, shuffle=True)
    model = bidaf.train_model(train_generator, epochs=50, validation_generator=validation_generator, initial_epoch=29, 
                              save_history=False, save_model_per_epoch=False)


if __name__ == '__main__':
    main()
培训历史相当好,即:

epoch,accuracy,loss,val_accuracy,val_loss
0,0.5021367247352657,5.479433422293752,0.502228641179383,5.451400522458351
1,0.5028450897193741,5.234336488338403,0.5037527732234647,5.0748545675049
2,0.5036885394022954,5.042028017280698,0.5039489093881276,5.0298488218407975
3,0.503893446146289,4.996997425685413,0.5040753162241299,4.976164487656699
4,0.5040576918224873,4.955544574118662,0.5041905890181151,4.931354981493792
5,0.5042372655790888,4.909940965651957,0.5043896965802341,4.881359395178988
6,0.504458428129642,4.8542871887472465,0.5045972716586732,4.815464454729135
7,0.50471843351102,4.791098495962496,0.5048680457262408,4.747811231472629
8,0.5050776754196002,4.713560494026321,0.5054184527602898,4.64730478015052
9,0.5058853749443502,4.580552254050073,0.5071290369370443,4.446513280167718
10,0.5081544614246304,4.341471499420364,0.5132941329030303,4.145318906086552
11,0.5123970410575613,4.081624463197288,0.5178775145611896,4.027316586998608
12,0.5149879128865782,3.9577423109634613,0.5187159608315838,3.950151870168726
13,0.5161411008840144,3.8964761709052578,0.5191430166876064,3.906301355196609
14,0.5168211272672539,3.8585826589385697,0.5191263493850466,3.865382308412537
15,0.5173216891201444,3.830764191839807,0.519219763635108,3.8341492204942607
16,0.5177805591697787,3.805340048675155,0.5197178382215892,3.8204319018292585
17,0.5181171635676399,3.7877712072310343,0.5193657963810704,3.798006804522368
18,0.5184295824699279,3.77086071548255,0.5193122694008523,3.7820449101377243
19,0.5187343664397653,3.7555085003534194,0.5203585262348183,3.776260506494833
20,0.519005008308583,3.7430062334375065,0.5195983755362352,3.7605361109533995
21,0.5192872482429703,3.731001830462149,0.5202017035842986,3.7515058917231405
22,0.5195097722222706,3.7194103983513553,0.5207148585133065,3.7446572377159795
23,0.5197511249107636,3.7101052441559905,0.5207420740297026,3.740088335181619
24,0.5199862479678652,3.701593302911729,0.5200187951731082,3.7254406861185188
25,0.5200847805044403,3.6944093077914464,0.520112738649039,3.7203616696860786
26,0.5203289568582412,3.6844954882274092,0.5217114634669081,3.7214983577364547
27,0.5205629846610852,3.6781935968943595,0.520915311442328,3.705435317731209
28,0.5206827641463226,3.6718110897539193,0.5214088439286978,3.7003081666703377
此外,我已经负责加载自定义对象,例如层、损失函数和精度

我现在有点沮丧,因为我花了好几天的时间来训练这个模型,直到现在我不能恢复训练。我参考了keras问题中的各种线索,发现很多人都面临着这样的问题,但找不到解决方案

线程中有人说“Keras不会保存RNN状态”(我没有使用有状态的RNN),还有人说“Keras会在保存之前重新初始化所有权重,我们可以使用标志来处理这些权重。”我的意思是,如果Keras中存在这样的问题,那么像save()这样的函数会有什么用途

我还尝试在每个历元之后只保存权重,然后从头开始构建模型,然后将这些权重加载到模型中。但那没用。您可以在上面列出的github repo的旧分支中找到我用来保存权重的旧代码

我在没有帮助的情况下提到了这个问题

这一问题在过去两年中一直悬而未决。无法理解所有开发人员都在做什么!有人能帮忙吗?我应该改用tensorflow吗,否则我也会面临同样的问题

请帮忙

Edit1: 我还没有尝试使用model.save()保存模型,但我在其他线程上看到有人说这个问题是通过model.save()和models.save\u model()解决的。如果真的解决了,ModelCheckpoint还应该保存优化器状态以恢复训练,但它没有(或不能)任何原因。我已经验证了ModelCheckpoint回调的代码,该回调间接调用model.save(),从而导致调用models.save\u model()。因此,从理论上讲,如果基本模型即models.save_model()中的问题得到解决,那么它也应该在其他函数中得到解决

对不起,我没有一台功能强大的机器来实际检查。如果有人在这里,我已经在github上共享了我的代码,并且在问题中提供了链接。请尝试对其进行简历培训,并检测此问题的原因

我正在使用一个国家研究所提供的计算机,因此,这里的学生需要为他们的项目共享这台计算机。我不能用那台电脑做这样的工作。谢谢

Edit2: 最近,我尝试检查是否正确保存了权重。为此,我使用验证生成器对模型进行了评估。我看到输出损耗和精度与模型训练开始时保持一致。看到这一点,我得出一个结论,这实际上是保存模型权重的问题。我可能错了

顺便说一句,我还在模型代码中使用了
multi\gpu\U model()
。它会导致这个问题吗?我不能尝试CPU上的训练模式,因为它太重了,只需要几天就可以完成1个历元。有人能帮忙调试吗

这些天来,我在这些问题上看不到任何回应。只需在keras github中的README.md上列出当前的问题,这样用户就可以在尝试keras并浪费数月时间之前知道