所以我昨天用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会导致问题。