调用pickle加载的Keras分词器texts_to_sequences时报'dict'无该属性错误
报错核心原因
你遇到的'dict' object has no attribute 'texts_to_sequences'报错,本质是pickle加载得到的loaded_tokenizer并不是Keras内置Tokenizer类的实例,只是一个普通的Python字典,自然无法调用Tokenizer类封装的texts_to_sequences方法。
出现这种情况基本是当初保存分词器的时候操作失误:错误地把Tokenizer实例的内部属性字典单独序列化存了下来,没有保存整个Tokenizer类对象。
落地解决步骤
- 第一步:先验证对象类型确认问题
在加载pickle的代码后面加一行类型打印,快速定位问题:
如果输出结果是with open('pic2.pickle', 'rb') as handle: loaded_tokenizer = pickle.load(handle) print(type(loaded_tokenizer))<class 'dict'>,就完全匹配当前报错的成因。 - 第二步:将字典还原为合法的Tokenizer实例
先导入Keras的Tokenizer类,再手动把字典的属性挂载到新的Tokenizer实例上,补全必要的初始化参数,避免后续方法调用报错:from tensorflow.keras.preprocessing.text import Tokenizer # 创建空的Tokenizer实例 real_tokenizer = Tokenizer() # 把之前存的字典属性赋值给新实例 real_tokenizer.__dict__ = loaded_tokenizer # 补全缺失的文档计数属性 real_tokenizer.word_docs = real_tokenizer.word_docs if hasattr(real_tokenizer, "word_docs") else {} - 第三步:替换原有代码中的分词器变量即可正常跑通
额外提醒:新版TensorFlow/Keras已经废弃了predict_classes方法,直接用predict加索引提取的方式替代就行:txt = "السلام عليكم" # 用还原好的分词器做文本转序列 seq = real_tokenizer.texts_to_sequences([txt]) padded = pad_sequences(seq, maxlen=max_len) # 替代原predict_classes的等效写法 pred = model.predict(padded) import numpy as np pred_class = np.argmax(pred, axis=-1) print(pred_class)
后续保存分词器的正确姿势
之前出现存成字典的问题,基本是当初保存时错写成了pickle.dump(tokenizer.__dict__, handle),正确的保存逻辑是直接把整个Tokenizer实例序列化,后续加载就不会出现类型不匹配的问题:
# 正确的分词器保存代码 with open('pic2.pickle', 'wb') as handle: pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)
内容的提问来源于stack exchange,提问作者nouha
相关产品推荐
相关产品推荐

