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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 18:54:03