Simple Transformers训练T5报KeyError:'target_text'原因及解决
问题说明
使用Simple Transformers框架训练T5模型时抛出KeyError: 'target_text',本质是框架的数据加载逻辑在传入的训练DataFrame中,未匹配到T5任务强制要求的target_text必填字段。
常见诱因
- 传入模型的训练/验证DataFrame缺少T5模块规定的三个必填列:
prefix(任务标识前缀)、input_text(模型接收的输入文本)、target_text(模型需要学习生成的目标文本)。从提供的代码看,仅手动新增了prefix列,未定义input_text和target_text列,这是触发本次报错的直接原因。 - 数据集列名存在格式问题:比如列名拼写错误、首尾带多余空格、大小写不匹配(如写成
Target_Text、target_text),框架做精确字段匹配时无法识别。 - 数据预处理、数据集切分环节误操作,意外删除了
target_text等必填列。
排查解决步骤
- 第一步:校验数据集列完整性。执行
print(train_df.columns.tolist())打印训练集所有列名,确认是否同时存在prefix、input_text、target_text三个字段,定位缺失的列。 - 第二步:完成原始数据到框架要求格式的列映射。将CSV文件中存储输入内容、目标输出内容的原始列,分别重命名/赋值给
input_text和target_text字段,示例代码如下:# 请将引号内的内容替换为CSV中实际对应的列名 df["input_text"] = df["你的原始输入文本列名"] df["target_text"] = df["你的原始目标生成文本列名"] - 第三步:清理列名隐藏格式问题。如果列名视觉上匹配但仍报错,可统一对列名做去空格、标准化处理,避免不可见字符导致匹配失败:
df.columns = [col.strip().lower() for col in df.columns] - 第四步:数据集切分后增加校验逻辑,避免切分过程丢列:
required_columns = ["prefix", "input_text", "target_text"] assert all(col in train_df.columns for col in required_columns), "训练集缺少必填字段" assert all(col in eval_df.columns for col in required_columns), "验证集缺少必填字段"
修正后的参考代码
!pip install SimpleTransformers import pandas as pd from sklearn.model_selection import train_test_split from simpletransformers.t5 import T5Model, T5Args # 读取原始数据集 df = pd.read_csv('/content/Vastu - Sheet1 (4).csv', sep=',') # 构造T5要求的标准数据格式,注意替换为自己数据集的实际列名 df["prefix"] = "ask_question" df["input_text"] = df["替换为存储输入内容的原始列名"] df["target_text"] = df["替换为存储目标输出内容的原始列名"] # 切分训练、验证集,仅保留必填列减少冗余 train_df, eval_df = train_test_split( df[["prefix", "input_text", "target_text"]], test_size=0.05 ) # 配置训练参数 model_args = T5Args() model_args.num_train_epochs = 3 # 初始化模型 model = T5Model( model_type='t5', model_name="t5-base", args=model_args, use_cuda=False ) # 启动训练,可传入验证集同步做训练中评估 model.train_model(train_df, eval_data=eval_df)
注意:列映射时不要搞反
input_text和target_text的内容,input_text是模型的输入依据,target_text是模型要学习生成的正确结果。
内容的提问来源于stack exchange,提问作者Neha Dubey
相关产品推荐
相关产品推荐

