关于transformers库验证时不进入compute_metrics方法的一些坑

生成式任务输入就是标签

transformers在进入compute_metrics前会有一个判断,源码如下:

# 版本 transformers==4.41.2
# 在trainer.py 的 3842 行
# Metrics!
if (
    self.compute_metrics is not None
    and all_preds is not None
    and all_labels is not None
    and not self.args.batch_eval_metrics
):
    if args.include_inputs_for_metrics:
        metrics = self.compute_metrics(
            EvalPrediction(predictions=all_preds, label_ids=all_labels, inputs=all_inputs)
        )
    else:
        metrics = self.compute_metrics(EvalPrediction(predictions=all_preds, label_ids=all_labels))
elif metrics is None:
    metrics = {}

生成式任务如果没有标签字段,即labels那么这里的all_labels is not None就会是false,从而无法进入compute_metrics方法。
此时可以在TrainingArguments中加入一个变量label_names把输入文本作为标签,如下:

training_args = TrainingArguments(
...
label_names=['input_ids'], # 这里假设我的文本输入叫 ‘input_ids’
...
)

这样就可以进入compute_metrics函数了。
此外,若需要将输入的变量传入compute_metrics,可以在TrainingArguments中设置include_inputs_for_metrics=True

### 使用Transformers在Windows上训练DeepSeek模型 #### 安装依赖项 为了确保能够在Windows环境中顺利运行并训练DeepSeek模型,建议先创建一个新的虚拟环境来管理项目所需的Python包。可以使用`conda`或`venv`工具创建此环境。 对于Conda用户来说,可以通过下面命令建立新的环境,并安装基础版本的PyTorch和Transformers: ```bash conda create -n deepseek_env python=3.9 conda activate deepseek_env pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117 pip install transformers datasets evaluate accelerate ``` 如果选择使用CUDA加速,则可省略`--extra-index-url`部分以获取CPU版PyTorch[^1]。 #### 配置开发环境 完成上述软件包的安装之后,还需要准备用于微调的数据集以及评估指标。Hugging Face提供了方便易用的`datasets`加载公开数据集;而通过`evaluate`能够轻松定义评价标准。此外,考虑到大型预训练语言模型可能占用大量内存资源,在多GPU设置下推荐采用`accelerate`简化分布式训练过程中的复杂度处理工作。 #### 训练脚本编写 接下来展示一段简单的Python代码片段作为启动模板,该例子假设读者已经准备好了一个适合于特定下游任务(比如分类、回归等)的小规模标注语料,并将其保存成CSV文件形式供后续读取解析之用。 ```python from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments import pandas as pd from sklearn.model_selection import train_test_split from datasets import DatasetDict, load_metric def prepare_dataset(file_path): df = pd.read_csv(file_path) texts = list(df['text']) labels = list(df['label']) train_texts, val_texts, train_labels, val_labels = train_test_split(texts, labels, test_size=.2) tokenizer = AutoTokenizer.from_pretrained('deepseek-model-name') def tokenize_function(examples): return tokenizer(examples["text"], padding="max_length", truncation=True) raw_datasets = DatasetDict({ 'train': {'text': train_texts, 'label': train_labels}, 'validation': {'text': val_texts, 'label': val_labels} }) tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) return tokenized_datasets if __name__ == "__main__": dataset = prepare_dataset('./data.csv') model = AutoModelForSequenceClassification.from_pretrained( "deepseek-model-name", num_labels=len(set(dataset['train']['label'])) ) training_args = TrainingArguments(output_dir="./results") trainer = Trainer( model=model, args=training_args, train_dataset=dataset["train"], eval_dataset=dataset["validation"] ) metric = load_metric("accuracy") def compute_metrics(eval_pred): logits, labels = eval_pred predictions = logits.argmax(axis=-1) return metric.compute(predictions=predictions, references=labels) trainer.train() ``` 这段程序实现了从本地磁盘加载自定义格式的数据到内存中,接着利用🤗Transformers提供的接口完成了文本编码转换操作,最后借助Trainer API执行实际意义上的参数更新迭代流程.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值