将bert模型作为keras模块使用

1、为什么要用OSTA方法

        在NLP领域如果不使用SOTA方法,存在诸多缺点,效果难以保障:1、SOTA方法结果优,其模型是各种大牛使用数百张TPU,构造的庞大模型,各种参数得到了调优,其训练效果已经达到NLP领域的巅峰;2、泛化能力强,SOTA方法是在海量级数据集上训练产生的,所以适应范围广泛,其泛化能力很强;3、参数多,模型深度高,例如bert模型使用12层,12个多头注意力机制及768个隐藏单元,多达一亿个参数,其训练集数据多达34亿个单词。如此庞大的数据集及结构一般用户是难以承受其训练成本的,因此一般简单模型堆叠方法很难超越SOTA方法。在无法克服差距的情况下,拿来主义是个不错的选择。
        Transformers是HuggingFace设计的一个NLP预训练模型库,其库内包含了大量NLP的SOTA方法,如Bert、GPT、XLNet等。
        BertAsService是一个组件用户可以以客户端的方式访问
        本文将尝试使用bert模型对中文自然语言处理中的情感进行分析。

2、实现模型
2.1 各组件库的条件

(1)transformers的安装环境为python 3.6以上, PyTorch 1.0.0以上 (PyTorch 1.3.1+ for examples) 或者TensorFlow 2.0以上。
        对于不满足以上安装环境的用户需要创建虚拟环境以安装配置transformers。但是TensorFlow2.0对使用Tensorflow1.0的兼容性不好,不建议使用tensorflow作为后端;使用pytorch进行开发是个不错的选择,但这也意味着之前写的tensorflow代码需要重新写。
(2)BertAsService是基于服务器和客户端模式的方式进行的因此效率上存在一定的问题对环境的需求为: Python >= 3.5 同时 Tensorflow >= 1.10,但实现起来比较简单。
(3)keras-bert要求keras版本大于2.4.3意味着tensorflow作为后端的话,tensorflow的版本必须大于tensorflow2.0,也就是说在tensorflow1上的代码无法使用了。
排在最后的,也是重点推荐的就是,bert-utils
(4)bert-utils如果你不想升级tensorflow不想升级keras只想安安静静的做下词向量、句向量,而且需要有一定的效率支撑,那么bert-utils就是为你设计的了。
项目地址如下:
https://github.com/terrifyzhao/bert-utils

创建虚拟环境(基于anaconda,使用bert-utils)

conda create --name keras2.2.2 python=3.6

切换不同环境:conda activate 环境名字;
以及退出环境:conda deactivate;
删除虚拟环境:conda remove -n your_env_name(虚拟环境名称) --all

如果你觉得bert-utils不适合你好吧,你可以升级pytorch和tensorflow

        由于Transformers依赖于两个库,pytorch和TensorFlow2.0因此如果想要让Transformers所包含的库能够运行必须先安装pytorch和TensorFlow这两个包。
        安装pytorch并依赖于相应的cuda库,然后安装TensorFlow2.0。注意,一定要按照顺序安装,在安装pytorch时可以附带的下载cuda10的库,但是如果先安装Tensorflow则无法启动TensorFlow。
(1)可以直接通过pytorch的官网,根据需求定制cuda版本,安装Pytroch: conda install pytorch torchvision cudatoolkit=10.0.130 -c pytorch
也可以从这个网页上下载相应的版本torch1.4对应的是0.5的torchvision
https://download.pytorch.org/whl/torch_stable.html

(2)安装TensorFlow2.0
pip install tensorflow-gpu现在一般默认情况下,tensorflow2.0需要的cuda10.0.0以上,因此需要先安装了Pytorch或在安装tensorflow2.0时指定依赖关系。

使用bert-utils进行句向量生成

1、下载bert-utils对应的配置文件到项目根目录下;
2、下载bert-utils的代码到项目根目录下
3、导入bert-utils,
from extract_feature import BertVector
4、将要生成的句子使用列表方式存储,两条代码生成句向量
bc = BertVector()
encoded_comment_slice = bc.encode(plain_comment)

存在的问题:1、对资源的消耗较大,对30万个句子的要分成32个单元,每次训练6个单元才能训练完,真的很耗时;
2、效果不怎么好。

使用original-bert模型直接训练。

不要偷懒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要将原始文本进行分词,并将每个词转换为对应的词汇表中的编号(即将文本转换为一组数字)。然后,需要将这组数字添加一些特殊的标记,以便模型能够正确地处理输入。具体来说,需要在输入序列的开头添加一个特殊标记[CLS],在每个句子的结尾添加一个特殊标记[SEP],并在输入序列的末尾添加一些填充标记[PAD],以使输入序列的长度达到固定长度。 例如,假设原始文本为:"今天天气真好,出去玩的话记得擦防晒。",分词后为:"今天 天气 真好 , 出去 玩 的话 记得 擦 防晒 。",其中每个词汇对应的编号为[100, 200, 300, 400, 500, 600, 700, 800],则处理后的输入序列为:[CLS] 100 200 300 101 400 500 600 700 800 101 PAD PAD PAD ... 在实现上,可以使用tensorflow的tokenizer模块来进行分词,并使用tf.keras.preprocessing.sequence.pad_sequences函数来进行填充。具体代码如下: ```python import tensorflow as tf from transformers import BertTokenizer # 加载bert分词器 tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') # 原始文本 text = "今天天气真好,出去玩的话记得擦防晒。" # 分词 tokens = tokenizer.tokenize(text) # 将词汇转换为编号 input_ids = tokenizer.convert_tokens_to_ids(tokens) # 添加特殊标记和填充 max_length = 16 input_ids = tf.keras.preprocessing.sequence.pad_sequences([input_ids], maxlen=max_length, padding='post', truncating='post', value=0) # 添加[CLS]和[SEP]标记 input_ids = tf.concat([[101], input_ids[0], [102]], axis=0) print(input_ids) ``` 输出结果如下: ``` tf.Tensor( [ 101 791 1921 3240 4696 8024 1139 6796 4638 4638 3247 2458 950 3168 8024 102 0 0 0], shape=(19,), dtype=int32) ``` 其中,[101]表示[CLS]标记,[102]表示[SEP]标记,[0]表示[PAD]标记。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值