训练HuggingFace疾病分类模型时遇'function'无pad属性报错
解决HuggingFace Trainer训练时的AttributeError: 'function' object has no attribute 'pad'错误
错误根源
你的代码存在三个核心问题:
tokenize_func定义完全错误,未实现分词逻辑,反而返回了tokenizer的无效键值;DataCollatorWithPadding需要接收分词器实例,但你传入了分词函数;- Trainer的
tokenizer参数要求传入分词器实例,你同样传入了函数,导致后续调用pad方法时触发属性错误。
修正后的关键代码步骤
- 修正分词函数并生成分词数据集
from datasets import Dataset ds = Dataset.from_pandas(df) from transformers import AutoModelForSequenceClassification, AutoTokenizer model_nm = 'microsoft/deberta-v3-small' tokenz = AutoTokenizer.from_pretrained(model_nm) # 注意:将'text'替换为你数据集中实际的文本列名 def tokenize_func(x): return tokenz(x['text'], truncation=True) # 批量分词生成处理后的数据集 tok_ds = ds.map(tokenize_func, batched=True)
- 修正数据收集器初始化
from transformers import DataCollatorWithPadding # 传入分词器实例tokenz,而非分词函数 data_collator = DataCollatorWithPadding(tokenizer=tokenz)
- 划分训练测试集(基于分词后的数据集)
dds = tok_ds.train_test_split(0.25, seed=42)
- 修正Trainer参数配置
id2label = {i:dx for i, dx in enumerate(list(df['Diagnosis'].unique()))} label2id = {dx:i for i, dx in enumerate(list(df['Diagnosis'].unique()))} from transformers import TrainingArguments,Trainer args = TrainingArguments( output_dir="outputs", learning_rate=2e-5, per_device_train_batch_size=16, per_device_eval_batch_size=32, num_train_epochs=epochs, weight_decay=0.01, evaluation_strategy="epoch", save_strategy="epoch", load_best_model_at_end=True, push_to_hub=False, report_to='none', ) model = AutoModelForSequenceClassification.from_pretrained( model_nm, num_labels=len(id2label), id2label=id2label, label2id=label2id ) trainer = Trainer( model=model, args=args, train_dataset=dds['train'], eval_dataset=dds['test'], tokenizer=tokenz, # 传入分词器实例而非函数 data_collator=data_collator, compute_metrics=compute_metrics, ) trainer.train()
额外注意事项
- 确认你的数据集
df中存在用于分类的文本列,需将代码中的'text'替换为实际列名; - 确保
tok_ds是经过ds.map(tokenize_func, batched=True)生成的分词后数据集,否则划分训练测试集时会报错。
内容的提问来源于stack exchange,提问作者Code Monkey
相关产品推荐
相关产品推荐

