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

2024-09-30 16:31:18 发布

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

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

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

这是代码:https://github.com/ParikhKadam/bidaf-keras 用于保存和加载模型的代码在/models中/比达法.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()

培训历史很好,这是:

^{pr2}$

此外,我已经注意到加载自定义对象,如层,损失函数和准确性。在

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

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

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

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

这一问题在过去两年中一直悬而未决。不明白所有的开发者都在做什么!有谁能帮忙吗?我应该换成tensorflow还是我也会面临同样的问题?在

请帮忙。。。在

编辑1: 我还没试着用模型.保存()但我在其他帖子上看到有人说这个问题是用模型.保存()和models.save_模型(). 如果问题真的解决了,ModelCheckpoint还应该保存优化器状态以恢复训练,但它没有(或不能)任何原因。我已经验证了ModelCheckpoint回调的代码,它间接调用模型.保存()这会导致呼叫models.save_模型(). 所以理论上,如果基地里的问题。models.save_模型()是解的,那么它也应该在其他函数中求解。在

对不起,我没有一台强大的机器来检查这个。如果有人在这里,我已经在github上分享了我的代码,并且在问题中提供了链接。请尝试在它的简历培训,并找出这个问题的原因。在

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

编辑2: 最近,我试着检查重量是否保存正确。为此,我用验证生成器对模型进行了评估。我看到输出损耗和精度与模型训练开始时一样。看到这一点,我得出了一个结论,那就是节省模型权重的问题。我可能错了。。在

顺便说一句,我在我的模型代码中也使用了multi_gpu_model()。它会引起这个问题吗?我不能尝试在CPU上训练模型,因为它太重了,只需要几天时间就可以完成1个历元。有人能帮忙调试吗?在

这些天来我在这些问题上看不到任何回应。只需在自述文件.md在keras-github中,用户可以在试用keras之前意识到这一点,并在之后浪费几个月的时间。在


Tags: 代码模型importgithubdatamodelmodelssave