资源经验分享[深度学习] 自然语言处理 --- Bert 开发实战 (huggingface-transformers)

[深度学习] 自然语言处理 --- Bert 开发实战 (huggingface-transformers)

2020-01-08 | |  117 |   0

原标题:[深度学习] 自然语言处理 --- Bert 开发实战 (huggingface-transformers)

原文来自:CSDN      原文链接:https://blog.csdn.net/zwqjoy/article/details/103860329


本文主要介绍如果使用huggingface的transformers 2.0 进行NLP的模型训练

除了transformers,其它兼容tf2.0的bert项目还有:

我的博客里有介绍使用方法  [深度学习] 自然语言处理--- 基于Keras Bert使用(上)

  1. keras-bert(Star:1.4k) 支持tf2,但它只支持bert一种预训练模型

  2. bert4keras (Star:692)支持tf2,bert/roberta/albert的预训练权重进行finetune

  3. bert-for-tf2(Star:329)只给了tf2.0 pipeline示例

huggingface的transformers也发布了transformers2.0,开始支持tf.2.0的各个预训练模型,虽然没有对pytorch支持的那么全面但在我们的场景已经足够适用了。

 

一 加载google原始预训练Bert模型

1、先将原始google预训练的模型文件转换成pytorch格式

这个命令在安装transformers时会回到环境变量中。

python convert_bert_original_tf_checkpoint_to_pytorch.py -h

04.png

python convert_bert_original_tf_checkpoint_to_pytorch.py 
--tf_checkpoint_path Models/chinese_L-12_H-768_A-12/bert_model.ckpt.index 
--bert_config_file Models/chinese_L-12_H-768_A-12/bert_config.json  
--pytorch_dump_path  Models/chinese_L-12_H-768_A-12/pytorch_model.bin

output:

INFO:transformers.modeling_bert:Converting TensorFlow checkpoint from /home/work/Bert/Models/chinese_L-12_H-768_A-12/bert_model.ckpt.index
Save PyTorch model to Models/chinese_L-12_H-768_A-12/pytorch_model.bin

在开源代码库下面有好多有关转换的py文件

05.png

 

2、加载转换后的模型

import logging
logging.basicConfig(level=logging.INFO)
import tensorflow as tf
print("Tensorflow Version:", tf.__version__)
import torch
print("Pytorch Version:", torch.__version__)

04.png

from transformers import *
 
import os
pretrained_path = 'Models/chinese_L-12_H-768_A-12'
config_path = os.path.join(pretrained_path, 'bert_config.json')
vocab_path = os.path.join(pretrained_path, 'vocab.txt')
 
# 加载config
config = BertConfig.from_json_file(config_path)
# 加载torch原始模型
bert_model = BertModel.from_pretrained(pretrained_path, config=config)
 
# 加载tf原始模型
tfbert_model = TFBertModel.from_pretrained(pretrained_path,from_pt=True, config=config)

发现问题:如果加载为TF2的模型,参数会变少 (请使用 pytorch版本加载转换后的模型)

06.png

 

3、token编码inputs

tokenizer = BertTokenizer.from_pretrained(vocab_path)

07.png

 

08.png

 

 

二  使用Bert模型

构建模型

class BertNerModel(TFBertPreTrainedModel):
    def __init__(self, config, *inputs, **kwargs):
      super(BERT_NER, self).__init__(config, *inputs, **kwargs)
      self.bert_layer = TFBertMainLayer(config, name='bert')
      self.bert_layer.trainable = False
      self.concat_layer = tf.keras.layers.Concatenate(name='concat_bert')
    
    def call(self, inputs):
      outputs = self.bert_layer(inputs)
      #将后n层的结果相连
      tensor = self.concat_layer(list(outputs[2][-4:]))

这里给出的是简要的代码,可以自行根据任务在bert_layer之后加入RNN

自定义模型的写法可以参考官方源码里的TFBertForSequenceClassification, 继承TFBertPreTrainedModel

self.bert_layer(inputs)的返回值为tuple类型:

  1. 最后1层隐藏层的输出值,shape=(batch_size, max_length, hidden_dimention)

  2. [CLS] 对应的输出值,shape=(batch_size, hidden_dimention)

  3. 只有设置了config.output_hidden_states = True,才有该值,所有隐藏层的输出值,返回值类型是list 每个list里的值的shape(batch_size, max_length, hidden_dimention)`

模型的初始化

bert_ner_model = BertNerModel.from_pretrained("bert-base-chinese", output_hidden_states=True)

因为是模型继承的TFBertPreTrainedModel因此这里初始化使用的父类的方式。第一个参数是要加载预训练好的模型参数

注意事项

  1. 通过设置:self.bert.trainable = False, 模型可以更快收敛,减少训练时间

  2. 预测的时候,输出的数据一定要与max_length一致,否则效果完全不可用,猜测可能是我们只给了, 没有给input_mask,有看到transformers的源码,如果不给attention_mask,默认全是1的

  3. 通过设置 output_hidden_states=True, 可以得到隐藏层的结果

 

 

 

http://www.writinglite.com/post/shen-du-xue-xi/2019-12-12-tensorflow2.0-ji-yu-bertde-kai-fa-shi-zhan-huggingface-transformers

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:[深度学习] 自然语言处理 --- Albert介绍

下一篇:[深度学习] 自然语言处理--- 基于Keras Bert使用(上)

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...