[深度学习] 自然语言处理 --- Bert 开发实战 (huggingface-transformers)
原标题:[深度学习] 自然语言处理 --- Bert 开发实战 (huggingface-transformers)
原文来自:CSDN 原文链接:https://blog.csdn.net/zwqjoy/article/details/103860329
本文主要介绍如果使用huggingface的transformers 2.0 进行NLP的模型训练
除了transformers,其它兼容tf2.0的bert项目还有:
我的博客里有介绍使用方法 [深度学习] 自然语言处理--- 基于Keras Bert使用(上)
keras-bert(Star:1.4k) 支持tf2,但它只支持bert一种预训练模型
bert4keras (Star:692)支持tf2,bert/roberta/albert的预训练权重进行finetune
bert-for-tf2(Star:329)只给了tf2.0 pipeline示例
huggingface的transformers也发布了transformers2.0,开始支持tf.2.0的各个预训练模型,虽然没有对pytorch支持的那么全面但在我们的场景已经足够适用了。
这个命令在安装transformers时会回到环境变量中。
python convert_bert_original_tf_checkpoint_to_pytorch.py -h

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文件

import logging
logging.basicConfig(level=logging.INFO)
import tensorflow as tf
print("Tensorflow Version:", tf.__version__)
import torch
print("Pytorch Version:", torch.__version__)![]()
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版本加载转换后的模型)

tokenizer = BertTokenizer.from_pretrained(vocab_path)


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层隐藏层的输出值,shape=(batch_size, max_length, hidden_dimention)
[CLS] 对应的输出值,shape=(batch_size, hidden_dimention)
只有设置了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因此这里初始化使用的父类的方式。第一个参数是要加载预训练好的模型参数
通过设置:self.bert.trainable = False, 模型可以更快收敛,减少训练时间
预测的时候,输出的数据一定要与max_length一致,否则效果完全不可用,猜测可能是我们只给了, 没有给input_mask,有看到transformers的源码,如果不给attention_mask,默认全是1的
通过设置 output_hidden_states=True, 可以得到隐藏层的结果
免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。
合作及投稿邮箱:E-mail:editor@tusaishared.com
热门资源
TensorFlow从1到2...
原文第四篇中,我们介绍了官方的入门案例MNIST,功...
Python 爬虫(二)...
所谓爬虫就是模拟客户端发送网络请求,获取网络响...
TensorFlow从1到2...
“回归”这个词,既是Regression算法的名称,也代表...
TensorFlow2.0(9...
TensorBoard是TensorFlow中的又一神器级工具,想用...
剑指Offer(三十一...
这个系列是我在牛客网上刷《剑指Offer》的刷题笔记...
智能在线
400-630-6780
聆听.建议反馈
E-mail: support@tusaishared.com