模型维度变化: 输入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 获取最后一层或每一层网络的向量输出相关推荐

  1. 企业网络推广时网站获取排名离不开企业网络推广文章内容的更新

    搜索引擎在抓取网站排名时,网站内容价值性的体现瞬间放大,与此同时,网站内容更新频率也是不容小觑的.对于企业网站运营优化期间,不同类型的企业网站可以选择不同的内容更新频率,那么怎样针对企业网站制定合理的 ...

  2. Python学习笔记:用Python获取数据(本地数据与网络数据)

    Python学习笔记:用Python获取数据(本地数据与网络数据) 一.用Python获取本地数据 读写文件(三种基本模式:r, w, a) 1.写文件 2.读文件

  3. Qt linux获取cpu使用率、内存、网络收发速度、磁盘读写速度、磁盘剩余空间等

    Qt linux获取cpu使用率.内存.网络收发速度.磁盘读写速度.磁盘剩余空间等,实际上大部分都和qt无关的,用其他语言也可以获取. code: .h #ifndef RESOURCE_MINITO ...

  4. Paging3、Room使用,1、从本地Room数据库加载 2、直接网络获取数据加载 3、网络访问数据到Room数据库再加载 4、封装使用

    目录 1.从本地Room数据库加载数据 viewmodel fragment中使用 页面 数据库相关 2.直接网络获取数据加载 3.网络访问数据到Room数据库再加载数据 自定义RemoteMedia ...

  5. Java使用siger开源包获取服务器硬件信息(CPU 内存 网络 io等)

    Java使用siger开源包获取服务器硬件信息(CPU 内存 网络 io等) 通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 1.下载sigar.jar sigar官方主页 sig ...

  6. 什么是Netbios(网络基本输入/输出系统)?

    Netbois(网络基本输入/输出系统)最初由IBM,Sytek作为API开发,使用户软件能使用局域 网的资源.自从诞生,Netbois成为许多其他网络应用程序的基础.严格意义上,Netbios是接入 ...

  7. NetBIOS网络基本输入/输出系统协议分析

    简介 NetBIOS(Network Basic Input/Output System)即网络基本输入/输出系统协议,英文原义:NetBIOS Services Protocols.是由IBM公司开 ...

  8. vue 获取url地址的参数_Vue 网络请求框架 axios 使用教程

    点击上方"代码集中营",设为星标 优秀文章,第一时间送达! 前期回顾 1. Vue 学习入门指南 2. Vue 入门环境搭建 3. Visual Studio Code 使用指南 ...

  9. linux系统wget、curl终端命令行获取公网ip地址及其他网络信息

    前言 在linux开发环境中查看当前公网ip地址或者某个端口是否通,对于新手来说是个比较麻烦的事情,下面我这里介绍一下如何在终端查询当前公网ip以及其他网络信息. 安装wget.curl工具 wget ...

最新文章

  1. C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态
  2. PetShop之ASP.NET缓存
  3. js判断鼠标旋转度数以及顺逆方向详解
  4. JQueryEasyUI validatebox 扩展其自带验证方法
  5. set / ... 去重的方法
  6. 机器学习之乳腺癌问题(SVM)
  7. js判断ipad还是安卓_最近iPad做电子笔记很流行?综合分析你知道的所有笔记方式。...
  8. vSphere虚拟化使用第三方备份方案常见CBT故障实战处理
  9. python发音1001python发音-1001种玩法 | Python 学习指南资源
  10. SpringBoot中自定义错误页面
  11. android 坐标度分秒转换工具,android 经纬度度分秒与十进制之间的相互转换
  12. JRE和JDK的区别(笔记)
  13. 解决华为云服务器没有公网Ip无法上网问题
  14. java 修改word属性_Java修改/替换Word批注
  15. php 标准规范,PHP PSR标准规范
  16. 国外免费3D模型下载网站
  17. 明日之后维尔市服务器找不到,明日之后 最新服务器互通计划来袭,快来看看有你们的服务器吗?...
  18. 计算机三级数据库高级查询
  19. 鸿蒙天钟壁纸,时间数字罗盘屏保
  20. NOR FLASH和NAND FLASH各应用在什么产品上

热门文章

  1. 变电站机器人的控制部分
  2. [Leetcode] 买卖股票合集(动态规划)
  3. Django学习笔记-1 在Anaconda下安装和创建Django项目
  4. Vue3 + 高德地图
  5. python数据可视化--pyecharts生成图表
  6. 波士顿房价线性回归预测
  7. FreeSWITCH 呼入系统的简要设计
  8. android北京工资待遇,【北京京东工资】android开发工程师待遇-看准网
  9. 嵌入式Linux设备驱动程序开发指南9(平台设备驱动)——读书笔记
  10. CSS奇思妙想 -- 使用 background 创造各种美妙的背景