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

时间:2018-11-14 08:09:14

标签: python tensorflow keras

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

  

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

enter image description here

dist-packages/keras/engine/saving.py文件

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

train_model = load_model('model.h5')

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

optimizer = Adam(lr=lr, clipnorm=0.001)
train_model.compile(loss=dummy_loss, optimizer=optimizer)

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

3 个答案:

答案 0 :(得分:2)

保存模型时会收到此警告吗?

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

似乎keras无法保存tensorflow优化器:/

答案 1 :(得分:1)

如前所述,keras无法保存Tensorflow优化器。使用keras之一:

optimizer = keras.optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

model.compile(optimizer=optimizer,
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(...)
model.save('...')

这种方法对我有效,而无需在调用load之后手动编译。

答案 2 :(得分:1)

简介

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

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

修复

但是,该场景如何-我只想运行模型?好吧,像这样对compile=False使用load_model参数:

trained_model = load_model('model.h5', compile=False)

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

其他注释

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

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