参考链接:

  1. https://blog.csdn.net/sarracode/article/details/109060358#1.chinese_L-12_H-768_A-12
  2. https://towardsdatascience.com/how-to-use-bert-from-the-hugging-face-transformer-library-d373a22b0209

    1. 安装

    可以运行的环境:
环境 版本
Python 3.9.7
PyTorch 1.11.0
TensorFlow 2.9.1
Transformers 4.20.1
NumPy 1.23.1

BERT官网下载中文Base预训练集,Link:https://github.com/google-research/bert
image.png
解压后修改将bert_config.json复制粘贴重命名为config.json(可能涉及到Pytorch版本的后续调用,目前原因未知)
image.png
BERT for tensorflow 通过.py脚本转换成BERT for pytorch;convert_bert_tf_checkpoint_to_pytorch.py

  1. python convert_bert_tf_checkpoint_to_pytorch.py --tf_checkpoint_path=d:/chinese_L-12_H-768_A-12/bert_model.ckpt --bert_config_file=d:/chinese_L-12_H-768_A-12/config.json --pytorch_dump_path=d:/chinese_L-12_H-768_A-12/pytorch_model.bin

2. 使用

  1. import torch,warnings
  2. from torch.utils.data import DataLoader, ConcatDataset
  3. from torch.nn.utils.rnn import pad_sequence
  4. from transformers import BertTokenizer,BertModel
  5. warnings.filterwarnings("ignore")
  6. tokenizer = BertTokenizer.from_pretrained('d:/chinese_L-12_H-768_A-12')
  7. model = BertModel.from_pretrained('d:/chinese_L-12_H-768_A-12',output_hidden_states = True)
  8. #output_hidden_states=True,显示Bert训练中的所有层,共计12层。
  1. # BERT训练前,需要分词并标注(tokenizer+IDs),每个词的ID不同。此外需要添加[CLS]和[SEP]。
  2. text_befort="可可热牛奶"
  3. input_ids=tokenizer.encode(text_befort, return_tensors = "pt",
  4. pad_to_max_length=True,
  5. max_length = 7) # 设置的batch_size为7
  6. print(input_ids)
  7. # 返回pytorch的tensor,101和102分别为首尾的ID;
  8. # max_length : batch_size;
  9. # pad_to_max_length=True :添加padding的ID,即为0;
  10. # 与上面同样的效果
  11. # torch.tensor(tokenizer.encode(text_befort),pad_to_max_length=True,max_length = 64).unsqueeze(0)
  1. # 建模
  2. outputs=model(input_ids)
  3. # last_hidden_state : 最后层;
  4. # hidden_states : 所有embedding层;
  5. # pooler_output : 池化后向量。
  6. # 池化向量,with size of (batch_size,768)
  7. outputs.pooler_output

为了与BERT-server保持输出一致,BERT-server中有两个参数需要被认知:
-pooling_layer,默认是[-2],取的是倒数第二层的embedding并池化。
-pooling_strategy,默认是REDUCE_MEAN的pooler

  1. hidden_states=outputs.hidden_states
  2. second_to_last_layer = hidden_states[-2]
  3. # 只有一个句子,因此脱掉外面的维度,并调用REDUCE_MEAN的pooler
  4. token_vecs = second_to_last_layer[0]
  5. sentence_embedding = torch.mean(token_vecs, dim=0)