NLP实战:Pytorch实现6大经典深度学习中文短文本分类-bert+ERNIE+bert_CNN+bert_RNN+bert_RCNN+bert_DPCNN

目录

  • Introduction 导言
  • 数据集
  • Python环境及安装相应依赖包
    • Anaconda环境配置
  • 源代码地址
    • 预训练语言模型下载
    • 新建saved_dict文件夹
  • Bert
    • 模型说明
  • ERNIE
    • ERNIE 1.0
    • ERNIE2.0
    • ERNIE 3.0
  • bert_CNN、bert_RNN、bert_RCNN、bert_DPCNN
    • 模型说明
  • 各模型效果对比
  • 参考资料
  • 其它资料下载

在这里插入图片描述


Introduction 导言

本文基于PyTorch框架,实现了6种经典的深度学习中文文本分类模型,这些模型包括基于Transformer模型的Bert和ERNIE,以及结合卷积神经网络、循环神经网络和深度金字塔卷积神经网络的bert_CNN、bert_RNN、bert_RCNN和bert_DPCNN,并对各模型进行了训练与结果比较。

首先,本文提供了详细的数据集说明,包括数据集来源、预处理方法和数据集划分方式。这样,读者可以了解数据集的特点,并按照说明准备和处理数据。

在环境搭建方面,我们提供了必要的依赖库和环境配置说明,以帮助读者顺利设置环境并运行项目。同时考虑到运行时间,也为大家提供了安装GPU版本的Pytorch的详细步骤

对于每个模型,我们提供了详细的说明,包括模型结构、输入数据格式以及训练和推理过程。这些说明有助于读者理解每个模型的工作原理和实现细节。

最后,我们附上了训练和测试结果的详细报告。这些结果可帮助读者评估各模型在中文文本分类任务中的性能,并进行比较和分析。

通过本文,读者可以了解到各种深度学习中文文本分类模型的实现细节和性能表现。该项目不仅为学术研究者提供了参考,还为开发人员和实践者提供了可复用的代码和实验指南,助力他们在中文文本分类任务中取得更好的结果。

数据集

从THUCNews中抽取了20万条新闻标题,文本长度在20到30之间。一共10个类别,每类2万条。

以字为单位输入模型,使用了预训练词向量:搜狗新闻 Word+Character 300d。

类别:财经、房产、股票、教育、科技、社会、时政、体育、游戏、娱乐。

数据集、词表及对应的预训练词向量,已经打包好,详见下面Github地址中THUCNews文件夹。

在这里插入图片描述
在这里插入图片描述

Python环境及安装相应依赖包

  • python 3.7以上
  • pytorch 1.1 以上
  • tqdm
  • sklearn
  • tensorboardX
  • boto3
  • regex

Anaconda环境配置

  1. 登录Anaconda官网,下载并安装Anaconda

  2. 接着打开终端,依次输入下面终端命令:

新建环境:chinese_text_classification

conda create --name chinese_text_classification python==3.8.10

激活环境:

conda activate chinese_text_classification

依次输入下面命令安装相关python包

conda install pytorch
conda install scikit-learn
conda install tqdm
conda install tensorboardX
conda install boto3
conda install regex

注意上述安装的pytorch默认是CPU版本的。由于本文中的bert与ERNIE模型都使用了Transform相关模块,建议大家都安装GPU版本的pytorch

如果要安装GPU版本的pytorch,可以参考下面步骤:

首先,确保你已经正确安装了NVIDIA显卡驱动程序,并且你的显卡支持CUDA。可以在NVIDIA官方网站上查找相应的驱动程序和CUDA兼容性信息。

在Python环境中安装PyTorch之前,你需要安装适用于你的CUDA版本的CUDAToolkit。可以通过NVIDIA的开发者网站下载并安装适合你的CUDA版本的CUDAToolkit。

完成上面步骤后,你可以使用下面命令,来查看你的GPU相关版本。

nvcc --version

在这里插入图片描述
如果没有上述版本的话,需要检查下是否安装好了CUDA 与 CUDAToolkit。

接着,可以在pytorch的下载网站上下载相应版本的whl进行安装,因为一般gpu版本的pytorch文件都很大,不太建议直接使用pip安装。比如下面就是直接使用pip安装gpu版本的pytorch命令,需要花费大概13个小时:

pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117

在这里插入图片描述
可以直接用浏览器打开上图中出现的下载网站:https://download.pytorch.org/whl/cu117 然后选择torch 接着搜索上图中的关键词cu117-cp38-cp38-win_amd64.whl。点击即可下载。一般网速快的话,大概10余分钟就可以下载成功。

在这里插入图片描述
下载成功后,就可以直接使用下面命令进行安装:

pip install <path/to/your/whl/file.whl>

请将<path/to/your/whl/file.whl>替换为实际的.wl文件路径(例如:pip install /path/to/your/file.whl

源代码地址

Github地址:https://github.com/649453932/Bert-Chinese-Text-Classification-Pytorch

预训练语言模型下载

由于bert和ERNIE都使用了预训练模型。在运行项目前,需下载相关预训练模型文件。

bert模型放在 bert_pretain目录下,ERNIE模型放在ERNIE_pretrain目录下,每个目录下都是三个文件:

  • pytorch_model.bin
  • bert_config.json
  • vocab.txt

预训练模型下载地址:
bert_Chinese: 模型 https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese.tar.gz
词表 https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt
注意词表文件下载后,改名为vocab.txt

ERNIE_Chinese: 网盘地址:https://pan.baidu.com/s/1lEPdDN1-YQJmKEd_g9rLgw

解压后,按照上面说的放在对应目录下,文件名称确认无误即可。

新建saved_dict文件夹

需在THUCNews中新建一个名为saved_dict的文件夹,用于保存每次训练完的ckpt模型文件。

在这里插入图片描述

如果没新建,会出现下面错误:

在这里插入图片描述

Bert

BERT是2018年10月由Google AI研究院提出的一种预训练模型。BERT的全称是Bidirectional Encoder Representation from Transformers。BERT在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩: 全部两个衡量指标上全面超越人类,并且在11种不同NLP测试中创出SOTA表现,包括将GLUE基准推高至80.4% (绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进5.6%),成为NLP发展史上的里程碑式的模型成就。

模型说明

BERT 模型是基于 Transformer 的 Encoder(编码器),主要模型结构就是 Transformer 的堆叠。同时,Bert直接引用了Transformer架构中的Encoder模块,并舍弃了Decoder模块, 这样便自动拥有了双向编码能力和强大的特征提取能力,它是个双向的Transformer网络。某种意义上来说,BERT更加侧重语言的理解,而不仅仅是生成(Language Generation)。

在 BERT 中,输入的向量是由三种不同的 embedding 求和而成,分别是:

1)token embedding:单词本身的向量表示。token 是指将单词划分成一组有限的公共子词单元,能在单词的有效性和字符的灵活性之间取得一个折中的平衡。

2)position embedding:将单词的位置信息编码成特征向量。因为我们的网络结构没有RNN 或者LSTM,因此我们无法得到序列的位置信息,所以需要构建一个position embedding。构建position embedding有两种方法:BERT是初始化一个position embedding,然后通过训练将其学出来;而Transformer是通过制定规则来构建一个position embedding。

3)segment embedding:用于区分两个句子的向量表示。这个在问答等非对称句子中是用区别的。

在 BERT 中,输出是由四部分组成:

(1)last_hidden_state:shape 是(batch_size, sequence_length, hidden_size),hidden_size=768,它是模型最后一层输出的隐藏状态(通常用于命名实体识别)。

(2)pooler_output:shape是(batch_size, hidden_size),这是序列的第一个token(classification token)的最后一层的隐藏状态,它是由线性层和 Tanh 激活函数进一步处理的(通常用于句子分类,至于是使用这个表示,还是使用整个输入序列的隐藏状态序列的平均化或池化,视情况而定)。

(3)hidden_states:这是输出的一个可选项,如果输出,需要指定 config.output_hidden_states=True,它也是一个元组,它的第一个元素是 embedding,其余元素是各层的输出,每个元素的形状是(batch_size, sequence_length, hidden_size)。

(4)attentions:这也是输出的一个可选项,如果输出,需要指定 config.output_attentions=True,它也是一个元组,它的元素是每一层的注意力权重,用于计算 self-attention heads 的加权平均值。

原理图如下:
在这里插入图片描述

优点:

Bert的基础建立在transformer之上,拥有强大的语言表征能力和特征提取能力。在11项 NLP基准测试任务中达到state of the art。同时再次证明了双向语言模型的能力更加强大。

缺点:
1)可复现性差,基本没法做,只能拿来主义直接用!
2)训练过程中因为每个batch_size中的数据只有15%参与预测,模型收敛较慢,需要强大的算力支撑!

# coding: UTF-8
import torch
import torch.nn as nn
# from pytorch_pretrained_bert import BertModel, BertTokenizer
from pytorch_pretrained import BertModel, BertTokenizerclass Config(object):"""配置参数"""def __init__(self, dataset):self.model_name = 'bert'self.train_path = dataset + '/data/train.txt'                                # 训练集self.dev_path = dataset + '/data/dev.txt'                                    # 验证集self.test_path = dataset + '/data/test.txt'                                  # 测试集self.class_list = [x.strip() for x in open(dataset + '/data/class.txt').readlines()]                                # 类别名单self.save_path = dataset + '/saved_dict/' + self.model_name + '.ckpt'        # 模型训练结果self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')   # 设备self.require_improvement = 1000                                 # 若超过1000batch效果还没提升,则提前结束训练self.num_classes = len(self.class_list)                         # 类别数self.num_epochs = 3                                             # epoch数self.batch_size = 128                                           # mini-batch大小self.pad_size = 32                                              # 每句话处理成的长度(短填长切)self.learning_rate = 5e-5                                       # 学习率self.bert_path = './bert_pretrain'self.tokenizer = BertTokenizer.from_pretrained(self.bert_path)self.hidden_size = 768class Model(nn.Module):def __init__(self, config):super(Model, self).__init__()self.bert = BertModel.from_pretrained(config.bert_path)for param in self.bert.parameters():param.requires_grad = Trueself.fc = nn.Linear(config.hidden_size, config.num_classes)def forward(self, x):context = x[0]  # 输入的句子mask = x[2]  # 对padding部分进行mask,和句子一个size,padding部分用0表示,如:[1, 1, 1, 1, 0, 0]_, pooled = self.bert(context, attention_mask=mask, output_all_encoded_layers=False)out = self.fc(pooled)return out

终端运行下面命令,进行训练和测试:

python run.py --model Bert

训练及测试结果如下:

使用GPU版本pytorch,耗时32分18秒,准确率94.48%

在这里插入图片描述

ERNIE

ERNIE(Enhanced Representation through Knowledge Integration)是百度提出的语义表示模型,同样基于Transformer Encoder。相较于BERT,其预训练过程利用了更丰富的语义知识和更多的语义任务,在多个NLP任务上取得了比BERT等模型更好的效果。

ERNIE 1.0

ERNIE 1.0是通过建模海量数据中的词、实体及实体关系,学习真实世界的语义知识。相较于BERT学习原始语言信号,ERNIE 1.0 可以直接对先验语义知识单元进行建模,增强了模型语义表示能力。

Bert模型的训练任务之一是掩码语言模型,它将单个的字(中文)、词(英文)进行随机mask标记后,去预测被mask的值。掩码语言模型使得Bert具有良好的效果,但同时巨大的缺陷是将句子的字与字或词与词之间的关系拆散了。

针对Bert模型的缺陷,ERNIE使用的掩码语言模型mask的不是单个的字或词,而是完整的词语、短语、命名实体。遮盖住后预测整体,从而使得语言模型能够训练出较好的全局信息,能够学习到非常先验的结果。

百度经过大量的训练,训练出效果较好的分词模型、短语拼接模型以及命名实体识别的模型,提前将语料中的词语进行标记。(在论文中这个思想称为:知识融合)

ERNIE2.0

ERNIE 2.0的主要思想: 不断学习预料中的不同层次的任务和知识,从而去增强ERNIE模型语义表示的建模能力。

ERNIE 2.0模型将四大部分作为输入,分别为:

1.Token embedding:词向量本身的embedding
2.Sentence embedding:句子类型的embedding
3.Position embedding:位置信息的embedding
4.Task embedding:任务embedding建模不同的任务

将四大embedding相加,最终的结果作为Transformer的输入,训练不同的子任务。子任务分为三类,分别为:

1.Word-aware Pre-training Task 词法层面的预训练任务;
2.Structure-aware Pre-training Task 结构层面的预训练任务;
3.Semantic-aware Pre-training Task 语义层面的预训练任务。

ERNIE 3.0

与ERNIE 2.0进行比较

  1. 相同点:
  • 采用连续学习
  • 采用了多个语义层级的预训练任务
  1. 不同点:
  • ERNIE 3.0 Transformer-XL Encoder(自回归+自编码), ERNIE 2.0 Transformer Encoder(自编码)
  • 预训练任务的细微差别,ERNIE3.0里增加的知识图谱
  • ERNIE 3.0考虑到不同的预训练任务具有不同的高层语义,而共享着底层的语义(比如语法,词法等),为了充分地利用数据并且实现高效预训练,ERNIE 3.0中对采用了多任务训练中的常见做法,将不同的特征层分为了通用语义层(Universal Representation)和任务相关层(Task-specific Representation)。

对比ERNIE 与 Bert

在这里插入图片描述

ERNIE 2.0 原理图如下:

在这里插入图片描述

ERNIE 3.0 原理图如下:

在这里插入图片描述

# coding: UTF-8
import torch
import torch.nn as nn
# from pytorch_pretrained_bert import BertModel, BertTokenizer
from pytorch_pretrained import BertModel, BertTokenizerclass Config(object):"""配置参数"""def __init__(self, dataset):self.model_name = 'ERNIE'self.train_path = dataset + '/data/train.txt'                                # 训练集self.dev_path = dataset + '/data/dev.txt'                                    # 验证集self.test_path = dataset + '/data/test.txt'                                  # 测试集self.class_list = [x.strip() for x in open(dataset + '/data/class.txt').readlines()]                                # 类别名单self.save_path = dataset + '/saved_dict/' + self.model_name + '.ckpt'        # 模型训练结果self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')   # 设备self.require_improvement = 1000                                 # 若超过1000batch效果还没提升,则提前结束训练self.num_classes = len(self.class_list)                         # 类别数self.num_epochs = 3                                             # epoch数self.batch_size = 128                                           # mini-batch大小self.pad_size = 32                                              # 每句话处理成的长度(短填长切)self.learning_rate = 5e-5                                       # 学习率self.bert_path = './ERNIE_pretrain'self.tokenizer = BertTokenizer.from_pretrained(self.bert_path)print(self.tokenizer)self.hidden_size = 768class Model(nn.Module):def __init__(self, config):super(Model, self).__init__()self.bert = BertModel.from_pretrained(config.bert_path)for param in self.bert.parameters():param.requires_grad = Trueself.fc = nn.Linear(config.hidden_size, config.num_classes)def forward(self, x):context = x[0]  # 输入的句子mask = x[2]  # 对padding部分进行mask,和句子一个size,padding部分用0表示,如:[1, 1, 1, 1, 0, 0]_, pooled = self.bert(context, attention_mask=mask, output_all_encoded_layers=False)out = self.fc(pooled)return out

终端运行下面命令,进行训练和测试:

python run.py --model ERNIE

训练及测试结果如下:

使用GPU版本pytorch,耗时30分14秒,准确率94.67%

在这里插入图片描述

bert_CNN、bert_RNN、bert_RCNN、bert_DPCNN

模型说明

  • bert_CNN:把bert当作embedding层送入CNN模型
  • bert_RNN:把bert当作embedding层送入RNN模型
  • bert_RCNN:把bert当作embedding层送入RCNN模型
  • bert_DPCNN:把bert当作embedding层送入DPCNN模型

关于CNN、RNN、RCNN、DPCNN模型的详细说明和相关原理图,详见我另外一个博客:NLP实战:Pytorch实现7大经典深度学习中文文本分类-TextCNN+TextRNN+FastText+TextRCNN+TextRNN_Attention+DPCNN+Transformer

bert_CNN模型代码:

# coding: UTF-8
import torch
import torch.nn as nn
import torch.nn.functional as F
from pytorch_pretrained import BertModel, BertTokenizerclass Config(object):"""配置参数"""def __init__(self, dataset):self.model_name = 'bert'self.train_path = dataset + '/data/train.txt'                                # 训练集self.dev_path = dataset + '/data/dev.txt'                                    # 验证集self.test_path = dataset + '/data/test.txt'                                  # 测试集self.class_list = [x.strip() for x in open(dataset + '/data/class.txt').readlines()]                                # 类别名单self.save_path = dataset + '/saved_dict/' + self.model_name + '.ckpt'        # 模型训练结果self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')   # 设备self.require_improvement = 1000                                 # 若超过1000batch效果还没提升,则提前结束训练self.num_classes = len(self.class_list)                         # 类别数self.num_epochs = 3                                             # epoch数self.batch_size = 128                                           # mini-batch大小self.pad_size = 32                                              # 每句话处理成的长度(短填长切)self.learning_rate = 5e-5                                       # 学习率self.bert_path = './bert_pretrain'self.tokenizer = BertTokenizer.from_pretrained(self.bert_path)self.hidden_size = 768self.filter_sizes = (2, 3, 4)                                   # 卷积核尺寸self.num_filters = 256                                          # 卷积核数量(channels数)self.dropout = 0.1class Model(nn.Module):def __init__(self, config):super(Model, self).__init__()self.bert = BertModel.from_pretrained(config.bert_path)for param in self.bert.parameters():param.requires_grad = Trueself.convs = nn.ModuleList([nn.Conv2d(1, config.num_filters, (k, config.hidden_size)) for k in config.filter_sizes])self.dropout = nn.Dropout(config.dropout)self.fc_cnn = nn.Linear(config.num_filters * len(config.filter_sizes), config.num_classes)def conv_and_pool(self, x, conv):x = F.relu(conv(x)).squeeze(3)x = F.max_pool1d(x, x.size(2)).squeeze(2)return xdef forward(self, x):context = x[0]  # 输入的句子mask = x[2]  # 对padding部分进行mask,和句子一个size,padding部分用0表示,如:[1, 1, 1, 1, 0, 0]encoder_out, text_cls = self.bert(context, attention_mask=mask, output_all_encoded_layers=False)out = encoder_out.unsqueeze(1)out = torch.cat([self.conv_and_pool(out, conv) for conv in self.convs], 1)out = self.dropout(out)out = self.fc_cnn(out)return out

bert_RNN模型代码:

# coding: UTF-8
import torch
import torch.nn as nn
import torch.nn.functional as F
from pytorch_pretrained import BertModel, BertTokenizerclass Config(object):"""配置参数"""def __init__(self, dataset):self.model_name = 'bert'self.train_path = dataset + '/data/train.txt'                                # 训练集self.dev_path = dataset + '/data/dev.txt'                                    # 验证集self.test_path = dataset + '/data/test.txt'                                  # 测试集self.class_list = [x.strip() for x in open(dataset + '/data/class.txt').readlines()]                                # 类别名单self.save_path = dataset + '/saved_dict/' + self.model_name + '.ckpt'        # 模型训练结果self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')   # 设备self.require_improvement = 1000                                 # 若超过1000batch效果还没提升,则提前结束训练self.num_classes = len(self.class_list)                         # 类别数self.num_epochs = 3                                             # epoch数self.batch_size = 128                                           # mini-batch大小self.pad_size = 32                                              # 每句话处理成的长度(短填长切)self.learning_rate = 5e-5                                       # 学习率self.bert_path = './bert_pretrain'self.tokenizer = BertTokenizer.from_pretrained(self.bert_path)self.hidden_size = 768self.filter_sizes = (2, 3, 4)                                   # 卷积核尺寸self.num_filters = 256                                          # 卷积核数量(channels数)self.dropout = 0.1self.rnn_hidden = 768self.num_layers = 2class Model(nn.Module):def __init__(self, config):super(Model, self).__init__()self.bert = BertModel.from_pretrained(config.bert_path)for param in self.bert.parameters():param.requires_grad = Trueself.lstm = nn.LSTM(config.hidden_size, config.rnn_hidden, config.num_layers,bidirectional=True, batch_first=True, dropout=config.dropout)self.dropout = nn.Dropout(config.dropout)self.fc_rnn = nn.Linear(config.rnn_hidden * 2, config.num_classes)def forward(self, x):context = x[0]  # 输入的句子mask = x[2]  # 对padding部分进行mask,和句子一个size,padding部分用0表示,如:[1, 1, 1, 1, 0, 0]encoder_out, text_cls = self.bert(context, attention_mask=mask, output_all_encoded_layers=False)out, _ = self.lstm(encoder_out)out = self.dropout(out)out = self.fc_rnn(out[:, -1, :])  # 句子最后时刻的 hidden statereturn out

bert_RCNN模型代码:

# coding: UTF-8
import torch
import torch.nn as nn
import torch.nn.functional as F
from pytorch_pretrained import BertModel, BertTokenizerclass Config(object):"""配置参数"""def __init__(self, dataset):self.model_name = 'bert'self.train_path = dataset + '/data/train.txt'                                # 训练集self.dev_path = dataset + '/data/dev.txt'                                    # 验证集self.test_path = dataset + '/data/test.txt'                                  # 测试集self.class_list = [x.strip() for x in open(dataset + '/data/class.txt').readlines()]                                # 类别名单self.save_path = dataset + '/saved_dict/' + self.model_name + '.ckpt'        # 模型训练结果self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')   # 设备self.require_improvement = 1000                                 # 若超过1000batch效果还没提升,则提前结束训练self.num_classes = len(self.class_list)                         # 类别数self.num_epochs = 3                                             # epoch数self.batch_size = 128                                           # mini-batch大小self.pad_size = 32                                              # 每句话处理成的长度(短填长切)self.learning_rate = 5e-5                                       # 学习率self.bert_path = './bert_pretrain'self.tokenizer = BertTokenizer.from_pretrained(self.bert_path)self.hidden_size = 768self.filter_sizes = (2, 3, 4)                                   # 卷积核尺寸self.num_filters = 256                                          # 卷积核数量(channels数)self.dropout = 0.1self.rnn_hidden = 256self.num_layers = 2class Model(nn.Module):def __init__(self, config):super(Model, self).__init__()self.bert = BertModel.from_pretrained(config.bert_path)for param in self.bert.parameters():param.requires_grad = Trueself.lstm = nn.LSTM(config.hidden_size, config.rnn_hidden, config.num_layers,bidirectional=True, batch_first=True, dropout=config.dropout)self.maxpool = nn.MaxPool1d(config.pad_size)self.fc = nn.Linear(config.rnn_hidden * 2 + config.hidden_size, config.num_classes)def forward(self, x):context = x[0]  # 输入的句子mask = x[2]  # 对padding部分进行mask,和句子一个size,padding部分用0表示,如:[1, 1, 1, 1, 0, 0]encoder_out, text_cls = self.bert(context, attention_mask=mask, output_all_encoded_layers=False)out, _ = self.lstm(encoder_out)out = torch.cat((encoder_out, out), 2)out = F.relu(out)out = out.permute(0, 2, 1)out = self.maxpool(out).squeeze()out = self.fc(out)return out

bert_DPCNN模型代码:

# coding: UTF-8
import torch
import torch.nn as nn
import torch.nn.functional as F
# from pytorch_pretrained_bert import BertModel, BertTokenizer
from pytorch_pretrained import BertModel, BertTokenizerclass Config(object):"""配置参数"""def __init__(self, dataset):self.model_name = 'bert'self.train_path = dataset + '/data/train.txt'                                # 训练集self.dev_path = dataset + '/data/dev.txt'                                    # 验证集self.test_path = dataset + '/data/test.txt'                                  # 测试集self.class_list = [x.strip() for x in open(dataset + '/data/class.txt').readlines()]                                # 类别名单self.save_path = dataset + '/saved_dict/' + self.model_name + '.ckpt'        # 模型训练结果self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')   # 设备self.require_improvement = 1000                                 # 若超过1000batch效果还没提升,则提前结束训练self.num_classes = len(self.class_list)                         # 类别数self.num_epochs = 3                                             # epoch数self.batch_size = 128                                           # mini-batch大小self.pad_size = 32                                              # 每句话处理成的长度(短填长切)self.learning_rate = 5e-5                                       # 学习率self.bert_path = './bert_pretrain'self.tokenizer = BertTokenizer.from_pretrained(self.bert_path)self.hidden_size = 768self.num_filters = 250                                          # 卷积核数量(channels数)class Model(nn.Module):def __init__(self, config):super(Model, self).__init__()self.bert = BertModel.from_pretrained(config.bert_path)for param in self.bert.parameters():param.requires_grad = True# self.fc = nn.Linear(config.hidden_size, config.num_classes)self.conv_region = nn.Conv2d(1, config.num_filters, (3, config.hidden_size), stride=1)self.conv = nn.Conv2d(config.num_filters, config.num_filters, (3, 1), stride=1)self.max_pool = nn.MaxPool2d(kernel_size=(3, 1), stride=2)self.padding1 = nn.ZeroPad2d((0, 0, 1, 1))  # top bottomself.padding2 = nn.ZeroPad2d((0, 0, 0, 1))  # bottomself.relu = nn.ReLU()self.fc = nn.Linear(config.num_filters, config.num_classes)def forward(self, x):context = x[0]  # 输入的句子mask = x[2]  # 对padding部分进行mask,和句子一个size,padding部分用0表示,如:[1, 1, 1, 1, 0, 0]encoder_out, text_cls = self.bert(context, attention_mask=mask, output_all_encoded_layers=False)x = encoder_out.unsqueeze(1)  # [batch_size, 1, seq_len, embed]x = self.conv_region(x)  # [batch_size, 250, seq_len-3+1, 1]x = self.padding1(x)  # [batch_size, 250, seq_len, 1]x = self.relu(x)x = self.conv(x)  # [batch_size, 250, seq_len-3+1, 1]x = self.padding1(x)  # [batch_size, 250, seq_len, 1]x = self.relu(x)x = self.conv(x)  # [batch_size, 250, seq_len-3+1, 1]while x.size()[2] > 2:x = self._block(x)x = x.squeeze()  # [batch_size, num_filters(250)]x = self.fc(x)return xdef _block(self, x):x = self.padding2(x)px = self.max_pool(x)x = self.padding1(px)x = F.relu(x)x = self.conv(x)x = self.padding1(x)x = F.relu(x)x = self.conv(x)x = x + px  # short cutreturn x

终端运行下面命令,进行训练和测试:

python run.py --model <模型名称>

使用GPU版本pytorch,bert_CNN、bert_RNN、bert_RCNN、bert_DPCNN的训练及测试结果分别如下:

bert_CNN:

在这里插入图片描述

bert_RNN:

在这里插入图片描述

bert_RCNN:

在这里插入图片描述

bert_DPCNN:

在这里插入图片描述

各模型效果对比

模型acc备注
bert94.48%bert + fc
ERNIE94.67%使用的是ERNIE 1.0,比bert略好(不像传闻中的中文碾压bert)
bert_CNN94.67%bert+经典CNN文本分类
bert_RNN93.98%bert+BiLSTM
bert_RCNN94.61%bert+BiLSTM+池化
bert_DPCNN94.28%bert+深层金字塔CNN

参考资料

ERNIE 2.0 理解与使用

中文预训练大模型—文心Ernie技术原理

ERNIE3.0刷新50多个NLP任务基准!

其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/54928.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员诗2首:悲催诗(史)与爱情诗

这几周《非诚勿扰》来了不少IT男&#xff0c;而且来自硅谷&#xff0c;这触发了大家对程序员的好奇心&#xff0c;其中主持人孟非读的一首诗堪称经典&#xff0c;我载下来&#xff0c;大家来吐吐槽&#xff01; 举头望明月&#xff0c;低头写程序。 但愿人长久&#xff0…

程序员可以有多浪漫,盘点那些像诗一样美的代码(C语言版)

文章目录 「没有你&#xff0c;我无法向世界问好」「让你的每个程序都可以留下笑脸」「UNHANDLED LOVE」「IMPORT SOUL」「很久很久以前&#xff0c;...」「都听你的」「Hello World」「最萌宏定义」「假作真时真亦假」「嘤语言 & e语言」「面向StackOverflow编程」「Don’…

JAVA 仿QQ聊天程序(附源码)

个人推荐: &#x1f4e2;&#x1f4e2;&#x1f4e2; 前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下 "通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。点击跳转到教程。 前言: 第一次通过java编写完了一个模拟QQ的C/S…

2022年营销传播研究报告

第一章 行业概况 营销传播是公司试图向消费者直接或间接地告知、劝说和提醒其销售的产品和品牌信息的活动。在某种意义上&#xff0c;营销传播代表着公司及其品牌的声音&#xff0c;它们是公司与消费者进行对话和建立关系的桥梁。营销传播能够通过强化顾客忠诚度&#xff0c;提…

【RPA之家转载】捷报频传,影刀RPA荣获“时尚行业数字化卓越产品大奖”

RPA之家&#xff08;RPA之家|RPA|RPA新闻|RPA案例|RPA应用|RPA咨询|RPA培训|RPA认证|RPA教程&#xff09;是中国具有影响力的RPA垂直交流社区&#xff0c;社区汇聚了RPA领域的各类从业人员。其中包括RPA开发工程师、售前工程师、业务分析师、架构师、运维工程师、项目管理、项目…

哪家代运营公司比较好?天猫代运营公司十大排名任你挑选。

如今的疫情反反复复&#xff0c;在这种情形下&#xff0c;电商行业呈现了更大的发展空间。而随着互联网的发展&#xff0c;也让传统的实体店铺陷入了困境&#xff0c;于是大家纷纷进行了新的尝试&#xff0c;向线上电商平台进军&#xff0c;但是由于电商的技术壁垒比较高&#…

《python爬爬乐》入门篇:结构类型详解

python爬虫 字典 python中的字典(dict)&#xff0c;来源于生活中的目录。它的主要特征&#xff0c;不是根据位置来访问数据&#xff0c;而是根据一个预先约定好的关键字(key)来访问指定数据(value)&#xff0c;键和值使用“key : value”的方式来保存&#xff0c;可以称之为键…

不知道说些什么

周一入职新公司到今天连续干了三天&#xff0c;去公司基本从早干到晚&#xff0c;事很满&#xff0c;没时间看新闻看书思考。所以吧 起了这么一个标题。 最近有个瓜是绿地京津冀事业部营销部负责人陈军被实名举报&#xff0c;举报人举报绿地员工睡自己老婆&#xff0c;还怀了孩…

透过宝尊电商Q1财报,看品牌电商全渠道发展的想象力

北京时间5月18日晚间&#xff0c;宝尊电商公布其Q1财报&#xff0c;从基本面来看&#xff0c;宝尊电商行业龙头地位稳固。 财报显示&#xff0c;宝尊2021年Q1 总净营收达20.2亿元人民币&#xff0c;同比增33%。其中&#xff0c;非美国会计准则下运营利润达7,575万元人民币&…

互联网日报 | 瑞幸咖啡内部调查基本完成;12306官方支付宝小程序上线;华为openGauss正式开源...

今日看点 ✦ 瑞幸咖啡宣布内部调查基本完成&#xff0c;2019年净收入被夸大约21.2亿元 ✦ 华为正式宣布开源数据库能力&#xff0c;并成立openGauss开源社区 ✦ 紫光国微旗下紫光安全芯获得全球最高等级认证&#xff0c;实现中国零突破 ✦ 海航将推"嗨购自贸港"产品&…

全年GMV突破40亿元关口,为何如涵仍难造出第二个“张大奕”?

北京时间6月3日&#xff0c;网红电商公司如涵控股&#xff08;以下简称如涵&#xff09;发布了其截至3月31日的2020财年Q4及全年财报。从核心数据来看&#xff0c;如涵Q4营收出现下滑&#xff0c;但净亏损同比收窄&#xff1b;全年营收虽录得同比增长&#xff0c;亏损却在进一步…

Amazon SageMaker:搭建企业级AI模型的完整解决方案

目录 1 企业级AI应用的高昂成本2 什么是Amazon SageMaker&#xff1f;3 案例一&#xff1a;快速构建图像分类应用3.1 卷积神经网络3.2 本地测试版本3.3 Amazon SageMaker版本 4 案例二&#xff1a;快速构建AI绘画应用4.1 扩散模型简介4.2 模型构建与部署4.3 AI绘画测试(文生图)…

外贸业务员如何通过google搜索多个关键词批量提取客户网址?

做外贸通过google开发客户&#xff0c;已是主流。很多外贸公司已不做平台&#xff0c;完全自主开发客户。 通过google搜索客户的原理是什么&#xff1f;你客户的网站信息会被google收录(比如公司网址、公司介绍、公司产品、只要是网站出现的信息基本上都会被收录)&#xff0c;…

chatgpt赋能python:Python制图:数据可视化的艺术

Python 制图: 数据可视化的艺术 作为一名有着10年 Python 编程经验的工程师&#xff0c;我深信数据可视化是企业或项目中至关重要的一环。Python 具有强大的数据分析和可视化能力&#xff0c;通过一些库&#xff0c;如 Matplotlib、Seaborn 和 Plotly&#xff0c;我们可以轻松…

chatgpt赋能python:Python坐标图:简单易用的数据可视化工具

Python 坐标图&#xff1a;简单易用的数据可视化工具 作为一种通用工具&#xff0c;Python 不仅在数据科学、自然语言处理、机器学习和深度学习等领域应用广泛&#xff0c;还在数据可视化方面表现出色。Python 的数据可视化库丰富多样&#xff0c;其中最受欢迎的就是 Matplotl…

chatgpt赋能python:Python编写简单表格:让数据可视化

Python编写简单表格&#xff1a;让数据可视化 在日常工作中&#xff0c;需要呈现各种数据&#xff0c;如销售额、用户数量等。在展示这些数据时&#xff0c;一个清晰的表格可以使信息更加易于理解。Python是一种流行的编程语言&#xff0c;可以使用其提供的模块和库来创建一些…

【论文阅读-Low-code LLM】使用LLM进行可视化编程

Low-code LLM: Visual Programming over LLMs link: https://arxiv.org/abs/2304.08103 repository: https://github.com/microsoft/TaskMatrix/tree/main/LowCodeLLM 摘要 大规模预训练模型&#xff08;LLMs&#xff09;在解决困难问题仍具有很大的挑战。这篇文章提出了可以…

抢红包算法(公平版和手速版)

当我们在群里抢红包时真的是手速越快红包金额越大吗&#xff1f; 答案当然是并不是&#xff0c;都说了是拼手气&#xff0c;岂能是拼手速&#xff01; 不过也可以有拼手速的方法 抢红包 二倍均值法&#xff08;公平版&#xff09;线段切割法&#xff08;手速版&#xff09; 二…

除了智能音箱,AI语音还可以用在哪里?

作者&#xff1a;Echo 来源&#xff1a;科技树&#xff08;ID&#xff1a;techtreex&#xff09; 说起来可笑&#xff0c;每次我找不到眼镜的时候&#xff0c;我都想拿出手机&#xff0c;给我的眼镜“打个电话”&#xff0c;好听声辨位。 不知道有没有人&#xff0c;开发这种功…

会唱歌、会弹琴,清华大学 AI 学生华智冰火了

整理 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 清华大学计算机系知识工程实验室&#xff0c;开发的中国首个原创虚拟学生——华智冰&#xff0c;与近日亮相。她的声音、肢体动作全部由人工智能完成。 今年6月&#xff0c;清华大学计算机系录取了一位…