colab上基于tensorflow2.0的BERT中文多分类

bert模型在tensorflow1.x版本时,也是先发布的命令行版本,随后又发布了bert-tensorflow包,本质上就是把相关bert实现封装起来了。

tensorflow2.0刚刚在2019年10月左右发布,谷歌也在积极地将之前基于tf1.0的bert实现迁移到2.0上,但近期看还没有完全迁移完成,所以目前还没有基于tf2.0的bert安装包面世,因为近期想基于现有发布的模型做一个中文多分类的事情,所以干脆就弄了个基于命令行版本的。过程中有一些坑,随之记录下来。

1. colab:因为想用谷歌免费的GPU(暂时没研究TPU怎么用),所以直接在colab上弄。

2. 中文多分类:

2.1. 训练数据来源:在百度百科上找了大概100多个词条的数据,自己随便标注成大概8个类别吧。把百科的概述、正文、属性等信息进行清洗后连到一起,类似于这种格式:

label    info

1         词条1的描述balabala

0        词条2的描述balabala

然后再按照9:1分成两个集合,分别明明为train.tsv 和 dev.tsv,作为训练集和测试集。注意每个训练集的第一行都是标题行,这个是我的数据解析器里面这么定义的。

2.2. 预训练模型:谷歌已经提供了基于tf2.0 keras网络结构的中文预训练模型,页面地址是:https://tfhub.dev/tensorflow/bert_zh_L-12_H-768_A-12/1。直接使用就可以了。注意,基于tf1.0的中文预训练模型(bert_chinese_L-12_H-768_A-12)不能在tf2.0里使用,要用脚本转换,但我们既然已经有了最新的模型,就直接用啦。

2.3. bert代码:在github上直接下载:https://github.com/tensorflow/models.git。注意bert已经被谷歌从tensorflow中分离出来,放在models目录下当成第三方独立代码了,所以需要自己下载配置。

2.4. 数据预处理脚本:在2.3步骤下载下来的bert代码里,位置是:models/official/nlp/bert/create_finetuning_data.py,其中已经定义好了支持若干种数据格式的类及实现,因为我需要处理上面自己定义的那种格式的数据,所以自己写了一个处理百度百科的类放到里面了,如果大家有自己的数据格式,修改后覆盖原来的文件就ok了,具体需要改的是:classifier_data_lib.py和create_finetuning_data.py 这两个文件

2. tf-nightly和bert代码下载:目前这个时间段基于tf2.0的bert只能在tf-nightly下面使用(看社区里的留言,应该在tf2.1正式发布的时候就会提供bert正式版了),所以要安装tf-nightly并且在这下面运行后面的代码。

3. 数据预处理脚本的执行:这个就按照命令行的模式在colab里调用脚本create_finetuning_data.py就可以了,没什么难的,有个坑是目前tf2.0的中文预训练模型没提供基于gs的存储位置,而预处理脚本中需要vocab.txt来分词,所以要先离线把模型下载下来,解压缩后,把里面的vocab.txt拿出来并上传到colab上,然后在预训练脚本里制定文件位置就ok(我把vocab.txt放到我的github上了,可以直接调用获取,但如果想获取最新的vocab.txt,最好自己下载然后加压获取。后续谷歌应该会提供在线模型地址,就不用这么麻烦了)

4. finetune:直接调用脚本models/official/nlp/bert/run_classifier.py,这里有个坑是脚本参数里需要bert_config.json,但上面的中文预处理模型没提供这个模型配置文件,所以干脆从其他tf1.0的模型里copy了一个过来(我用的是uncased_L-12_H-768_A-12的bert_config.json)

代码我都放到github上了,大家自己取用即可,欢迎拍砖、吐槽、交流!

https://github.com/liloi/bert-tf2/blob/master/bert-tf2-zh-demo.ipynb

打开并open in colab后,直接在colab中运行即可,有两个点要注意:

1. 安装完tf-nightly和requirements.txt之后,需要重启运行时环境,因为更换了tf了嘛

2. 最后为了看模型效果,用了tensorboard,但发现一直报错,后来社区里说是nightly版本的问题,所以按照社区的建议加了个重装tb-nightly的动作,也需要重启和运行时环境。

最终运行的效果:

在epoch2之后就过拟合了,所以训练3轮应该就够了

 

原文地址:https://www.cnblogs.com/zhongmiaozhimen/p/12228839.html

时间: 2024-08-29 07:01:51

colab上基于tensorflow2.0的BERT中文多分类的相关文章

【tensorflow2.0】处理图片数据-cifar2分类

1.准备数据 cifar2数据集为cifar10数据集的子集,只包括前两种类别airplane和automobile. 训练集有airplane和automobile图片各5000张,测试集有airplane和automobile图片各1000张. cifar2任务的目标是训练一个模型来对飞机airplane和机动车automobile两种图片进行分类. 我们准备的Cifar2数据集的文件结构如下所示. 在tensorflow中准备图片数据的常用方案有两种,第一种是使用tf.keras中的Ima

中文文本分类

本文介绍文本挖掘与文本分类的一些基本概念和流程,为后续学习分类算法做好铺垫. 一. 文本挖掘的概念 文本挖掘(Text Mining)是从非结构化文本信息中获取用户感兴趣或者有用的模式 的过程.其中被普遍认可的文本挖掘定义如下:文本挖掘是指从大量文本数据中抽取事先未知的.可理解的.最终可用的知识的过程,同时运用这些知识更好地组织信息以便将来参考. 简言之,文本挖掘就是从非结构化的文本中寻找知识的过程. 文本挖掘的七个主要领域: (1)搜索和信息检索(IR):存储和文本文档的检索,包括搜索引擎和关

红米3(ido)基于6.0.1适配第三方中文jirecovery/TWRP 3.0.2/刷遍所有ROM/官方不卡屏

TWRP3.0.2更新简介: TWRP是TeamWin团队https://github.com/TeamWin/Team-Win-Recovery-Project的开源项目,也是Omnirom系统默认的android_bootable_recovery. 红米3-TWRP-21060823更新日志: 1.基于Aink1199的20160805-cm13最新6.01内核制作. 2.基于omnirom-android-6.0适配. 3.加入禁止恢复官方recovery选项(刷完机重启时会提示). 4

Servlet3.0学习总结——基于Servlet3.0的文件上传

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了. 一.使用Servlet3.0提供的API实现文件上传 1.1.编写上传页面 <%@ page language="java&

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了. 一.使用Servlet3.0提供的API实现文件上传 1.1.编写上传页面 1 <%@ page language="jav

Ubuntu16.04上通过anaconda3离线安装Tensorflow2.0详细教程

安装背景: Ubuntu 16.0.4, 集成显卡,不能连接外网,需要使用Tensorflow2.0 安装软件配套: Anaconda3-4.7(内部继承Python3.7),TensorFlow2.0(文件应包含cp37-cp37m-manylinux2010_x86_64,其中cp37-cp37m意味着对应Python3.7,manylinux2010这个 应该属于Anaconda3支持安装的软件格式之一),由于是集成显卡,TensorFlow软件包应选择CPU版本. 1.首先下载anaco

iOS_SN_基于AFNetworking3.0网络封装

转发文章,原地址:http://www.henishuo.com/base-on-afnetworking3-0-wrapper/?utm_source=tuicool&utm_medium=referral 前言 对于开发人员来说,学习网络层知识是必备的,任何一款App的开发,都需要到网络请求接口.很多朋友都还在使用原生的NSURLConnection一行一行地写,代码到处是,这样维护起来更困难了. 对于使用AFNetworking的朋友来说,很多朋友都是直接调用AFNetworking的AP

INNO SETUP 5.5.0以上版本中文语言包

1 ; *** Inno Setup version 5.5.0+ Chinese messages *** 2 ; 3 ; To download user-contributed translations of this file, go to: 4 ; http://www.jrsoftware.org/is3rdparty.php 5 ; 6 ; Note: When translating this text, do not add periods (.) to the end of

基于AFNetworking3.0网络封装

概述 对于开发人员来说,学习网络层知识是必备的,任何一款App的开发,都需要到网络请求接口.很多朋友都还在使用原生的NSURLConnection一行一行地写,代码到处是,这样维护起来更困难了. 对于使用AFNetworking的朋友来说,很多朋友都是直接调用AFNetworking的API,这样不太好,无法做到全工程统一配置. 最好的方式就是对网络层再封装一层,全工程不允许直接使用AFNetworking的API,必须调用我们自己封装的一层,如此一来,任何网络配置都可以在这一层里配置好,使用的