经过培训之后,我想通过加载创建的model.h5
并执行评估程序来检查准确性。但是,我收到以下警告:
/usr/local/lib/python3.5/dist-packages/keras/engine/saving.py:269: UserWarning:在保存文件中找不到训练配置:模型 是 not 编译的。手动编译。 warnings.warn('不接受任何培训 在保存文件中找到配置:
此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:-(
答案 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训练的模型时),该模型将保存为未编译状态。这样会产生警告,您可以按照上述方法消除警告。