在Keras中加载后,为什么保存的模型会从初始损失和准确性值开始?

时间:2019-02-14 14:10:22

标签: python tensorflow keras neural-network deep-learning

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

问题是,当我加载经过训练的模型并尝试使用initial_epoch自变量继续进行训练时,损失和准确性值与未经训练的模型相同。

以下是代码:https://github.com/ParikhKadam/bidaf-keras 用于保存和加载模型的代码在/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的旧分支中找到我用来节省权重的旧代码。

我在没有帮助的情况下介绍了此问题-#4875

这个问题从过去两年开始。无法理解所有开发人员在做什么!请问有人可以帮忙吗?我应该切换到tensorflow还是会面临同样的问题?

请帮助...

编辑1: 我没有尝试使用model.save()保存模型,但是我在其他线程上看到有人说该问题已通过model.save()和models.save_model()解决。如果确实解决了问题,ModelCheckpoint还应该保存优化器状态以恢复训练,但是无论如何都不会(或者不能)。我已经验证了ModelCheckpoint回调的代码,该代码间接调用model.save(),从而导致对models.save_model()的调用。因此,从理论上讲,如果解决了基础模型(即models.save_model())中的问题,则也应该在其他函数中解决该问题。

对不起,但我没有强大的计算机来实际检查此问题。如果有人在,我已经在github上共享了我的代码,问题中提供了链接。请尝试对其进行简历培训,并找出导致此问题的原因。

我正在使用国家机构提供的计算机,因此,这里的学生需要为他们的项目共享这台计算机。我无法使用该计算机执行此类任务。谢谢你。

Edit2: 最近,我尝试检查权重是否正确保存。为此,我使用验证生成器评估了模型。我看到输出损失和准确性与模型训练开始时的相同。看到这一点,我得出了一个结论,即实际上是节省模型权重的问题。我可能在这里错了。

顺便说一句,我在模型代码中也使用了multi_gpu_model()。会导致这个问题吗?我无法尝试在CPU上训练模型,因为它太重了,将需要几天才能完成1个纪元。谁能帮助调试?

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

0 个答案:

没有答案