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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:24:29