UserWarning:在保存文件中找不到训练配置:*未*编译模型。手动编译

Azi*_*aev 8 python keras tensorflow

经过培训之后,我想通过加载创建的model.h5并执行评估程序来检查准确性。但是,我收到以下警告:

/usr/local/lib/python3.5/dist-packages/keras/engine/saving.py:269:UserWarning:在保存文件中找到训练配置:编译模型。手动编译。warnings.warn('在保存文件中找不到训练配置:

在此处输入图片说明

这个dist-packages/keras/engine/saving.py档案

所以加载创建模型的问题->这行代码

train_model = load_model('model.h5')
Run Code Online (Sandbox Code Playgroud)

问题表明该模型尚未编译,但是我做到了。

optimizer = Adam(lr=lr, clipnorm=0.001)
train_model.compile(loss=dummy_loss, optimizer=optimizer)
Run Code Online (Sandbox Code Playgroud)

我不明白我在做什么错。。。请帮我!SOS :-(

Tom*_*dor 8

介绍

我想补充一下olejorgenb的答案-对于特定的情况,您不想训练模型,只需使用它(例如在生产中)。

“编译”是指“准备培训”,主要包括设置优化程序。它也可能以前已经保存过,然后您可以在加载保存的模型后继续“相同”训练。

解决方法

但是,情况如何-我只想运行模型?好吧,使用compile=False参数来load_model这样:

trained_model = load_model('model.h5', compile=False)
Run Code Online (Sandbox Code Playgroud)

如果不先.fit()使用trained_model.compile(...),就无法使用该模型,但最重要的是-警告将消失。

杂项说明

顺便说一句,在我的Keras版本中,该参数include_optimizer的默认值为True。这也适用于trainig回调,例如Checkpoint。这意味着,在加载Keras保存的模型时,通常可以指望所包含的优化器(情况除外:请参见Hull Gasper的回答)。

但是,当您有一个未经Keras训练的模型时(例如,转换由Darknet训练的模型时),该模型将被保存为未编译状态。这会产生警告,您可以按照上述方法消除警告。

  • `compile=False` 对我不起作用。我在训练期间保存了很多模型。我需要加载它们只是为了做出一些推论并评估不同的模型版本,并且两个版本都会引发警告。我正在运行 `Keras==2.2.4`、`tensorflow-gpu==1.14.0` 和 `python 3.6.6` (2认同)

ole*_*enb 4

保存模型时是否收到此警告?

WARNING:tensorflow:TensorFlow optimizers do not make it possible to access 
optimizer attributes or optimizer state after instantiation. As a result, we 
cannot save the optimizer as part of the model save file.You will have to 
compile your model again after loading it. Prefer using a Keras optimizer 
instead (see keras.io/optimizers).
Run Code Online (Sandbox Code Playgroud)

似乎 keras 无法保留张量流优化器:/