3 命名实体识别调优化

能走到这里说明你对模型微调有了一个基本的认识。那么开始一段命名实体的任务过程,下面使用huggingface官网的数据。

1 准备模型

下面的模型自己选择一个吧,我的内存太第一个模型跑不了。

https://huggingface.co/ckiplab/bert-base-chinese-ner/tree/main

2 准备数据

https://huggingface.co/datasets/peoples_daily_ner

3 训练

评估指标

https://huggingface.co/spaces/evaluate-metric/seqeval

复制代码
import evaluate
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForTokenClassification, TrainingArguments, Trainer, DataCollatorForTokenClassification

# 如果可以联网,直接使用load_dataset进行加载
#ner_datasets = load_dataset("peoples_daily_ner", cache_dir="./data")
# 如果无法联网,则使用下面的方式加载数据集
from datasets import DatasetDict
ner_datasets = DatasetDict.load_from_disk("../data/ner_data/")
ner_datasets

tokenizer = AutoTokenizer.from_pretrained("/Users/user/studyFile/2024/nlp/bert_base_chinese_ner/")

# 借助word_ids 实现标签映射
def process_function(examples):
    tokenized_exmaples = tokenizer(examples["tokens"], max_length=128, truncation=True, is_split_into_words=True)
    labels = []
    for i, label in enumerate(examples["ner_tags"]):
        word_ids = tokenized_exmaples.word_ids(batch_index=i)
        label_ids = []
        for word_id in word_ids:
            if word_id is None:
                label_ids.append(-100)
            else:
                label_ids.append(label[word_id])
        labels.append(label_ids)
    tokenized_exmaples["labels"] = labels
    return tokenized_exmaples
tokenized_datasets = ner_datasets.map(process_function, batched=True)
tokenized_datasets

# 自己定义数据的类别个数
label_list = ner_datasets["train"].features["ner_tags"].feature.names


#model = AutoModelForTokenClassification.from_pretrained("../bert_base_chinese_ner/", num_labels=len(label_list))
import torch
model = AutoModelForTokenClassification.from_pretrained("../bert_base_chinese_ner/",num_labels=len(label_list),ignore_mismatched_sizes=True)
#model.num_labels = len(label_list)
#num_labels = len(label_list)
#model.classifier.out_proj.weight.data = torch.nn.functional.linear(model.classifier.weight, (model.classifier.weight.shape[0] / num_labels)) 
#model.classifier.out_proj.bias.data = model.classifier.bias
 

# 这里方便大家加载,替换成了本地的加载方式,无需额外下载
seqeval = evaluate.load("seqeval_metric.py")
seqeval

import numpy as np
# 自定义评估指标
def eval_metric(pred):
    predictions, labels = pred
    predictions = np.argmax(predictions, axis=-1)

    # 将id转换为原始的字符串类型的标签
    true_predictions = [
        [label_list[p] for p, l in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels) 
    ]

    true_labels = [
        [label_list[l] for p, l in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels) 
    ]

    result = seqeval.compute(predictions=true_predictions, references=true_labels, mode="strict", scheme="IOB2")

    return {
        "f1": result["overall_f1"]
    }
    
args = TrainingArguments(
    output_dir="models_for_ner",
    per_device_train_batch_size=64,
    per_device_eval_batch_size=128,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    metric_for_best_model="f1",
    load_best_model_at_end=True,
    logging_steps=50,
    num_train_epochs=1
)

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    compute_metrics=eval_metric,
    data_collator=DataCollatorForTokenClassification(tokenizer=tokenizer)
)
trainer.train()

训练的过程太慢了。

相关推荐
陈天伟教授18 小时前
人工智能应用-机器听觉:7. 统计合成法
人工智能·语音识别
笨蛋不要掉眼泪18 小时前
Spring Boot集成LangChain4j:与大模型对话的极速入门
java·人工智能·后端·spring·langchain
昨夜见军贴061618 小时前
IACheck AI审核技术赋能消费认证:为智能宠物喂食器TELEC报告构筑智能合规防线
人工智能·宠物
DisonTangor18 小时前
阿里开源语音识别模型——Qwen3-ASR
人工智能·开源·语音识别
万事ONES19 小时前
ONES 签约北京高级别自动驾驶示范区专设国有运营平台——北京车网
人工智能·机器学习·自动驾驶
qyr678919 小时前
深度解析:3D细胞培养透明化试剂供应链与主要制造商分布
大数据·人工智能·3d·市场分析·市场报告·3d细胞培养·细胞培养
软件开发技术深度爱好者19 小时前
浅谈人工智能(AI)对个人发展的影响
人工智能
一路向北he19 小时前
esp32 arduino环境的搭建
人工智能
SmartBrain19 小时前
Qwen3-VL 模型架构及原理详解
人工智能·语言模型·架构·aigc
renhongxia119 小时前
AI算法实战:逻辑回归在风控场景中的应用
人工智能·深度学习·算法·机器学习·信息可视化·语言模型·逻辑回归