如何正确保存并加载带指定词汇表TextVectorization层的TensorFlow模型
问题原因
你遇到的报错核心原因是TextVectorization层初始化时传入的是词汇文件路径VOCAB_PATH,而非直接传入词汇列表。这种情况下,层内部仅会存储文件路径字符串,不会将词汇表内容序列化绑定到模型中,加载模型时会尝试从原路径读取词汇文件,一旦环境路径变化、文件缺失就会触发哈希表初始化失败的相关错误。另外你提供的模型代码中第二组LSTM层存在拼写错误:retrun_sequences应为return_sequences,需要先修正该问题再训练保存。
解决方案
方案一:将词汇表直接嵌入模型(推荐,无需额外携带词汇文件)
这个方案会把词汇表直接序列化到模型文件中,传输时仅需要传保存的模型文件夹即可开箱即用,操作步骤如下:
- 第一步:提前读取词汇文件内容为列表
with open(VOCAB_PATH, 'r', encoding='utf-8') as f: vocab_list = [line.strip() for line in f if line.strip()]
- 第二步:构建模型时向
TextVectorization传入词汇列表而非文件路径
model = keras.Sequential() model.add(keras.Input(shape=(), dtype=tf.string)) # 传入词汇列表,而非VOCAB_PATH model.add(layers.TextVectorization( vocabulary=vocab_list, output_sequence_length=SEQ_LENGTH )) # 后续层和原有逻辑一致,注意修正LSTM的拼写错误 model.add(layers.Embedding(VOCAB_SIZE, SEQ_LENGTH)) model.add(layers.LSTM(SEQ_LENGTH, return_sequences=True)) model.add(layers.LSTM(SEQ_LENGTH, return_sequences=True)) model.add(layers.Dropout(0.2)) model.add(layers.Dense(SEQ_LENGTH, activation="relu")) model.add(layers.Dense(SEQ_LENGTH, activation="relu")) model.add(layers.Flatten()) model.add(layers.Dense(NUM_CLASSES, activation="softmax"))
- 第三步:正常训练后保存模型即可
model.save(SAVE_PATH)
- 加载测试:任意环境下直接加载即可使用,无需额外准备词汇文件
loaded_model = keras.models.load_model(SAVE_PATH) # 直接传入字符串即可推理 loaded_model.predict(["测试输入文本"])
方案二:保留独立词汇文件的加载方案
如果你需要保留单独传输词汇文件的逻辑,可按以下步骤操作:
- 传输时将模型文件夹和词汇文件放在同一目录
- 加载模型时先手动初始化
TextVectorization层,再加载权重:
# 新环境中先读取传入的词汇文件 with open(TRANSFERRED_VOCAB_PATH, 'r', encoding='utf-8') as f: vocab_list = [line.strip() for line in f if line.strip()] # 先构建和训练时结构完全一致的模型 vectorize_layer = layers.TextVectorization( vocabulary=vocab_list, output_sequence_length=SEQ_LENGTH ) model = keras.Sequential() model.add(keras.Input(shape=(), dtype=tf.string)) model.add(vectorize_layer) # 补全剩余层结构,和训练时完全一致 ... # 加载权重 model.load_weights(SAVE_PATH)
内容的提问来源于stack exchange,提问作者mlinke-ai
相关产品推荐
相关产品推荐

