含hub.KerasLayer的模型加载后评估失败:NameError问题求助
加载包含hub.KerasLayer的Keras模型后调用evaluate报错NameError
我在做NLP练习时,遇到了加载包含tensorflow_hub.KerasLayer的已保存模型后无法正常评估的问题。以下是完整操作流程及报错详情:
操作步骤与代码
1. 创建、编译、训练模型(正常完成)
import tensorflow as tf from tensorflow.keras import layers import tensorflow_hub as hub # 创建基于Universal Sentence Encoder的Keras层 sentence_encoder_layer = hub.KerasLayer("https://www.kaggle.com/models/google/universal-sentence-encoder/TensorFlow2/universal-sentence-encoder/2", input_shape=[], dtype=tf.string, trainable=False, name="USE") # 用Sequential API构建模型 model_6 = tf.keras.Sequential([ # sentence_encoder_layer, # 注释掉直接使用的方式,改用Lambda包裹 layers.Lambda(lambda x: sentence_encoder_layer(x)), layers.Dense(64, activation="relu"), layers.Dense(1, activation="sigmoid"), ], name="model_6_USE") # 编译模型 model_6.compile(loss="binary_crossentropy", optimizer=tf.keras.optimizers.Adam(), metrics=["accuracy"]) # 训练模型 history_6 = model_6.fit(train_sentences, train_labels, epochs=5, validation_data=(val_sentences, val_labels))
2. 模型预测(正常完成)
# 生成预测结果 model_6_pred_prods = model_6.predict(val_sentences) model_6_pred_prods[:10]
3. 保存模型(正常完成)
# 保存为Keras原生格式 model_6.save("model_6_saved.keras")
4. 加载模型(表面正常完成)
# 重新初始化hub层 sentence_encoder_layer = hub.KerasLayer("https://www.kaggle.com/models/google/universal-sentence-encoder/TensorFlow2/universal-sentence-encoder/2", input_shape=[], dtype=tf.string, trainable=False, name="USE") # 加载模型,传入自定义对象 loaded_model_6 = tf.keras.models.load_model("model_6_saved.keras", custom_objects={'KerasLayer':hub.KerasLayer, 'tf':tf, 'sentence_encoder_layer': sentence_encoder_layer, }, safe_mode=False) # 查看模型结构,输出正常 print(loaded_model_6.summary())
5. 评估加载后的模型(失败)
# 评估加载后的模型 loaded_model_pred_probs = loaded_model_6.evaluate(val_sentences, val_labels)
报错信息
--------------------------------------------------------------------------- NameError Traceback (most recent call last) /tmp/ipykernel_2313/2915160527.py in <cell line: 0>() 1 # Evaluate the loaded_model ----> 2 loaded_model_pred_probs = loaded_model_6.evaluate(val_sentences, val_labels) 1 frames /usr/local/lib/python3.12/dist-packages/keras/src/utils/python_utils.py in <lambda>(x) 13 model_6 = tf.keras.Sequential([ 14 # sentence_encoder_layer, # take in sentences and then encode them into an embedding ---> 15 layers.Lambda(lambda x: sentence_encoder_layer(x)), 16 layers.Dense(64, activation="relu"), 17 layers.Dense(1, activation="sigmoid"), NameError: Exception encountered when calling Lambda.call(). name 'sentence_encoder_layer' is not defined Arguments received by Lambda.call(): • inputs=tf.Tensor(shape=(None,), dtype=string) • mask=None • training=False
我已经在加载模型前重新初始化了sentence_encoder_layer,并且在custom_objects中传入了该对象,但仍然提示该变量未定义。请问该如何解决这个问题?
内容的提问来源于stack exchange,提问作者J V
相关产品推荐
相关产品推荐

