Bert实战:使用Bert实现文本分类。

举报
AI浩 发表于 2021/12/23 00:00:50 2021/12/23
【摘要】 1、简介 最近使用Bert实现了文本分类,模型使用的是bert的base版本。本文记录一下实现过程。 数据集:cnews,包含三个文件,分别是cnews.train.txt、cnews.test.tx...

1、简介

最近使用Bert实现了文本分类,模型使用的是bert的base版本。本文记录一下实现过程。

数据集:cnews,包含三个文件,分别是cnews.train.txt、cnews.test.txt、cnews.val.txt。类别包含10类,分别是:体育、娱乐、家居、房产、教育、时尚、时政、游戏、科技、财经。

代码参考:https://github.com/BeHappyForMe/Multi_Model_Classification,对代码的一些部分作了修改和注解。关注公众号“AI小浩”,回复“bert实战”,获取代码和数据集。

2、下载代码和数据集

数据集的地址:

链接:https://pan.baidu.com/s/1JKiaexp0oQeJF02UUX5eSw
提取码:2222

下载代码后,将代码解压到指定的目录,让后将数据集放进去。删除其他的模型只保留bert的。如下图:

image-20211022144636375
安装transformers

pip install transformers

  
 
  • 1

3、下载预训练模型。

链接:bert-base-chinese at main (huggingface.co),将下图中,画红框的文件下载下来。在项目的根目录新建chinese_wwm_pytorch文件夹,将下载的文件放进去。

image-20211022153525011

新建outs文件夹,将config.json、tokenizer.json、tokenizer_config.json和vocab.txt复制到outs文件夹中。

注:模型的类型在configuration_bert.py中查看。选择合适的模型很重要,比如这次是中文文本的分类。选择用bert-base-uncased只能得到86%的准确率,但是选用bert-base-chinese就可以轻松达到96%。

image-20211025192732926

4、修改bert_cnews.py代码

对68行的代码做修改。原始代码如下:

ALL_MODELS = sum((tuple(conf.pretrained_config_archive_map.keys()) for conf in (BertConfig, XLNetConfig, XLMConfig,
                                                                                RobertaConfig, DistilBertConfig)), ())

  
 
  • 1
  • 2

修改为:

ALL_MODELS=tuple(BERT_PRETRAINED_CONFIG_ARCHIVE_MAP)

  
 
  • 1

作者想把BertConfig、XLNetConfig、XLMConfig、RobertaConfig, DistilBertConfig等都导进来。可能是版本的升级pretrained_config_archive_map这个字段做了修改,以Bert为例,这个字段改为了‘BERT_PRETRAINED_CONFIG_ARCHIVE_MAP’。本次案例只是对Bert的讲解,所以我只保留了Bert的字段。

image-20211022154646619

5、修改main()方法中的参数。

data_dir:数据集的路径,改为“./cnews”。

  parser.add_argument("--data_dir", default='./cnews', type=str, required=False,
                        help="The input data dir. Should contain the .tsv files (or other data files) for the task.")

  
 
  • 1
  • 2

model_type:模型的类型,MODEL_CLASSES的参数,本次使用bert。

  parser.add_argument("--model_type", default='bert', type=str, required=False,
                        help="Model type selected in the list: " + ", ".join(MODEL_CLASSES.keys()))


  
 
  • 1
  • 2
  • 3

model_name_or_path:预训练模型的存放路径,设置为‘chinese_wwm_pytorch’。

    parser.add_argument("--model_name_or_path", default='chinese_wwm_pytorch', type=str, required=False,
                        help="Path to pre-trained model or shortcut name selected in the list: " + ", ".join(
                            ALL_MODELS))

  
 
  • 1
  • 2
  • 3

这个文件下面的文件详见下图:

image-20211025190808637

task_name:任务名称。我写的cnews

 parser.add_argument("--task_name", default='cnews', type=str, required=False,
                        help="The name of the task to train selected in the list: " + ", ".join(processors.keys()))


  
 
  • 1
  • 2
  • 3

do_train:是否训练。需要训练则设置为true。

    parser.add_argument("--do_train", default=True,action='store_true',
                        help="Whether to run training.")

  
 
  • 1
  • 2

do_eval:是否验证,如果设置为true,则将outs的模型一一验证。和do_train可以同时配置为true,这样训练完成后就开始验证。

 parser.add_argument("--do_eval",default=True, action='store_true',
                        help="Whether to run eval on the dev set.")

  
 
  • 1
  • 2

evaluate_during_training:是否在训练期间验证。默认没有配置。如果需要配置,则将其设置为true。

parser.add_argument("--evaluate_during_training", action='store_true',
                    help="Rul evaluation during training at each logging step.")

  
 
  • 1
  • 2

do_lower_case:是否转小写。使用uncased模型时需要设置。

 parser.add_argument("--do_lower_case",action='store_true',
                        help="Set this flag if you are using an uncased model.")

  
 
  • 1
  • 2

per_gpu_train_batch_size和per_gpu_eval_batch_size:batch_size大小,根据显卡合理设置。

 parser.add_argument("--per_gpu_train_batch_size", default=4, type=int,
                        help="Batch size per GPU/CPU for training.")
    parser.add_argument("--per_gpu_eval_batch_size", default=4, type=int,
                        help="Batch size per GPU/CPU for evaluation.")

  
 
  • 1
  • 2
  • 3
  • 4

learning_rate:学习率,默认设置即可。

parser.add_argument("--learning_rate", default=2e-5, type=float,
                        help="The initial learning rate for Adam.")
    parser.add_argument("--weight_decay", default=0.0, type=float,

  
 
  • 1
  • 2
  • 3

num_train_epochs:epochs大小。

 parser.add_argument("--num_train_epochs", default=50.0, type=float,
                        help="Total number of training epochs to perform.")

  
 
  • 1
  • 2

save_steps:迭代多少次保存一次模型。

 parser.add_argument('--save_steps', type=int, default=12500,
                        help="Save checkpoint every X updates steps.")

  
 
  • 1
  • 2

上面的参数是比较重要的参数,将这些参数配置好可以训练了。

5、验证

验证还有一步要做,config.json、tokenizer.json、tokenizer_config.json、vocab.txt。复制一份到outs文件夹。

image-20211025193518055

等训练完成就可以测试了。

image-20211025194457936

关注公众号“AI小浩”,回复‘bert分类’,获取代码、模型和数据。

文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。

原文链接:wanghao.blog.csdn.net/article/details/120959018

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。