tensorflow tf.saved_model.save(模型,目录路径)和tf.keras.model.save

lskq00tm  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(226)

我有一个keras模型,想把它保存为张流图。tf.saved_model.save(model, path_to_dir)tf.keras.model.save有什么区别吗?
在这两种情况下,我都希望以tensorflow保存格式保存,而不会使用h5。我知道tf.saved_model.save更通用,但如果我使用keras模型,这两种格式在任何方面都不同。

hfyxw5xn

hfyxw5xn1#

一般情况下应该不会有什么区别,具体来说我们可以保存整个tf. keras模型--一个是TensorFlow SavedModel,一个是.h5
如前所述,您有一个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)

正如你所看到的,它们都有相同的参数。我建议选择**(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,因为我不想,新增,据doc:
保存跟踪:(仅适用于SavedModel格式)启用后,SavedModel将存储每个层的函数跟踪。可以禁用此选项,以便仅存储每个层的配置。默认值为True。禁用此选项将缩短序列化时间并减小文件大小,但要求所有自定义层/模型都实现get_config()方法。
另外,在您保存整个模型时,如果您自定义了类似层的内容,我想提醒您在加载模型时使用custom_object参数。

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

zbwhf8kr2#

你能查一下这个吗TF2.2:从tensorflow_hub加载保存的模型失败,原因为“AttributeError:“_UserObject”对象没有属性“summary”
向下滚动到@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()

相关问题