TensorFlow 2.0 搭配Transformers:实战BERT模型

文章目录

1.前言

前面两篇文章其实已经详细介绍了bert在kaggle比赛tweet_sentiment_extraction的作用,但是该比赛是基于tensorflow2.0版本的,因此需要把代码进行转换。前面的两篇文章如下链接:

  1. 使用tensorflow2.0 版本跑 bert模型和roberta模型

在kaggle中使用notebook参加比赛,是基于tensorflow2.0版本的,虽然不太想换版本跑,但是为了能够用它上面的GPU

还是借鉴了kaggle论坛上面的代码。其中要特别感谢大佬:

  • @Abhishek Thakur
    ,其代码启发了我使用并行化加速训练模型,能够以更短的时间内训练5-fold模型。

要在tensorflow2.0上跑bert和roberta模型,需要安装
transformers
:

pip install transformers

2.1 加载transformers中的分词包

因为要构建bert模型的输入,因此加载词典,同时把输入句子转换成下面三个部分:

  • input_ids: 把每个token转换为对应的id
  • attention_mask: 记录哪些词语需要mask
  • input_type_ids: 区分两个句子,前一句子标记为0,后一句子标记为1

例如:

*** Example ***
tokens: happy b ##day !
input_ids: 101 3407 1038 10259 999 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
input_mask: 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
segment_ids: 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
selected_text: happy bday!

导入分词器工具:

# set some global variables
PATH = "../input/huggingfacetransformermodels/model_classes/roberta/roberta-large-tf2-model/"
MAX_SEQUENCE_LENGTH = 128
TOKENIZER = BertWordPieceTokenizer(f"../input/my-data/vocab.txt", lowercase=True, add_special_tokens=False)

其中
TOKENIZER
可以直接实现分词,转换id等操作:

enc = TOKENIZER.encode(tweet)
input_ids_orig, offsets = enc.ids, enc.offsets

2.2 自定义bert模型层

这里需要输出bert的全部12层,然后取最后两层作为输出。最后一层预测开始的位置start_logits,倒数第二层预测结束为止end_logits

class BertQAModel(TFBertPreTrainedModel):
    
    DROPOUT_RATE = 0.1
    NUM_HIDDEN_STATES = 2
    
    def __init__(self, config, *inputs, **kwargs):
        super().__init__(config, *inputs, **kwargs)
        
        self.bert = TFBertMainLayer(config, name="bert")
        self.concat = L.Concatenate()
        self.dropout = L.Dropout(self.DROPOUT_RATE)
        self.qa_outputs = L.Dense(
            config.num_labels, 
            kernel_initializer=TruncatedNormal(stddev=config.initializer_range),
            dtype='float32',
            name="qa_outputs")
        
    @tf.function
    def call(self, inputs, **kwargs):
        # outputs: Tuple[sequence, pooled, hidden_states]
        _, _, hidden_states = self.bert(inputs, **kwargs)
        
        hidden_states = self.concat([
            hidden_states[-i] for i in range(1, self.NUM_HIDDEN_STATES+1)
        ])
        
        hidden_states = self.dropout(hidden_states, training=kwargs.get("training", False))
        logits = self.qa_outputs(hidden_states)
        start_logits, end_logits = tf.split(logits, 2, axis=-1)
        start_logits = tf.squeeze(start_logits, axis=-1)
        end_logits = tf.squeeze(end_logits, axis=-1)
        
        return start_logits, end_logits

2.3 预加载模型

利用transformers,可以快速实现预加载模型,同时transformers这个库中已经集成了多种模型.

在加载模型之前,需要导入模型的基本设置:

config = RobertaConfig.from_json_file(os.path.join(PATH, "config.json"))
config.output_hidden_states = True
config.num_labels = 2

接下来加载模型:

model = RoBertQAModel.from_pretrained(PATH, config=config)

2.4 并行化处理(使用多线程)

本来训练一次模型需要1100s,如果训练两个模型,则需要1100*2s的时间。使用多线程后,在训练两个模型的时候,可以把时间缩短到

1100s左右。

通过使用joblib包,来实现多线程,从而压缩训练时间,它的使用方法也很简单,仅仅只需要几行代码就可以实现:

from joblib import Parallel, delayed
test_result = Parallel(n_jobs=num_folds, backend="threading")(delayed(run)(i) for i in range(num_folds))

  • run()函数是我们自己实现的函数,里面主要实现了模型的训练和预测过程
  • n_jobs:用来定义共有多少个线程可以实现。

实验结果可以看出,5-fold可以缩短1000s:

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Transformer发轫于NLP(自然语言处理),并跨界应用到CV(计算机视觉)领域。目前已成为深度学习的新范式,影响力和应用前景巨大。 本课程对Transformer的原理和TensorFlow 2代码进行精讲,来帮助大家掌握其详细原理和具体实现。 原理精讲部分包括:注意力机制和自注意力机制、Transformer的架构概述、Encoder的多头注意力(Multi-Head Attention)、Encoder的位置编码(Positional Encoding)、残差链接(Residual Connection)、层规范化(Layer Normalization)、FFN(Feed Forward Network)、Transformer的训练及性能、Transformer的机器翻译工作流程。  代码精讲部分使用Jupyter Notebook对TransformerTensorFlow 2实现代码进行逐行解读,包括:安装TensorFlowTransformer的数据集加载与预处理代码解读、Transformer的位置编码与多头注意力代码解读、TransformerTransformer类代码解读、Transformer的优化器与损失函数代码解读、Transformer的训练代码解读、Transformer的推理与权重保存代码解读。相关课程: 《Transformer原理与代码精讲(PyTorch)》https://edu.csdn.net/course/detail/36697《Transformer原理与代码精讲(TensorFlow)》https://edu.csdn.net/course/detail/36699《ViT(Vision Transformer)原理与代码精讲》https://edu.csdn.net/course/detail/36719《DETR原理与代码精讲》https://edu.csdn.net/course/detail/36768《Swin Transformer实战目标检测:训练自己的数据集》https://edu.csdn.net/course/detail/36585《Swin Transformer实战实例分割:训练自己的数据集》https://edu.csdn.net/course/detail/36586《Swin Transformer原理与代码精讲》 https://download.csdn.net/course/detail/37045
好的,我可以为您提供基于TensorFlow 2.0transformers模型的搭建方案。首先,您需要安装TensorFlow 2.0transformers库,您可以通过以下命令使用pip安装: ``` pip install tensorflow==2.0.0 pip install transformers ``` 接下来,您可以参考以下代码来搭建transformers模型: ``` import tensorflow as tf from transformers import TFDistilBertModel, DistilBertConfig # 配置模型参数 config = DistilBertConfig(output_hidden_states=True) # 加载预训练模型 model = TFDistilBertModel.from_pretrained('distilbert-base-uncased', config=config) # 输入数据 input_ids = tf.keras.Input(shape=(128,), dtype=tf.int32, name='input_ids') attention_mask = tf.keras.Input(shape=(128,), dtype=tf.int32, name='attention_mask') # 获取模型输出 outputs = model(input_ids, attention_mask=attention_mask) # 添加一个全连接层 x = tf.keras.layers.Dense(768, activation='relu')(outputs[0][:, 0, :]) # 添加一个分类层 outputs = tf.keras.layers.Dense(2, activation='softmax')(x) # 构建模型 model = tf.keras.Model(inputs=[input_ids, attention_mask], outputs=outputs) # 编译模型 model.compile(optimizer=tf.keras.optimizers.Adam(), loss='categorical_crossentropy', metrics=['accuracy']) ``` 这个例子使用了DistilBert模型,您可以通过更改`TFDistilBertModel`和`DistilBertConfig`来使用其他transformers模型。同时,您也可以根据您的任务需求更改全连接层和分类层的结构。 希望这个例子对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值