[深度学习] 自然语言处理 --- 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
热门资源
Python 爬虫(二)...
所谓爬虫就是模拟客户端发送网络请求,获取网络响...
TensorFlow从1到2...
原文第四篇中,我们介绍了官方的入门案例MNIST,功...
TensorFlow从1到2...
“回归”这个词,既是Regression算法的名称,也代表...
机器学习中的熵、...
熵 (entropy) 这一词最初来源于热力学。1948年,克...
TensorFlow2.0(10...
前面的博客中我们说过,在加载数据和预处理数据时...
智能在线
400-630-6780
聆听.建议反馈
E-mail: support@tusaishared.com