Huggingface简介及BERT代码浅析
Hugging face 是一家总部位于纽约的聊天机器人初创服务商,令它广为人知的是Hugging Face专注于NLP技术,拥有大型的开源社区,尤其是在github上开源的自然语言处理,预训练模型库 Transformers。最初叫 pytorch-pretrained-bert 。
安装方式
pip install transformers
当报错:‘ValueError: Connection error, and we cannot find the requested files in the cached path. Please try again or make sure your Internet connection is on’时,需要自己单独下载vocab文件和预训练模型放在对应的位置,下载链接如下:
- BERT-Large, Uncased (Whole Word Masking): 24-layer, 1024-hidden, 16-heads, 340M parameters
- BERT-Large, Cased (Whole Word Masking): 24-layer, 1024-hidden, 16-heads, 340M parameters
- BERT-Base, Uncased: 12-layer, 768-hidden, 12-heads, 110M parameters
- BERT-Large, Uncased: 24-layer, 1024-hidden, 16-heads, 340M parameters
- BERT-Base, Cased: 12-layer, 768-hidden, 12-heads , 110M parameters
- BERT-Large, Cased: 24-layer, 1024-hidden, 16-heads, 340M parameters
- BERT-Base, Multilingual Cased (New, recommended): 104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters
- BERT-Base, Multilingual Uncased (Orig, not recommended) (Not recommended, use
Multilingual Cased
instead): 102 languages, 12-layer, 768-hidden, 12-heads, 110M parameters - BERT-Base, Chinese: Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters
PRETRAINED_VOCAB_ARCHIVE_MAP = {'bert-base-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt",'bert-large-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased-vocab.txt",'bert-base-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-cased-vocab.txt",'bert-large-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-cased-vocab.txt",'bert-base-multilingual-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-uncased-vocab.txt",'bert-base-multilingual-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-cased-vocab.txt",'bert-base-chinese': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt", }
PRETRAINED_MODEL_ARCHIVE_MAP = {'bert-base-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased.tar.gz",'bert-large-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased.tar.gz",'bert-base-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-cased.tar.gz",'bert-large-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-cased.tar.gz",'bert-base-multilingual-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-uncased.tar.gz",'bert-base-multilingual-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-cased.tar.gz",'bert-base-chinese': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese.tar.gz", }
BertTokenizer.from_pretrained(‘D:\code\EMNLP-2019-master\data\bert-base-uncased-vocab.txt’)
BertModel.from_pretrained(‘D:\code\EMNLP-2019-master\data\bert-base-uncased’)
加载模型运行
加载下载的模型和词表
from pytorch_pretrained_bert import BertModel, BertTokenizer
import numpy as np
# 加载bert的分词器
tokenizer = BertTokenizer.from_pretrained('你存放的路径/bert-base-uncased-vocab.txt')
# 加载bert模型,这个路径文件夹下有bert_config.json配置文件和model.bin模型权重文件
bert = BertModel.from_pretrained('你存放的路径/bert-base-uncased/')
输入语句
s = "I'm not sure, this can work, lol -.-"
tokens = tokenizer.tokenize(s)
print("\\".join(tokens))
# "i\\'\\m\\not\\sure\\,\\this\\can\\work\\,\\lo\\##l\\-\\.\\-"
# 是否需要这样做?
# tokens = ["[CLS]"] + tokens + ["[SEP]"]
ids = torch.tensor([tokenizer.convert_tokens_to_ids(tokens)])
print(ids.shape)
# torch.Size([1, 15])
result = bert(ids, output_all_encoded_layers=True)
输出结果
result = ([encoder_0_output, encoder_1_output, ..., encoder_11_output], pool_output
)
- 因为我选择了参数
output_all_encoded_layers=True
,12层Transformer
的结果全返回了,存在第一个列表中,每个encoder_output
的大小为[batch_size, sequence_length, hidden_size]
; - pool_out大小为
[batch_size, hidden_size]
,pooler层的输出在论文中描述为:
which is the output of a classifier pretrained on top of the hidden state associated to the first character of the input (`CLS`) to train on the Next-Sentence task (see BERT's paper).
也就是说,取了最后一层Transformer的输出结果的第一个单词[cls]
的hidden states,其已经蕴含了整个input句子的信息了。 - 如果你用不上所有encoder层的输出,
output_all_encoded_layers
参数设置为Fasle
,那么result中的第一个元素就不是列表了,只是encoder_11_output
,大小为[batch_size, sequence_length, hidden_size]
的张量,可以看作bert
对于这句话的表示。
当前任务上finetune
有两种方案
- 单纯得将bert看作特征提取器,和sklearn的TfidfTransformer类似,先将你的文本分词,再丢给bert,把模型输出的结果作为你模型的input数据就ok了;
- 上面那种方法看起来很不fancy?那么可以把bert嵌入到我们的模型中:
class CustomModel(nn.Module):def __init__(self, bert_path, n_other_features, n_hidden):super().__init__()# 加载并冻结bert模型参数self.bert = BertModel.from_pretrained(bert_path)for param in self.bert.parameters():param.requires_grad = Falseself.output = nn.Sequential(nn.Dropout(0.2),nn.Linear(768 + n_other_features, n_hidden),nn.ReLU(),nn.Linear(n_hidden, 1))def forward(self, seqs, features):_, pooled = self.bert(seqs, output_all_encoded_layers=False)concat = torch.cat([pooled, features], dim=1)logits = self.output(concat)return logits
测试
s = "I'm not sure, this can work, lol -.-"
tokens = tokenizer.tokenize(s)
ids = torch.tensor([tokenizer.convert_tokens_to_ids(tokens)])
# print(ids)
# tensor([[1045, 1005, 1049, 2025, 2469, 1010, 2023, 2064, 2147, 1010, 8840, 2140,
# 1011, 1012, 1011]])
model = CustomModel('你的路径/bert-base-uncased/',10, 512)
outputs = model(ids, torch.rand(1, 10))
# print(outputs)
# tensor([[0.1127]], grad_fn=<AddmmBackward>)
Huggingface简介及BERT代码浅析相关推荐
- Huggingface简介及BERT tansformer 开源
链接 Huggingface简介及BERT代码浅析 import torch from transformers import BertModel, BertTokenizer # 这里我们调用ber ...
- BERT融合知识图谱之模型及代码浅析
出品:贪心科技AI 作者:高阶NLP6期学员,吕工匠 最近小编在做一个文本分类的项目,相比一般的文本分类任务,其挑战之处在于: 1)特征很少:训练数据的文本很短,3~5个字符 2)类别很多:>3 ...
- 第一章 huggingface简介
HuggingFace/transformers系列文章 第一章 huggingface简介 文章目录 HuggingFace/transformers系列文章 前言 一.Bert简介 二.Huggi ...
- spring初始化源码浅析之代码浅析
目录 1.refresh()简介 2.关键代码跟踪 2.1.obtainFreshBeanFactory()代码分析 2.2.invokeBeanFactoryPostProcessors(bean ...
- 来了!PostgreSQL 同步流复制原理和代码浅析,请签收
摘要: 数据库 ACID 中的持久化如何实现 数据库 ACID 里面的 D,持久化. 指的是对于用户来说提交的事务,数据是可靠的,即使数据库 crash了,在硬件完好的情况下,也能恢复回来.Postg ...
- 美狐美颜SDK动态贴纸代码浅析
如今,在美颜的刚需下,各大平台开始接入美颜SDK,接入美颜SDK是因为该平台希望能在竞争中脱颖而出并吸引更多用户,而现如今基本的美容和美容功能已无法满足用户的需求,还需要各种趣味功能,例如动态贴纸的帮 ...
- 巧用InTouch 实现多级菜单管理及其核心代码浅析
写在面前 原文内容:巧用InTouch 实现多级菜单管理及其核心代码浅析 前面我们分享了西家,罗家,和施家组态软件与SQL SERVER数据库的通讯: 罗克韦尔FactoryTalk View Stu ...
- 微信分享带缩略图,标题,简介的JS代码(亲测有效)
(function(){ var appId = '', imgUrl = 'http://huaweiapu.toprand.com/ascendG7/assets/i ...
- Huggingface及BERT代码介绍
最新文章
- 各种图论模型及其解答(转)
- IDEA界面太丑??尝试一下这几个插件!
- 区块链BaaS云服务(35)亦笔科技ODRChain使用场景
- Tomcat的下载安装以及在eclipse中的配置
- Idris趋近发布1.0版
- 【Tech】Mac上安装MAMP打开本地网页
- 9 pcb螺丝焊盘打很多小孔_PCB板设计的10个基本设计流程
- Spring源码系列:BeanDefinition载入(下)
- 分享超级表格用户在知乎上与我们的对话
- linux如何查看内存命令
- 使用飞桨一步步实现多语言OCR文字识别软件
- 将Linux 标准输出,错误输出重定向到文件
- 定制QWidget标题栏的示例
- 印度黑客号称世界第一,结果第二天被中国黑客干掉了
- android字体加横线
- 网络安全与网站安全及计算机安全:如何使用Kali Linux的Rarcrack获取RAR压缩文件加密密码?
- 如何在线压缩图片大小?图片上传太大怎么缩小?
- em算法 图像模糊检测_基于EM算法的眼底OCT图像反卷积去模糊技术
- 怎么通过iTools解决闪退,应用无法安装激活的办法
- php显示标题控制长度,wordpress控制文章标题长度的问题