在鹅厂实习阶段,follow苏神(科学空间)的博客,启发了idea,成功改进了线上的一款模型。想法产出和实验进展很大一部分得益于苏神设计的bert4keras,清晰轻量、基于keras,可以很简洁的实现bert,同时附上了很多易读的example,对nlp新手及其友好!本文推荐几篇基于bert4keras的项目,均来自苏神,对新手入门bert比较合适~
- tokenizer:分词器,主要方法:encode,decode。
- build_transformer_model:建立bert模型,建议看源码,可以加载多种权重和模型结构(如unilm)。
import numpy as np
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer
from bert4keras.snippets import to_array
config_path = '/root/kg/bert/chinese_L-12_H-768_A-12/bert_config.json'
checkpoint_path = '/root/kg/bert/chinese_L-12_H-768_A-12/bert_model.ckpt'
dict_path = '/root/kg/bert/chinese_L-12_H-768_A-12/vocab.txt'
tokenizer = Tokenizer(dict_path, do_lower_case=True)
model = build_transformer_model(
config_path=config_path, checkpoint_path=checkpoint_path, with_mlm=True
)
token_ids, segment_ids = tokenizer.encode(u'科学技术是第一生产力')
token_ids[3] = token_ids[4] = tokenizer._token_mask_id
token_ids, segment_ids = to_array([token_ids], [segment_ids])
probas = model.predict([token_ids, segment_ids])[0]
print(tokenizer.decode(probas[3:5].argmax(axis=1)))
- 句子1和句子2拼接在一起输入bert。
- bert模型的pooler输出经dropout和mlp投影到2维空间,做分类问题。
- 最终整个模型是一个标准的keras model。
class data_generator(DataGenerator):
"""数据生成器
"""
def __iter__(self, random=False):
batch_token_ids, batch_segment_ids, batch_labels = [], [], []
for is_end, (text1, text2, label) in self.sample(random):
token_ids, segment_ids = tokenizer.encode(
text1, text2, maxlen=maxlen
)
batch_token_ids.append(token_ids)
batch_segment_ids.append(segment_ids)
batch_labels.append([label])
if len(batch_token_ids) == self.batch_size or is_end:
batch_token_ids = sequence_padding(batch_token_ids)
batch_segment_ids = sequence_padding(batch_segment_ids)
batch_labels = sequence_padding(batch_labels)
yield [batch_token_ids, batch_segment_ids], batch_labels
batch_token_ids, batch_segment_ids, batch_labels = [], [], []
bert = build_transformer_model(
config_path=config_path,
checkpoint_path=checkpoint_path,
with_pool=True,
return_keras_model=False,
)
output = Dropout(rate=0.1)(bert.model.output)
output = Dense(
units=2, activation='softmax', kernel_initializer=bert.initializer
)(output)
model = keras.models.Model(bert.model.input, output)
model = build_transformer_model(
config_path,
checkpoint_path,
application='unilm',
keep_tokens=keep_tokens,
)
NLG任务的loss是交叉熵,示例中的实现很美观:
- CrossEntropy类继承Loss类,重写compute_loss。
- 将参与计算loss的变量过一遍CrossEntropy,这个过程中loss会被计算,具体阅读Loss类源码。
- 最终整个模型是一个标准的keras model。
class CrossEntropy(Loss):
"""交叉熵作为loss,并mask掉输入部分
"""
def compute_loss(self, inputs, mask=None):
y_true, y_mask, y_pred = inputs
y_true = y_true[:, 1:]
y_mask = y_mask[:, 1:]
y_pred = y_pred[:, :-1]
loss = K.sparse_categorical_crossentropy(y_true, y_pred)
loss = K.sum(loss * y_mask) / K.sum(y_mask)
return loss
model = build_transformer_model(
config_path,
checkpoint_path,
application='unilm',
keep_tokens=keep_tokens,
)
output = CrossEntropy(2)(model.inputs + model.outputs)
model = Model(model.inputs, output)
model.compile(optimizer=Adam(1e-5))
model.summary()
预测阶段自回归解码,继承AutoRegressiveDecoder类可以很容易实现beam_search。
项目地址:SimBert
融合了unilm和对比学习,data generator和loss类的设计很巧妙,值得仔细阅读,建议看不懂的地方打开jupyter对着一行一行print来理解。
bert4keras项目的优点:
- build_transformer_model一句代码构建bert模型,一个参数即可切换为unilm结构。
- 继承Loss类,重写compute_loss方法,很容易计算loss。
- 深度基于keras,训练、保存和keras一致。
- 丰富的example!苏神的前沿算法研究也会附上bert4keras实现。
Original: https://blog.csdn.net/weixin_44597588/article/details/123910248
Author: 一只用R的浣熊
Title: 简洁优美的深度学习包-bert4keras
相关文章

短视频平台上亿用户都听过的声音|盘点三款超级好用的配音工具(内附教程哦~)
"这个女人叫小美""这个男人叫小帅" 是不是很神奇,明明只是文字,耳朵却仿佛听到了声音,脑海里甚至浮现出了画面!现在很多网上爆火的影视解说,都在用这一套文案话术,并且都配上了或声音厚实有磁性;或青春阳...

python+OpenCv笔记(十一):中值滤波
中值滤波: 原理: 中值滤波是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值。 应用: 中值滤波对椒盐噪声来说尤其有用,因为它不依赖于邻域内那些与典型值差别很大的值...

BILSTM-CRF代码讲解
BILSTM-CRF代码 代码来源于命名实体识别(NER):BiLSTM-CRF原理介绍+Pytorch_Tutorial代码解析 第一部分:导包 1.torch.nn包中主要包含了用来搭建各个层的模...

ImportError: cannot import name ‘get_config‘ from ‘tensorflow.python.eager.context‘
在使用下面这个项目时,出现报错 报错完整信息: Traceback (most recent call last): File "train.py", line 5, in 搜了下网上的解决方法 都没...

【Paper】StyTr2: Image Style Transfer with Transformers
CVPR 2022|快手联合中科院自动化所提出基于Transformer的图像风格化方法 论文链接:https://arxiv.org/abs/2105.14576 代码地址:https://gith...

读取h5文件中模型的权重值
在keras和tensorflow2中,模型或者模型的权重以h5文件保存。怎么单独读取保存模型或者模型中的权重值呢?这是这篇文章中讨论的问题。 首先简单介绍一下h5文件: h5文件即HDF5文件(Hi...

Bert模型(Google官方)问题汇总
首先声明:本人是一个刚接触NLP和Python的小白,本文也只是为了记录自己在学习Bert模型上面遇到的一些问题,有说的不对的地方,请大家指正,我都会虚心接受。 本人由于是小白,所以是跟着视频学习跑的...

SharePoint每日小贴士Web部件
SharePoint每日小贴士Web部件 项目描写叙述 此Web部件从指定SP自己定义列表或一个选定的 RSS源选择一个随机项目。并显示一张图片、标题和一个Tip。 适用于WSS 3.0,MOSS 2...

2021年电赛F题智能送药小车(国二)开源分享
文章目录 题目任务 前言(闲话) 一、团队分工介绍 二、题目分析、破题 * 1.要点分析 2.系统方案 三、电控部分 * 1、主控拓展电路 2、步进电机驱动信号整合板 PCB设计分析 四、视觉部分 *...

基于Tensorflow框架的人脸匹配总结附代码(持续更新)
基于Tensorflow框架的人脸匹配总结附代码(持续更新) 基于Tensorflow框架的人脸检测总结附代码(持续更新) 基于Tensorflow框架的人脸对齐、人脸关键点检测总结附代码(持续更新)...

使用TensorFlow编程实现一元逻辑回归
内容回顾 逻辑回归是在线性模型的基础上,再增加一个Sigmoid函数来实现的。 输入样本特征,经过线性组合之后,得到的是一个连续值,经过Sigmoid函数,把它转化为一个0-1之间的概率,再通过设置一...

基于python实现TF-IDF算法
标签:2021.09.27工作内容 参考资料:TF-IDF算法介绍及实现 声明:本文中大量内容转载至参考资料,仅归纳整理和加入部分个人观点心得,侵删 概念 定义 TF-IDF(term frequen...

从一个例子中体会React的基本面
【起初的准备工作】 npm init npm install --save react react-dom npm install --save-dev html-webpack-plugin web...

机器学习-数据科学库-day3
机器学习-数据科学库-day3 * - @[TOC](机器学习-数据科学库-day3) * numpy学习 * - 什么是numpy - numpy创建数组(矩阵) - + numpy中常见的更多数据...

Deep3DFaceReconstruction踩坑实录
在跑3d人脸demo Deep3DFaceReconstruction时遇到一些问题,拿个小本本记录下来. 项目介绍 这个项目实现了通过单张图片推理3d人脸参数的功能,对应的论文为: Accurate...