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

Posted

技术标签:

【中文标题】tf.saved_model.save(model, path_to_dir) 和 tf.keras.model.save 的区别【英文标题】:Difference between tf.saved_model.save(model, path_to_dir) and tf.keras.model.save 【发布时间】:2021-03-27 02:02:30 【问题描述】:

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

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

【问题讨论】:

如果给定的答案适合您,请告诉我。否则,您可以分享您的疑问,以便我们更新。谢谢。 【参考方案1】:

在一般情况下,应该没有任何区别。给出一个具体的答案,我们可以保存整个tf. keras模型——一个是TensorFlow SavedModel,另一个是.h5格式。

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

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

如您所见,它们都采用相同的论点。我建议选择(1)(2),简单易学。下面是一个例子,我在 CIFAR 数据集上训练了一个函数模型,并使用 (1)(2) 方法将模型保存如下。

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

加载并重新训练它们

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

还要注意有一个参数叫save_traces,默认设置为True。我将它设置为False,因为我不想这样做。新添加的,根据文档:

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


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

new_moedl = keras.models.load_model(
    "my_model", custom_objects="CustomModel": CustomModel
)

【讨论】:

感谢您的详细解答。如果您能回答,我有一个问题:不确定 custom_object 是做什么的。你能举个小例子吗?泰 看到这个帖子***.com/questions/62280161/… 谢谢 :) 祝你有美好的一天【参考方案2】:

您是否介意检查一下: enter link description here

向下滚动到@WGierke 的答案,如果有帮助,请不要忘记投票,您将获得代码并正常加载您的模型。 代码示例:

    import tensorflow as tf
import tensorflow_hub as hub

m = tf.keras.Sequential([hub.KerasLayer("saved_model", trainable=True),
    tf.keras.layers.Dense(10, activation='softmax')
])
m.build([None, 224, 224, 3])
m.summary()

对我来说很好用。

【讨论】:

以上是关于tf.saved_model.save(model, path_to_dir) 和 tf.keras.model.save 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose.model vs Connection.model vs Model.model

Mongoose.model vs Connection.model vs Model.model

model和 modle一样吗?

MVC 3 Razor @model 与使用 @Model.pName 与 @Html.LabelFor(model => model.pName) 打印属性的模型

不在models.py中的models

keras.models.Model.fit 中的“时代”是啥?