tf.saved_model.save(model, path_to_dir) 和 tf.keras.model.save 之间的区别

roh*_*jan 11 tensorflow tensorflow2.0

我有一个 keras 模型,想将其保存为张量流图。tf.saved_model.save(model, path_to_dir)和之间有区别吗tf.keras.model.save

在这两个中,我想以tensorflow保存的格式保存并且不会使用h5格式。我理解tf.saved_model.save是更通用的,但如果我使用keras模型,这两个无论如何都是不同的。

M.I*_*nat 5

一般情况下,应该没有什么区别。为了给出具体的答案,我们可以保存整个tf. keras模型——一种是TensorFlow SavedModel,另一种是.h5format。

正如您所说,您有一个keras模型并想要保存其图形。你也可以这样做

  • Model.save或者
  • tf.keras.models.save_model
(1)
Model.save(
    filepath,
    overwrite=True,
    include_optimizer=True,
    save_format=None,
    signatures=None,
    options=None,
    save_traces=True,
)

(2)
tf.keras.models.save_model(
    model,
    filepath,
    overwrite=True,
    include_optimizer=True,
    save_format=None,
    signatures=None,
    options=None,
    save_traces=True,
)

(3)
# tf.saved_model.save(model, path_to_dir)
tf.saved_model.save(model,
                    export_dir, 
                    signatures, 
                    options)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,他们都持有相同的论点。我建议选择(1)(2),易于遵循。这是一个例子,我在数据集上训练了一个函数模型,并使用(1)(2)CIFAR方法保存模型,如下所示。

func_model.fit(x_train, y_train, batch_size=128, epochs=2, verbose = 1)
1s/step - loss: 2.7365 - categorical_accuracy: 0.1088
1s/step - loss: 1.8353 - categorical_accuracy: 0.3905

# with (1)
func_model.save('/content/1/', 
                save_format='tf', save_traces=False)
INFO:tensorflow:Assets written to: /content/1/assets
INFO:tensorflow:Assets written to: /content/1/assets

# with (2)
tf.keras.models.save_model(func_model, '/content/2/', 
                           save_format='tf', save_traces=False)
INFO:tensorflow:Assets written to: /content/2/assets
INFO:tensorflow:Assets written to: /content/2/assets
Run Code Online (Sandbox Code Playgroud)

加载并重新训练它们

from tensorflow.keras.models import  load_model

x = load_model('.//1/') 
y = load_model('.//2/')

x.fit(x_train, y_train, batch_size=128, epochs=1, verbose = 1)
1s/step - loss: 1.0963 - categorical_accuracy: 0.6780

y.fit(x_train, y_train, batch_size=128, epochs=1, verbose = 1)
1s/step - loss: 1.0963 - categorical_accuracy: 0.6780
Run Code Online (Sandbox Code Playgroud)

另请注意,有一个名为 的参数save_traces,默认情况下,它设置为True。我把它设置False为我不想的。根据文档,新添加:

save_traces:(仅适用于SavedModel格式)启用后,SavedModel将存储每个层的函数轨迹。可以禁用此功能,以便仅存储每层的配置。默认为 True。禁用此功能将减少序列化时间并减少文件大小,但它要求所有自定义层/模型实现 get_config() 方法。


custom_object另外仅供参考,当您保存整个模型时,如果您有自定义的类似图层的内容,我想提醒您在加载模型时使用该参数。

new_moedl = keras.models.load_model(
    "my_model", custom_objects={"CustomModel": CustomModel}
)
Run Code Online (Sandbox Code Playgroud)