You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 23:49:50