Transformers 安装与基本使用

文章目录

  • Github
  • 文档
  • 推荐文章
  • 简介
  • 安装
  • 官方示例
  • 中文情感分析模型
    • 分词器 Tokenizer
    • 填充 Padding
    • 截断 Truncation
  • google-t5/t5-small
  • 使用脚本进行训练
    • Pytorch
  • 机器翻译
    • 数据集下载
    • 数据集格式转换

Github

  • https://github.com/huggingface/transformers

文档

  • https://huggingface.co/docs/transformers/index
  • https://github.com/huggingface/transformers/blob/main/i18n/README_zh-hans.md

推荐文章

  • http://jalammar.github.io/illustrated-transformer/

简介

Transformers是一种基于注意力机制(Attention Mechanism)的神经网络模型,广泛应用于自然语言处理(Natural Language Processing)任务中,如机器翻译、文本生成和文本分类等。

传统的序列模型(如循环神经网络)在处理长距离依赖时可能遇到困难,而Transformers通过引入注意力机制来解决这个问题。注意力机制使得模型能够在序列中对不同位置的信息进行加权关注,从而捕捉到全局的上下文信息。

在Transformers中,输入序列首先被分别编码为查询(Query)、键(Key)和值(Value)向量。通过计算查询与键的相似度,得到注意力分数,再将注意力分数与值相乘并加权求和,即可得到最终的上下文表示。这种自注意力机制允许模型在编码器和解码器中自由交换信息,从而更好地处理长距离依赖关系。

Transformer模型的核心组件是多层的自注意力机制和前馈神经网络。它的架构被广泛应用于许多重要的NLP任务,其中最著名的是BERT(Bidirectional Encoder Representations from Transformers),它在多项NLP任务上取得了突破性的性能。

除了NLP领域,Transformers模型也被应用于计算机视觉和其他领域,用于处理序列建模和生成任务。它已经成为深度学习中非常重要和有影响力的模型架构之一。

安装

pip install transformers
# PyTorch(推荐)
pip install 'transformers[torch]'
# TensorFlow 2.0
pip install 'transformers[tf-cpu]'
  • M1 / ARM 用户在安装 TensorFLow 2.0 之前,需要安装以下内容
brew install cmake
brew install pkg-config
  • 验证是否安装成功
python -c "from transformers import pipeline; print(pipeline('sentiment-analysis')('we love you'))"

在这里插入图片描述

注意: 以上验证操作需要“连网”,否则因无法下载文件而出现报错。

官方示例

from transformers import pipeline

# 使用情绪分析流水线
classifier = pipeline('sentiment-analysis')
classifier('We are very happy to introduce pipeline to the transformers repository.')
  • 输出结果
[{'label': 'POSITIVE', 'score': 0.9996980428695679}]

在这里插入图片描述

中文情感分析模型

  • https://huggingface.co/IDEA-CCNL/Erlangshen-Roberta-110M-Sentiment

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

中文的RoBERTa-wwm-ext-base在数个情感分析任务微调后的版本

git clone https://huggingface.co/IDEA-CCNL/Erlangshen-Roberta-110M-Sentiment
from transformers import BertForSequenceClassification, BertTokenizer
import torch

# 加载预训练模型和分词器
tokenizer = BertTokenizer.from_pretrained('Erlangshen-Roberta-110M-Sentiment')
model = BertForSequenceClassification.from_pretrained('Erlangshen-Roberta-110M-Sentiment')

# 待分类的文本
text = '今天心情不好'

# 对文本进行编码并转换为张量,然后输入模型中
input_ids = torch.tensor([tokenizer.encode(text)])
output = model(input_ids)

# 对输出的logits进行softmax处理,得到分类概率
probabilities = torch.nn.functional.softmax(output.logits, dim=-1)

# 打印输出分类概率
print(probabilities)
  • 输出
tensor([[0.9551, 0.0449]], grad_fn=<SoftmaxBackward0>)
from transformers import pipeline

# 使用pipeline函数加载预训练的情感分析模型,并进行情感分析
classifier = pipeline("sentiment-analysis", model="Erlangshen-Roberta-110M-Sentiment")

# 对输入文本进行情感分析
result = classifier("今天心情很好")

# 打印输出结果
print(result)
  • 输出
[{'label': 'Positive', 'score': 0.9374911785125732}]
from transformers import AutoModelForSequenceClassification, AutoTokenizer, pipeline

# 加载预训练模型和分词器
model_path = "Erlangshen-Roberta-110M-Sentiment"
model = AutoModelForSequenceClassification.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)

# 创建情感分析的pipeline
classifier = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)

# 对文本进行情感分析
result = classifier("今天心情很好")
print(result)
  • 输出
[{'label': 'Positive', 'score': 0.9374911785125732}]

分词器 Tokenizer

from transformers import AutoTokenizer

# 加载预训练模型的分词器
tokenizer = AutoTokenizer.from_pretrained("Erlangshen-Roberta-110M-Sentiment")

# 对文本进行编码
encoded_input = tokenizer("今天心情很好")
print(encoded_input)

# 解码已编码的输入,还原原始文本
decoded_input = tokenizer.decode(encoded_input["input_ids"])
print(decoded_input)
  • 输出
{'input_ids': [101, 791, 1921, 2552, 2658, 2523, 1962, 102],
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0],
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1]}
[CLS] 今 天 心 情 很 好 [SEP]

填充 Padding

模型的输入需要具有统一的形状(shape)。

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("Erlangshen-Roberta-110M-Sentiment")

batch_sentences = ["今天天气真好", "今天天气真好,适合出游"]
encoded_inputs = tokenizer(batch_sentences, padding=True)
print(encoded_inputs)
  • 输出
{'input_ids': [
[101, 791, 1921, 1921, 3698, 4696, 1962, 102, 0, 0, 0, 0, 0], 
[101, 791, 1921, 1921, 3698, 4696, 1962, 8024, 6844, 1394, 1139, 3952, 102]], 
'token_type_ids': [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
], 
'attention_mask': [
[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]}

截断 Truncation

句子模型无法处理,可以将句子进行截断。

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("Erlangshen-Roberta-110M-Sentiment")

batch_sentences = ["今天天气真好", "今天天气真好,适合出游"]
# return_tensors pt(PyTorch模型) tf(TensorFlow模型)
encoded_inputs = tokenizer(batch_sentences, padding=True, truncation=True, return_tensors="pt")
print(encoded_inputs)
  • 输出
{'input_ids': tensor([
   [ 101,  791, 1921, 1921, 3698, 4696, 1962,  102,    0,    0,   0,    0,    0],
   [ 101,  791, 1921, 1921, 3698, 4696, 1962, 8024, 6844, 1394, 1139, 3952, 102]
  ]), 
 'token_type_ids': tensor([
   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  ]), 
  'attention_mask': tensor([
   [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
   [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
  ])
}

google-t5/t5-small

  • https://huggingface.co/google-t5/t5-small

在这里插入图片描述

Google的T5(Text-To-Text Transfer Transformer)是由Google Research开发的一种多功能的基于Transformer的模型。T5-small是T5模型的一个较小的变体,专为涉及自然语言理解和生成任务而设计。

  1. Transformer架构:与其它模型类似,T5-small采用了Transformer架构,该架构在各种自然语言处理(NLP)任务中表现出色。

  2. 多功能性:T5-small的设计理念是将所有的NLP任务都看作文本到文本的转换问题,使得模型可以通过简单地调整输入和输出来适应不同的任务。

  3. 预训练和微调:T5-small通常通过大规模的无监督预训练来学习通用的语言表示,然后通过有监督的微调来适应特定任务,如问答、摘要生成等。

  4. 应用广泛:由于其灵活性和性能,在各种NLP应用中都有广泛的应用,包括机器翻译、文本生成、情感分析等。

  • 下载 google-t5/t5-small 模型
# 模型大小 4.49G
git clone https://huggingface.co/google-t5/t5-small
  • 安装依赖库
pip install 'transformers[torch]'
pip install sentencepiece
  • 文本生成示例
from transformers import T5Tokenizer, T5ForConditionalGeneration

# Step 1: 加载预训练的T5 tokenizer和模型
tokenizer = T5Tokenizer.from_pretrained("t5-small")
model = T5ForConditionalGeneration.from_pretrained("t5-small")

while True:
    # Step 2: 接收用户输入
    input_text = input("请输入要生成摘要的文本 (输入 'exit' 结束): ")
    
    if input_text.lower() == 'exit':
        print("程序结束。")
        break
    
    # 使用tokenizer对输入文本进行编码
    input_ids = tokenizer(input_text, return_tensors="pt").input_ids

    # Step 3: 进行生成
    # 使用model.generate来生成文本
    output = model.generate(input_ids, max_length=50, num_beams=4, early_stopping=True)

    # Step 4: 解码输出
    output_text = tokenizer.decode(output[0], skip_special_tokens=True)

    # 打印输入和输出结果
    print("输入:", input_text)
    print("输出:", output_text)
    print("=" * 50)  # 分隔符,用来区分不同输入的输出结果

在这里插入图片描述

使用脚本进行训练

  • https://huggingface.co/docs/transformers/run_scripts

  • 从源代码安装 Transformers

git clone https://github.com/huggingface/transformers
cd transformers
pip install .
  • 将当前的 Transformers 克隆切换到特定版本
# 本地分支
git branch
# 远程分支
git branch -a
# 切换分支 v4.41.2,因为当前安装的版本是 v4.41.2
git checkout tags/v4.41.2
  • 安装依赖库
# 安装用于处理人类语言数据的工具集库
pip install nltk
# 安装用于计算ROUGE评估指标库
pip install rouge_score

Pytorch

示例脚本从 🤗 Datasets库下载并预处理数据集。然后,该脚本使用Trainer在支持摘要的架构上微调数据集。以下示例展示了如何在CNN/DailyMail数据集上微调T5-small。由于训练方式的原因,T5 模型需要额外的参数。此提示让 T5 知道这是一项摘要任务。

cd transformers/examples/pytorch/summarization
pip install -r requirements.txt
python run_summarization.py \
    --model_name_or_path google-t5/t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

注意: 家用机上训练非常耗时,建议租用GPU服务器进行测试。

  • 数据缓存目录
# Linux/macOS
cd ~/.cache/huggingface
# Windows
C:\Users\{your_username}\.cache\huggingface
  • datasets
2.6G	cnn_dailymail
798M	downloads

机器翻译

数据集下载

  • https://huggingface.co/datasets/wmt/wmt16

在这里插入图片描述

数据集格式转换

pip install pandas
import pandas as pd
import jsonlines

# 输入和输出文件路径
input_parquet_file = './input_file.parquet'
output_jsonl_file = './output_file.jsonl'

# 加载 Parquet 文件
df = pd.read_parquet(input_parquet_file)

# 将数据写入 JSONLines 文件
with jsonlines.open(output_jsonl_file, 'w') as writer:
    for index, row in df.iterrows():
        json_record = {
            "source_text": row['source_column'],  # 替换成实际的源语言列名
            "target_text": row['target_column']   # 替换成实际的目标语言列名
        }
        writer.write(json_record)
  • train.jsonl
{ "cs": "Následný postup na základě usnesení Parlamentu: viz zápis", "en": "Action taken on Parliament's resolutions: see Minutes" }
  • validation.jsonl
{ "en": "UN Chief Says There Is No Military Solution in Syria", "ro": "Șeful ONU declară că nu există soluții militare în Siria" }
cd examples/pytorch/translation
pip install -r requirements.txt
python run_translation.py \
    --model_name_or_path google-t5/t5-small \
    --do_train \
    --do_eval \
    --source_lang en \
    --target_lang ro \
    --source_prefix "translate English to Romanian: " \
    --dataset_name wmt16 \
    --dataset_config_name ro-en \
    --train_file ./train.jsonl \
    --validation_file ./validation.jsonl \
    --output_dir /tmp/tst-translation \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

注意: 家用机上训练非常耗时,建议租用GPU服务器进行测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/752152.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

边缘计算VNC智能盒子如何助力HMI设备实现二次开发?

HMI&#xff08;Human-Machine Interface&#xff09;又称人机界面&#xff0c;是用户与机器之间交互和通信的媒介。今天带你了解智能盒子如何助力HMI设备实现二次开发&#xff1f; HMI设备被广泛应用在工业自动化中&#xff0c;具有显示设备信息&#xff0c;实时监测&#xf…

【Linux杂货铺】Linux学习之路:期末总结篇1

第一章 什么是Linux? Linux 是 UNIX 操作系统的一个克隆&#xff1b;它由林纳斯 本纳第克特 托瓦兹从零开始编写&#xff0c;并在网络上众多松散的黑客团队的帮助下得以发展和完善&#xff1b;它遵从可移植操作系统接口&#xff08;POSIX&#xff09;标准和单一 UNIX 规范…

短信群发策略优化:如何有效降低退订率?

在短信群发营销中&#xff0c;退订率的上升常常影响营销效果。为了降低退订率&#xff0c;提高客户黏性&#xff0c;以下是一些实用的策略建议&#xff1a; 1.合理控制发送频率 过多的短信发送会给客户带来骚扰感&#xff0c;导致退订。因此&#xff0c;应合理控制短信的发送频…

排序算法(C语言版)

前言 排序作为生产环境中常见的需求之一&#xff0c;对整个产品有举足轻重的影响&#xff0c;可以说使用一个合适的排序算法是业务逻辑中比较重要的一部分。今天我们就来介绍常见的排序算法以及实现 排序 所谓排序无非就是按照特定的规则对一组数据就行顺序化。 常见的排序有…

智能语音热水器:置入NRK3301离线语音识别ic 迈向智能家居新时代

一、热水器语音识别芯片开发背景 在科技的今天&#xff0c;人们对于生活品质的追求已不仅仅满足于基本的物质需求&#xff0c;更渴望通过智能技术让生活变得更加便捷、舒适。热水器作为家庭生活中不可或缺的一部分&#xff0c;其智能化转型势在必行。 在传统热水器使用中&#…

论文导读 | 事件因果关系抽取和识别

导读 目前&#xff0c;对事件因果关系的研究主要分为两类任务&#xff1a;事件因果关系识别&#xff08;Event Causality Identification&#xff0c;ECI&#xff09;和事件因果关系抽取&#xff08;Event Causality Extraction&#xff09;。事件因果关系识别旨在检测文本中两…

v5 实现动态时移播放

背景 有用户提出需要从当前时间前一段时间开始播放&#xff0c;比如 10s 前开始播放&#xff0c;或者 1 分钟前开始播放等。 在 v4 中有一个时光回溯功能&#xff0c;可以在配置中指定缓存时间&#xff0c;然后播放时可以指定 submode: 2来播放。 但是弊端是无法动态指定时间…

MySQL实训

项目名称与项目简介 股票交易系统是一个综合性的金融服务平台&#xff0c;它提供了股票买卖、交易查询、用户管理、股票信息管理以及资金账户管理等功能。系统旨在为用户提供一个安全、高效、便捷的股票交易环境&#xff0c;让用户能够实时掌握市场动态&#xff0c;做出合理的…

使用模板方法设计模式封装 socket 套接字并实现Tcp服务器和客户端 简单工厂模式设计

文章目录 使用模板方法设计模式封装套接字使用封装后的套接字实现Tcp服务器和客户端实现Tcp服务器实现Tcp客户端 工厂模式 使用模板方法设计模式封装套接字 可以使用模块方法设计模式来设计套接字 socket 的封装 模板方法&#xff08;Template Method&#xff09;设计模式是一…

CORE Mobility Errorr的调试

在运行CORE tutorial 3中的mobility示例时&#xff0c;出现如下错误&#xff1a; 当看到这个问题的时候&#xff0c;并没有仔细去分析日志和现象&#xff0c;在core-daemon的进程打印界面只看了一下最后的出错堆栈&#xff1a; 2024-06-27 10:43:48,614 - ERROR - _server:_ca…

微信小程序毕业设计-线上教育商城系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

无敌“水刊”,沾稿就收!5本机械工程方向SCI,100%录用,不退稿~评职/毕业首选~

在众多理工科专业中&#xff0c;计算机科学与人工智能、电子电气工程、机械工程、医学、土木工程、生物科学、化学工程以及数学与统计学等八个专业最吃香。 对于这些专业领域的毕业生和寻求职业晋升的在职人士而言&#xff0c;如何在学术界和工业界展现自己的研究成果和实力&am…

Type-C接口快充取电的优势及LDR6328的应用探讨

在当今这个快节奏的社会&#xff0c;电子设备已经成为我们生活中不可或缺的一部分。随着科技的不断发展&#xff0c;对于电子设备充电速度和效率的要求也越来越高。Type-C接口快充取电技术应运而生&#xff0c;以其独特的优势&#xff0c;成为了市场中的一股新势力。而LDR6328作…

家电品牌如何利用3D数字化技术,突破转型瓶颈?

家电行业正经历着从增量市场向存量市场的转变&#xff0c;用户的消费观念也日趋成熟&#xff0c;更加注重产品的体验和服务质量。无论是线上购物平台还是线下实体门店&#xff0c;提供个性化和增强体验感的产品与服务已成为家电市场未来发展的核心驱动力。 51建模网依托“3D数字…

手机如何录屏?小白也能秒变高手

随着智能手机的普及&#xff0c;手机录屏已经成为一种越来越普遍的需求。无论是录制游戏过程、分享操作教程&#xff0c;还是保留重要信息&#xff0c;手机录屏都发挥着重要作用。可是很多人不知道手机如何录屏&#xff0c;本文将介绍三种手机录屏方法&#xff0c;帮助大家轻松…

Java获取class对象3种方式,不同点解析。

Java获取class对象3种方式&#xff0c;不同点解析。 前言 Java获取class对象3种方式&#xff0c;不同点解析&#xff0c;他们是有区别的 创建目标类Apple进行演示&#xff01;&#xff01;&#xff01; OK&#xff01;结束&#xff01;我们就可以看出区别。

PH计仪器校准内容,以及相关注意事项内容

ph计大家一定不陌生&#xff0c;在日常生活中和实验场所&#xff0c;经常会有看到这种计量器具&#xff0c;作为测定ph值的常用仪器&#xff0c;其运用领域可谓十分广泛&#xff0c;不过因为其结构的特殊性&#xff0c;加上传感器的原理问题&#xff0c;其自身的计量校准也需要…

使用函数open()的例子

代码&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> int main(void) {int fd-1;char filename[]"test.txt";fdopen(filename,O_RDWR);if(-1fd){printf("Open file %s failure!,fd…

六西格玛项目实战:数据驱动,手机PCM率直线下降

在当前智能手机市场日益竞争激烈的背景下&#xff0c;消费者对手机质量的要求达到了前所未有的高度。PCM&#xff08;可能指生产过程中的某种不良率或缺陷率&#xff09;作为影响手机质量的关键因素&#xff0c;直接关联到消费者满意度和品牌形象。为了应对这一挑战&#xff0c…

事务的概念-事务的概念、事务的定义(BEGIN TRANSACTION、COMMIT、ROLLBACK)

数据库系统中的事务&#xff0c;是保证系统在发生故障后或存在并发操作的情况下&#xff0c;数据库中的数据与企业业务结果相一致 一、事务的概念 在许多数据库应用系统中&#xff0c;数据库用来存储现实世界中一些企业的状态信息或其管理的数据 1、概念一 &#xff08;1&a…