使用Huggingface预训练Pegasus处理Inshorts数据集出现NoneType报错如何解决
报错原因
- 变量名覆盖:最常见的原因是你之前的代码里误将
tokenizer或者model变量赋值为None,比如写过tokenizer = None这类代码,导致你调用tokenizer()、model.generate()的时候,实际操作的是None对象而非预加载的分词器、模型实例。 - 代码缩进错误:你给出的for循环代码没有正确缩进,循环体仅执行空逻辑,循环外的
updated_text可能取到空值,或者你在循环外执行分词/生成逻辑时,updated_text未被正确赋值为字符串类型。 - 模型/分词器加载失败:如果加载预训练权重时网络中断、文件损坏,会导致
model或tokenizer实际为None,调用对应方法时就会抛出该错误。
解决方案
- 先排查变量类型:分别执行
print(type(tokenizer))和print(type(model)),如果输出为NoneType,重新执行分词器、模型的加载代码,后续不要复用tokenizer、model作为其他变量的名称。 - 修正代码缩进与逻辑:将文本处理、分词、生成、解码逻辑全部放到for循环内部,同时加空值判断避免处理无数据的样本,参考修正后的代码:
import pandas as pd from transformers import PegasusForConditionalGeneration, PegasusTokenizer # 加载模型与分词器 tokenizer = PegasusTokenizer.from_pretrained("google/pegasus-xsum") model = PegasusForConditionalGeneration.from_pretrained("google/pegasus-xsum") # 加载数据集 import io df = pd.read_excel(io.BytesIO(uploaded['inshorts.xlsx'])) # 循环生成摘要 for a in range(0,3): text = df.iloc[a,1] # 跳过空样本 if pd.isna(text): print(f"第{a}条样本为空,跳过") continue updated_text = f' """ {text} """ ' # 分词 tokens = tokenizer(updated_text, truncation=True, padding="longest", return_tensors="pt") # 生成摘要 summary = model.generate(**tokens) # 解码输出,skip_special_tokens会自动去掉特殊标记 res = tokenizer.decode(summary[0], skip_special_tokens=True) print(f"原始文本:{updated_text}") print(f"生成摘要:{res}\n")
- 排查加载问题:如果重新加载模型/分词器仍报错,检查网络连接是否能正常访问Huggingface Hub,也可以提前将预训练权重下载到本地,用本地路径替代
google/pegasus-xsum加载。
内容的提问来源于stack exchange,提问作者Vishnu Reddy
相关产品推荐
相关产品推荐

