BERT 获取最后一层或每一层网络的向量输出
模型维度变化: 输入onehot-到-embedding 768维 ===》输入成转512维 经过self attention 再输出768维 ===》输入 768维 经过 FFN 输出768维
参考:https://github.com/google-research/bert/blob/master/modeling.py#L863
参考:https://zhuanlan.zhihu.com/p/422533717
https://blog.csdn.net/sunyueqinghit/article/details/105157609
transformer 最后一层输出的结果
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的加权平均值
1、这里用transformers包进行演示
transformers安装需要安装好tf和torch,tf这里选择2X
tensorflow 2.2.0
torch 1.9.0
transformers 4.10.2
***需要输出hidden_states和attentions,需要指定output_hidden_states=True, output_attentions=True
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("peterchou/simbert-chinese-base")
model = AutoModel.from_pretrained("peterchou/simbert-chinese-base",output_hidden_states=True, output_attentions=True)
outputs = model(**tokenizer("语言模型", return_tensors='pt'))
##最后一层的所有 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:]
可以推出:hidden_states的最后一层既是last_hidden_state
***完整结果,output[0]== last hidden state,output[1] == pooler output,output[2] ==hidden_states,output[3] ==attentions
(last_hidden_state, pooler_output, hidden_states[optional], attentions[optional])
2、bert4keras 获取最后一层
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer
import numpy as npconfig_path = '/Us***l/chinese_L-12_H-768_A-12/bert_config.json'
checkpoint_path = '/Us**/chinese_L-12_H-768_A-12/bert_model.ckpt'
dict_path = '/Us**/chinese_L-12_H-768_A-12/vocab.txt'tokenizer = Tokenizer(dict_path, do_lower_case=True) # 建立分词器
model = build_transformer_model(config_path, checkpoint_path) # 建立模型,加载权重# 编码测试
token_ids, segment_ids = tokenizer.encode('语言模型')print('\n ===== predicting =====\n')
print(model.predict([np.array([token_ids]), np.array([segment_ids])]))
第一个是cls句向量
也可以这样获取cls:
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer
import numpy as npconfig_path = '/Us***l/chinese_L-12_H-768_A-12/bert_config.json'
checkpoint_path = '/Us**/chinese_L-12_H-768_A-12/bert_model.ckpt'
dict_path = '/Us**/chinese_L-12_H-768_A-12/vocab.txt'tokenizer = Tokenizer(dict_path, do_lower_case=True) # 建立分词器
model = build_transformer_model(config_path, checkpoint_path) # 建立模型,加载权重from bert4keras.backend import keras
from keras.layers import Lambda, Dense
from keras import Modelcls_output = Lambda(lambda x: x[:, 0], name='CLS-token')(model.output) ##获取最后cls向量# all_token_output = Lambda(lambda x: x[:, 1:-1], name='ALL-token')(model.output) ##获取最后除cls和最后终止符的其他向量model1 = Model(inputs=model.input,outputs=cls_output
)
output1 = model1.outputtoken_ids, segment_ids = tokenizer.encode('语言模型')
res = model1.predict([np.array([token_ids]), np.array([segment_ids])])
res
这是最后层cls后的每个token结果
from bert4keras.backend import keras
from keras.layers import Lambda, Dense
from keras import Model
# keras.layers.Lambda(lambda x:x[:,0])(model.output)#cls_output = Lambda(lambda x: x[:, 0], name='CLS-token')(model.output) ##获取最后cls向量all_token_output = Lambda(lambda x: x[:, 1:-1], name='ALL-token')(model.output) ##获取最后除cls和最后终止符的其他向量model1 = Model(inputs=model.input,outputs=all_token_output
)
output1 = model1.outputtoken_ids, segment_ids = tokenizer.encode('语言模型')
res = model1.predict([np.array([token_ids]), np.array([segment_ids])])
res
a、(bert4keras 获取每一层案例)
参考:
https://github.com/bojone/bert4keras/issues/68
https://blog.csdn.net/weixin_43557139/article/details/116573558
https://www.jb51.net/article/189638.htm
**bert4keras包需要自己通过Keras Model接口取每一层,把全部100来层取出来,需要自己选择挑选
***报错:InvalidArgumentError: Input-Segment:0 is both fed and fetched.
解决:[layer.output for layer in model.layers][2:] 从2开始截取
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer
import numpy as npconfig_path = r'D:***chinese_L-12_H-768_A-12\bert_config.json'
checkpoint_path = r'D***chinese_L-12_H-768_A-12\bert_model.ckpt'
dict_path = r'D***chinese_L-12_H-768_A-12\vocab.txt'tokenizer = Tokenizer(dict_path, do_lower_case=True) # 建立分词器
model = build_transformer_model(config_path, checkpoint_path) # 建立模型,加载权重#取每一层网络向量from keras import Modeloutputs = [layer.output for layer in model.layers][2:]model1 = Model(inputs=model.input,outputs=outputs
)
token_ids, segment_ids = tokenizer.encode('语言模型')
res = model1.predict([np.array([token_ids]), np.array([segment_ids])])
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer
import numpy as npconfig_path = r'D:***chinese_L-12_H-768_A-12\bert_config.json'
checkpoint_path = r'D***chinese_L-12_H-768_A-12\bert_model.ckpt'
dict_path = r'D***chinese_L-12_H-768_A-12\vocab.txt'tokenizer = Tokenizer(dict_path, do_lower_case=True) # 建立分词器
model = build_transformer_model(config_path, checkpoint_path) # 建立模型,加载权重# 模型参数,取最后一层网络向量
last_layer = 'Transformer-%s-FeedForward-Norm' % (model.num_hidden_layers - 1)from keras import Modeloutput = model.model.get_layer(last_layer).outputmodel1 = Model(inputs=model.input,outputs=outputs
)
token_ids, segment_ids = tokenizer.encode('语言模型')
res = model1.predict([np.array([token_ids]), np.array([segment_ids])])
参考:https://github.com/bojone/BERT-whitening/blob/main/chn/utils.py
BERT 获取最后一层或每一层网络的向量输出相关推荐
- 企业网络推广时网站获取排名离不开企业网络推广文章内容的更新
搜索引擎在抓取网站排名时,网站内容价值性的体现瞬间放大,与此同时,网站内容更新频率也是不容小觑的.对于企业网站运营优化期间,不同类型的企业网站可以选择不同的内容更新频率,那么怎样针对企业网站制定合理的 ...
- Python学习笔记:用Python获取数据(本地数据与网络数据)
Python学习笔记:用Python获取数据(本地数据与网络数据) 一.用Python获取本地数据 读写文件(三种基本模式:r, w, a) 1.写文件 2.读文件
- Qt linux获取cpu使用率、内存、网络收发速度、磁盘读写速度、磁盘剩余空间等
Qt linux获取cpu使用率.内存.网络收发速度.磁盘读写速度.磁盘剩余空间等,实际上大部分都和qt无关的,用其他语言也可以获取. code: .h #ifndef RESOURCE_MINITO ...
- Paging3、Room使用,1、从本地Room数据库加载 2、直接网络获取数据加载 3、网络访问数据到Room数据库再加载 4、封装使用
目录 1.从本地Room数据库加载数据 viewmodel fragment中使用 页面 数据库相关 2.直接网络获取数据加载 3.网络访问数据到Room数据库再加载数据 自定义RemoteMedia ...
- Java使用siger开源包获取服务器硬件信息(CPU 内存 网络 io等)
Java使用siger开源包获取服务器硬件信息(CPU 内存 网络 io等) 通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 1.下载sigar.jar sigar官方主页 sig ...
- 什么是Netbios(网络基本输入/输出系统)?
Netbois(网络基本输入/输出系统)最初由IBM,Sytek作为API开发,使用户软件能使用局域 网的资源.自从诞生,Netbois成为许多其他网络应用程序的基础.严格意义上,Netbios是接入 ...
- NetBIOS网络基本输入/输出系统协议分析
简介 NetBIOS(Network Basic Input/Output System)即网络基本输入/输出系统协议,英文原义:NetBIOS Services Protocols.是由IBM公司开 ...
- vue 获取url地址的参数_Vue 网络请求框架 axios 使用教程
点击上方"代码集中营",设为星标 优秀文章,第一时间送达! 前期回顾 1. Vue 学习入门指南 2. Vue 入门环境搭建 3. Visual Studio Code 使用指南 ...
- linux系统wget、curl终端命令行获取公网ip地址及其他网络信息
前言 在linux开发环境中查看当前公网ip地址或者某个端口是否通,对于新手来说是个比较麻烦的事情,下面我这里介绍一下如何在终端查询当前公网ip以及其他网络信息. 安装wget.curl工具 wget ...
最新文章
- C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态
- PetShop之ASP.NET缓存
- js判断鼠标旋转度数以及顺逆方向详解
- JQueryEasyUI validatebox 扩展其自带验证方法
- set / ... 去重的方法
- 机器学习之乳腺癌问题(SVM)
- js判断ipad还是安卓_最近iPad做电子笔记很流行?综合分析你知道的所有笔记方式。...
- vSphere虚拟化使用第三方备份方案常见CBT故障实战处理
- python发音1001python发音-1001种玩法 | Python 学习指南资源
- SpringBoot中自定义错误页面
- android 坐标度分秒转换工具,android 经纬度度分秒与十进制之间的相互转换
- JRE和JDK的区别(笔记)
- 解决华为云服务器没有公网Ip无法上网问题
- java 修改word属性_Java修改/替换Word批注
- php 标准规范,PHP PSR标准规范
- 国外免费3D模型下载网站
- 明日之后维尔市服务器找不到,明日之后 最新服务器互通计划来袭,快来看看有你们的服务器吗?...
- 计算机三级数据库高级查询
- 鸿蒙天钟壁纸,时间数字罗盘屏保
- NOR FLASH和NAND FLASH各应用在什么产品上