transformers 4.52.6版本中evaluation_strategy参数报错及Jigsaw多标签分类适配问题求助
transformers 4.52.6版本中evaluation_strategy参数报错及Jigsaw多标签分类适配问题求助
我来帮你一步步解决这两个问题——evaluation_strategy参数报错和多标签分类的适配问题:
一、解决evaluation_strategy参数报错
在Transformers 4.52.6版本中,evaluation_strategy是TrainingArguments的有效参数,但有时候可能因为环境依赖冲突,导致实际加载的版本和你预期的不一致。你可以先确认当前环境的Transformers版本:
import transformers print(transformers.__version__)
如果版本确实是4.52.6,大概率是环境缓存问题;你也可以直接使用该参数的官方别名eval_strategy(两者在该版本中完全等效),规避潜在的参数名兼容问题。
二、修复多标签分类的适配细节
你的代码思路已经正确,但有几个小细节可以优化,让多标签分类逻辑更严谨:
1. 完善标签预处理逻辑
你导入了MultiLabelBinarizer但未使用,虽然数据集标签已经是0/1格式,但用它统一处理标签格式能避免潜在的维度问题;同时调整标签转tensor的方式,确保和模型的多标签输出兼容:
# 初始化多标签二值化工具,对齐标签列 mlb = MultiLabelBinarizer(classes=LABEL_COLUMNS) mlb.fit([LABEL_COLUMNS]) def preprocess(example): encoding = tokenizer( example["comment_text"], truncation=True, padding="max_length", max_length=128 ) # 提取标签并转为模型可识别的多标签格式 labels = [example[col] for col in LABEL_COLUMNS] encoding["labels"] = torch.tensor(labels, dtype=torch.float) return encoding
2. 优化模型加载与配置
原模型是二分类任务,我们改为6分类多标签,ignore_mismatched_sizes=True的设置是正确的;同时确保problem_type="multi_label_classification",让模型自动使用合适的损失函数(BinaryCrossEntropyWithLogitsLoss)。
3. 调整指标计算函数
原函数逻辑没问题,但可以明确区分模型输出的logits,让代码可读性更强:
def compute_metrics(pred): # 模型输出的是logits,先转成概率 preds = torch.sigmoid(torch.tensor(pred.predictions)).numpy() # 阈值化得到0/1的分类结果 preds = (preds > 0.5).astype(int) labels = pred.label_ids # 计算多标签任务的宏F1和准确率 f1 = f1_score(labels, preds, average="macro") acc = accuracy_score(labels, preds) return {"f1": f1, "accuracy": acc}
三、完整修正后的代码
from datasets import load_dataset from transformers import * import torch import numpy as np from sklearn.metrics import f1_score, accuracy_score from sklearn.preprocessing import MultiLabelBinarizer # 先确认当前Transformers版本 import transformers print("当前Transformers版本:", transformers.__version__) # Load dataset (adjust path if needed) dataset = load_dataset('csv', data_files={ "train": "data/train_split.csv", "validation": "data/validation_split.csv" }) # Define label columns used in Jigsaw multi-label setup LABEL_COLUMNS = ["toxic", "severe_toxic", "obscene", "threat", "insult", "identity_hate"] # Tokenizer and model setup MODEL_NAME = "cardiffnlp/twitter-roberta-base-offensive" tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) # 配置模型为多标签分类 config = AutoConfig.from_pretrained( MODEL_NAME, num_labels=len(LABEL_COLUMNS), problem_type="multi_label_classification" ) model = AutoModelForSequenceClassification.from_pretrained( MODEL_NAME, config=config, ignore_mismatched_sizes=True ) # 初始化多标签二值化工具 mlb = MultiLabelBinarizer(classes=LABEL_COLUMNS) mlb.fit([LABEL_COLUMNS]) # Preprocessing function def preprocess(example): encoding = tokenizer( example["comment_text"], truncation=True, padding="max_length", max_length=128 ) labels = [example[col] for col in LABEL_COLUMNS] encoding["labels"] = torch.tensor(labels, dtype=torch.float) return encoding # Apply preprocessing encoded_dataset = dataset.map(preprocess) # Training configuration training_args = TrainingArguments( output_dir="./results", save_strategy="epoch", eval_strategy="epoch", # 使用别名规避参数名兼容问题 learning_rate=2e-5, per_device_train_batch_size=16, per_device_eval_batch_size=16, num_train_epochs=3, weight_decay=0.01, logging_dir='./logs', logging_steps=10, load_best_model_at_end=True, metric_for_best_model="f1" ) # Metric function def compute_metrics(pred): preds = torch.sigmoid(torch.tensor(pred.predictions)).numpy() preds = (preds > 0.5).astype(int) labels = pred.label_ids f1 = f1_score(labels, preds, average="macro") acc = accuracy_score(labels, preds) return {"f1": f1, "accuracy": acc} # Trainer trainer = Trainer( model=model, args=training_args, train_dataset=encoded_dataset["train"], eval_dataset=encoded_dataset["validation"], tokenizer=tokenizer, compute_metrics=compute_metrics ) # Train the model trainer.train()
额外提示
如果确认版本是4.52.6但eval_strategy仍报错,建议重新安装指定版本的Transformers:
pip install --upgrade transformers==4.52.6
内容来源于stack exchange
相关产品推荐
相关产品推荐

