【深度学习pytorch-87】微调脚本

微调脚本(Fine-Tuning Script) 是用来对预训练的模型进行 任务特定的调整,以便使其在某个特定的任务(如文本分类、情感分析、命名实体识别等)上表现得更好。微调是迁移学习中的一部分,通常是在预训练模型的基础上进行少量的额外训练,以便模型能适应新的任务和数据。

Hugging Face Transformers 库提供了非常简洁和高效的微调脚本。你只需要准备好数据和模型,使用 Hugging Face 的 Trainer API 就可以方便地完成微调。

微调脚本的步骤

下面是一个简单的微调脚本的基本结构。我们将以 文本分类任务 为例,使用一个预训练的 BERT 模型来进行微调。


1. 安装必要的库

首先,安装必要的库:transformersdatasets(用于加载数据)以及 torch(用于训练模型)。

pip install transformers datasets torch

2. 导入库

导入你所需的库和模块。

import torch
from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset
from sklearn.model_selection import train_test_split
  • BertTokenizer:用于对文本进行分词。
  • BertForSequenceClassification:BERT 模型的变体,适用于文本分类任务。
  • Trainer:Hugging Face 提供的训练框架,简化了训练和评估过程。
  • TrainingArguments:指定训练过程中使用的参数(如学习率、批量大小等)。
  • load_dataset:用于加载数据集,Hugging Face 提供了多种标准数据集。

3. 加载数据集

你可以使用 datasets 库加载现成的数据集,或者自己加载数据集。这里我们使用 datasets 库加载一个常见的文本分类数据集 imdb

# 加载 IMDb 数据集
dataset = load_dataset('imdb')

# 分割训练集和验证集
train_dataset = dataset['train']
test_dataset = dataset['test']

4. 加载预训练模型和 Tokenizer

加载预训练的 BERT 模型以及相应的 Tokenizer。这里我们使用 bert-base-uncased 作为预训练模型。

model_name = "bert-base-uncased"

# 加载 BERT 模型和 Tokenizer
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)  # 二分类任务
  • num_labels=2:我们将任务定义为二分类任务(正面、负面),所以 num_labels=2

5. 数据预处理

对于文本分类任务,首先需要对文本数据进行分词和编码,以适配 BERT 模型。

# 定义文本预处理函数
def preprocess_function(examples):
    return tokenizer(examples['text'], padding='max_length', truncation=True)

# 应用预处理
train_dataset = train_dataset.map(preprocess_function, batched=True)
test_dataset = test_dataset.map(preprocess_function, batched=True)

# 设置格式以适应 PyTorch
train_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'label'])
test_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'label'])
  • padding='max_length':将所有句子填充到相同的最大长度。
  • truncation=True:如果文本超过最大长度,将其截断。
  • 使用 .map() 方法批量处理数据集。

6. 设置训练参数

使用 TrainingArguments 来定义训练过程的超参数,如学习率、批量大小、训练轮数等。

training_args = TrainingArguments(
    output_dir='./results',          # 输出路径
    num_train_epochs=3,              # 训练轮次
    per_device_train_batch_size=8,   # 每个设备的训练批次大小
    per_device_eval_batch_size=16,   # 每个设备的评估批次大小
    warmup_steps=500,                # 预热步数
    weight_decay=0.01,               # 权重衰减
    logging_dir='./logs',            # 日志目录
    logging_steps=10,
    evaluation_strategy="epoch",     # 每个 epoch 评估一次
    save_strategy="epoch"            # 每个 epoch 保存一次
)
  • num_train_epochs:指定训练轮数。
  • per_device_train_batch_sizeper_device_eval_batch_size:训练和评估时的批次大小。
  • evaluation_strategy="epoch":在每个训练轮次结束时进行评估。

7. 使用 Trainer 进行训练

在 Hugging Face 中,Trainer 是一个高层次的 API,用来简化训练和评估的过程。

trainer = Trainer(
    model=model,                         # 训练的模型
    args=training_args,                  # 训练参数
    train_dataset=train_dataset,         # 训练数据
    eval_dataset=test_dataset,           # 验证数据
)

# 开始训练
trainer.train()

8. 评估模型

训练完成后,你可以使用训练过程中的验证集进行模型评估:

# 评估模型
results = trainer.evaluate()

# 打印评估结果
print(results)

9. 保存模型

训练完成后,你可以保存微调后的模型,以便以后使用或进行推理。

# 保存微调后的模型
model.save_pretrained('./fine_tuned_model')
tokenizer.save_pretrained('./fine_tuned_model')
  • 这将保存微调后的模型和 Tokenizer,以便在未来的任务中加载。

完整示例代码

import torch
from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset

# 加载数据集
dataset = load_dataset('imdb')
train_dataset = dataset['train']
test_dataset = dataset['test']

# 加载预训练模型和Tokenizer
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)

# 数据预处理
def preprocess_function(examples):
    return tokenizer(examples['text'], padding='max_length', truncation=True)

train_dataset = train_dataset.map(preprocess_function, batched=True)
test_dataset = test_dataset.map(preprocess_function, batched=True)

train_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'label'])
test_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'label'])

# 训练参数
training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=8,
    per_device_eval_batch_size=16,
    warmup_steps=500,
    weight_decay=0.01,
    logging_dir='./logs',
    logging_steps=10,
    evaluation_strategy="epoch",
    save_strategy="epoch"
)

# Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=test_dataset
)

# 开始训练
trainer.train()

# 评估模型
results = trainer.evaluate()
print(results)

# 保存微调后的模型
model.save_pretrained('./fine_tuned_model')
tokenizer.save_pretrained('./fine_tuned_model')

总结

微调脚本 使得使用预训练模型来解决具体任务变得非常简单。在 Hugging Face Transformers 库中,TrainerTrainingArguments 提供了高效的接口,能够方便地进行模型的微调。微调的过程包括加载预训练模型、数据预处理、设置训练参数、进行训练和评估,最后保存训练好的模型。通过微调,你可以将一个大规模预训练的模型应用到特定的任务中,从而大幅度提高任务的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值