Tensorflow 2.3关于保存和加载模型的问题



所以我昨天用model.save('path')保存了我的模型后,我今天才发现tf2.3和keras保存模型有一些问题。问题已经在这里描述:Keras在加载模型后给出低精度。但公认的解决方案对我没有帮助。当我使用model = tf.keras.models.load_model('path')加载模型时,它返回比保存之前更低的测试精度。使用

model.compile(optimizer = SGD(lr = 1e-3, momentum = 0.9, decay = 1e-6), #RMSProp
loss = 'binary_crossentropy',
metrics = ['sparse_categorical_accuracy'])

没有帮助,因为在保存模型之前,我使用了'accuracy'而不是'sparse_categorical_accuracy',我现在在尝试训练或测试模型时得到以下错误:

InvalidArgumentError:  Can not squeeze dim[1], expected a dimension of 1, got 2
[[node Squeeze (defined at <ipython-input-34-11b07af8f987>:4) ]] [Op:__inference_test_function_363481]
Function call stack:
test_function

所以现在我的问题是:是否有任何方法来加载我保存的模型并获得保存的状态,或者我需要从零重新开始训练?

当你在训练中使用metrics = ["accuracy"]时,tensorflow会自动为你的损失函数取正确的精度。
"sparse_categorical_crossentropy"的精度指标为"sparse_categorical_accuracy"。在你的例子中,"binary_crossentropy"的精度度量是"binary_accuracy"

查看这里的所有指标:https://www.tensorflow.org/api_docs/python/tf/keras/metrics/

在编译模型时要始终保持数据所需的准确性。

model.compile(optimizer = SGD(lr = 1e-3, momentum = 0.9, decay = 1e-6),
loss = 'binary_crossentropy',
metrics = ['binary_accuracy'])

虽然听起来很琐碎,但您在加载模型后检查了输入数据吗?它的预处理方式和训练时完全一样吗?

最常见:规范化和预取

用非规范化数据测试加载的模型(经过规范化训练后)将导致糟糕的性能,正如您所描述的。

下面的工作在我的经验,甚至CustomMaskWarning。

# Saving
model.save(path)
# Loading
model = tf.keras.models.load_model(path)
# for only saving weights
model.save_weights(path)
# loading weights
model = create_model()  # create exactly the same model as trained
model.load_weights(path)

(".h5"如果你有CustomMaskWarning,并且没有通过重写get_config和设置config来解决它们,那么format会导致问题。

相关内容

  • 没有找到相关文章

最新更新