使用自定义函数保存keras模型并将其加载到新笔记本时出错



我试图保存并加载我的keras模型。它可以加载到同一工作簿中,但当我在新笔记本中加载模型时会出错。该模型具有文本矢量化层和自定义标准化;标准化";参数首先我注册自定义功能:

@tf.keras.utils.register_keras_serializable()
def custom_standardization(input_data):
text = tf.strings.lower(input_data)
...
...
return text 

然后我定义了文本矢量化层:

vectorize_layer = tf.keras.layers.TextVectorization(
standardize=custom_standardization,
max_tokens = 1000,
output_mode ="int",
output_sequence_length = 30)

接下来我构建模型:

model_FFN = tf.keras.Sequential ([
vectorize_layer,
tf.keras.layers.Embedding(
input_dim = len(vectorize_layer.get_vocabulary()),
output_dim = 16,
mask_zero=True),
GlobalAveragePooling1D(),
Dense(1)
])

拟合模型后,我保存它:

model_FFN.compile (
optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate),
loss =loss,
metrics=metrics)
history = model_FFN.fit(train_ds_raw,epochs =epoch,validation_data=val_ds_raw)
modelFileName = 'models/saved_model'
model_FFN.save(modelFileName)

然而,当我试图将保存的模型加载到新笔记本中时,我收到以下错误:

modelFileName = 'models/saved_model'
loaded_model = keras.models.load_model(modelFileName)

错误:ValueError:层TextVectorization的standardize参数的未知值。如果恢复模型并且standardize是自定义可调用对象,请确保可调用对象已注册为自定义对象。看见https://www.tensorflow.org/guide/keras/save_and_serialize#registering_the_custom_object详细信息。允许的值为:NoneCallable或以下值之一:('lower_and_strip_pumption'、'lower'、'strip_pumpion'(。收到:自定义>自定义标准化

有人能不能看一下,看看出了什么问题?非常感谢。

根据这个GitHub问题,我认为这仍然是一个没有解决方案的问题。

我怀疑TextVectorization不是完全可序列化的,这就是问题所在。因此,即使函数custom_standardization被注册并作为参数传递给层TextVectorization,那么在代码库中仍然需要它来运行模型。这有点矛盾。

如果你仔细观察一下这个问题,你会发现有人提出了一个";变通办法";但这涉及到在新笔记本内复制CCD_ 8功能。如果你对此满意,那么这应该有效。否则,我想你可以不时地关注Keras团队仍然开放的新问题。

首先,我认为您在序列模型中的vectorize_layer之前缺少一个Input层。其次,为了解决您的错误,您必须在加载模型之前重新定义custom_standardization函数,以避免RuntimeError:无法恢复类TextVectorization的层。以下是我找到此解决方法的链接:

[1]https://github.com/tensorflow/tensorflow/issues/45231#issuecomment-799268188

[2] 无法恢复类的层TextVectorization-文本分类

最新更新