如何在 Tensorflow 中保存不可序列化的模型

How to save a non serializable model in Tensorflow

我创建了一个带有自定义层的模型,它有矩阵操作和类似的东西。我现在想在训练后保存我的模型。我试过:

model.save("model.h5", save_format='tf')

但是出现错误:

NotImplementedError: Saving the model to HDF5 format requires the model to be 
a Functional model or a Sequential model. It does not work for subclassed models, 
because such models are defined via the body of a Python method, which isn't safely serializable.
Consider saving to the Tensorflow SavedModel format (by setting save_format="tf") or using `save_weights`.

我发现了一些有用的东西:

checkpoint_path = "checkpoints"

ckpt = tf.train.Checkpoint(model=model,
                           optimizer=optimizer)

ckpt_manager = tf.train.CheckpointManager(ckpt, checkpoint_path, max_to_keep=5)

# if a checkpoint exists, restore the latest checkpoint.
if ckpt_manager.latest_checkpoint:
  ckpt.restore(ckpt_manager.latest_checkpoint)

我的问题是:通过使用这种方式,我可以像保存可序列化模型(如顺序模型)一样做同样的事情,或者这个检查点用于其他目的?

实际上有两种格式可以用来保存您的模型。您可以简单地使用旧的 Keras H5 格式 model.save("test", save_format='h5') 保存模型,或者通过显式设置 model.save("test", save_format='tf') 或简单地 model.save("test") 使用 Tensorflow SavedModel format,因为 tf调用 model.save 时默认使用格式。对于 model.save("model.h5", save_format='tf'),您似乎试图同时使用这两种格式,这看起来并不奏效。使用 tf 格式保存模型应该可以。可以找到更多信息 here。例如下面的模型,只有在使用model.savemodel.save("test", save_format='tf')时才能保存:

import tensorflow as tf

class SomeModel(tf.keras.Model):

  def __init__(self):
    super(SomeModel, self).__init__()
    self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu, )
    self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax)

  def call(self, inputs):
    x = self.dense1(inputs)
    return self.dense2(x)

model = SomeModel()
model.compute_output_shape(input_shape=(1,1))
model.save("model")

在此子类模型上调用 model.save("test", save_format='h5')model.save("test.h5") 甚至 model.save("model.h5", save_format='tf') 将导致错误。

Checkpoints 在您需要中断训练或训练崩溃并且您想从保存的状态恢复训练模型时特别有用。在推理过程中,您可以轻松加载模型的最新检查点并进行预测,而无需重新编译它。