当前位置: 首页 > article >正文

transformers 操作篇

transformers 操作篇

如何利用 transformers 加载 Bert 模型?

import torch
from transformers import BertModel, BertTokenizer

# 这里我们调用bert-base模型,同时模型的词典经过小写处理
model_name = 'bert-base-uncased'

# 读取模型对应的tokenizer
tokenizer = BertTokenizer.from_pretrained(model_name) 

# 载入模型
model = BertModel.from_pretrained(model_name) 

# 输入文本
input_text = "Here is some text to encode" 

# 通过tokenizer把文本变成 token_id
input_ids = tokenizer.encode(input_text, add_special_tokens=True) 

# input_ids: [101, 2182, 2003, 2070, 3793, 2000, 4372, 16044, 102]
input_ids = torch.tensor([input_ids]) 

# 获得BERT模型最后一个隐层结果
with torch.no_grad():
    last_hidden_states = model(input_ids)[0] # Models outputs are now tuples

输出结果:

tensor([[[-0.0549, 0.1053, -0.1065, ..., -0.3550, 0.0686, 0.6506],
         [-0.5759, -0.3650, -0.1383,  ..., -0.6782,  0.2092, -0.1639],
         [-0.1641, -0.5597,  0.0150,  ..., -0.1603, -0.1346, 0.6216],
         ...,
         [ 0.2448,  0.1254,  0.1587,  ..., -0.2749, -0.1163, 0.8809],
         [ 0.0481,  0.4950, -0.2827,  ..., -0.6097, -0.1212, 0.2527],
         [ 0.9046, 0.2137, -0.5897, ..., 0.3040, -0.6172, -0.1950]]]) 
shape: (1, 9, 768)     

可以看到,包括import在内的不到十行代码,我们就实现了读取一个预训练过的BERT模型,来encode我们指定的一个文本,对文本的每一个token生成768维的向量。如果是二分类任务,我们接下来就可以把第一个token也就是[CLS]的768维向量,接一个linear层,预测出分类的logits,或者根据标签进行训练。

如何利用 transformers 输出 Bert 指定 hidden_state?

Bert 默认是十二层,但是有时候预训练时并不需要利用全部利用,而只需要预训练前面几层即可,此时该怎么做呢?

下载到bert-base-uncased的模型目录里面包含配置文件 config.json, 该文件中包含:

{
  "architectures": ["BertForMaskedLM"],
  "attention_probs_dropout_prob": 0.1,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "initializer_range": 0.02,
  "intermediate_size": 3072,
  "max_position_embeddings": 512,
  "num_attention_heads": 12,
  "num_hidden_layers": 12,
  "type_vocab_size": 2,
  "vocab_size": 30522
}

output_hidden_states,可以利用该参数来设置编码器内隐藏层层数。

BERT 获取最后一层或每一层网络的向量输出

  • last_hidden_state:shape是(batch_size, sequence_length, hidden_size),hidden_size=768, 它是模型最后一层输出的隐藏状态。
  • pooler_output:shape是(batch_size, hidden_size),这是序列的第一个token(classification token)的最后一层的隐藏状态,它是由线性层和Tanh激活函数进一步处理的,这个输出不是对输入的语义内容的一个很好的总结,对于整个输入序列的隐藏状态序列的平均化或池化通常更好。
  • hidden_states:这是输出的一个可选项,如果输出,需要指定config.output_hidden_states=True,它也是一个元组,它的第一个元素是embedding,其余元素是各层的输出,每个元素的形状是(batch_size, sequence_length, hidden_size)。
  • attentions:这也是输出的一个可选项,如果输出,需要指定config.output_attentions=True,它也是一个元组,它的元素是每一层的注意力权重,用于计算self-attention heads的加权平均值。

获取每一层网络的向量输出:

## 最后一层的所有 token向量
outputs.last_hidden_state

## cls向量
outputs.pooler_output

## hidden_states,包括13层,第一层即索引0是输入embedding向量,后面1-12索引是每层的输出向量
hidden_states = outputs.hidden_states

embedding_output = hidden_states[0]
attention_hidden_states = hidden_states[1:]


http://www.kler.cn/a/400669.html

相关文章:

  • python高级之简单爬虫实现
  • 若依权限控制
  • Linux守护Pythom脚本运行——Supervisor学习总结
  • 一体化运维监控管理平台:产品架构与功能解析
  • 《Spring 基础之 IoC 与 DI 入门指南》
  • SpringCloud篇(服务保护 - Sentinel)
  • OpenHarmony-2.DeviceInfo适配
  • Docker compose部署elasticsearch(单机版)
  • 问题定位学习
  • 01-如何引导AI来帮助我们完善项目
  • Docker-01
  • Linux_shell脚本if语句详细教程
  • QT中的字符器类型
  • 基于springboot的景区网页设计与实现
  • 生成式人工智能(AIGC)在软件开发设计模式课程教学中的应用
  • Vue练习案例(中)
  • VUE 实现公告无缝循环滚动
  • 供应链管理、一件代发系统功能及源码分享 PHP+Mysql
  • Briefly unavailable for scheduled maintenance. Check back in a minute.
  • LINUX sysfs的使用方法举例
  • Cesium 相机系统
  • 10、标签的 ref 属性
  • springboot上传下载文件
  • 十六.SpringCloudAlibaba极简入门-整合Grpc代替OpenFeign
  • 跨平台WPF框架Avalonia教程 十五
  • 使⽤MATLAB进⾏⽬标检测