机器学习深度学习——NLP实战(情感分析模型——textCNN实现)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er
🌌上期文章:机器学习&&深度学习——NLP实战(情感分析模型——RNN实现)
📚订阅专栏:机器学习&&深度学习
希望文章对你们有所帮助

NLP实战(情感分析模型——textCNN实现)

  • 引入
  • 一维卷积
  • 最大时间池化层
  • textCNN模型
    • 定义模型
    • 加载预训练词向量
    • 训练和评估模型
  • 小结

引入

之前已经讨论过使用二维卷积神经网络来处理二维图像数据的机制,并将其应用于局部特征,如相邻像素。虽然卷积神经网络最初是为计算机视觉而设计的,但它也被广泛应用于NLP。简单来说,只要将任何文本序列想象成一维图像即可。通过这种方式,一维卷积神经网络可以处理文本中的局部特征,例如n元语法。
本节将使用textCNN模型来演示如何设计一个表示单个文本的卷积神经网络架构。与上一节的情感分析相比,唯一的区别只有架构的选择不同。
在这里插入图片描述

import torch
from torch import nn
from d2l import torch as d2lbatch_size = 64
train_iter, test_iter, vocab = d2l.load_data_imdb(batch_size)

一维卷积

在介绍该模型前,让我们看下一维卷积的工作原理,其实就可以看作是二维卷积的特例:
在这里插入图片描述
我们在下面的corr1d函数实现了一维互相关,给定输入张量X和核张量K,它返回输出张量Y。

def corr1d(X, K):w = K.shape[0]Y = torch.zeros((X.shape[0] - w + 1))for i in range(Y.shape[0]):Y[i] = (X[i: i + w] * K).sum()return Y

构造输入张量X和核张量K来验证上述一维互相关实现的输出。

X, K = torch.tensor([0, 1, 2, 3, 4, 5, 6]), torch.tensor([1, 2])
print(corr1d(X, K))

输出结果:

tensor([ 2., 5., 8., 11., 14., 17.])

对于任何具有多个通道的一维输入,卷积核需要具有相同数量的输入通道。然后,对于每个通道,对输入的一维张量和卷积核的一维张量执行互相关运算,将所有通道上的结果相加以产生一维输出张量。如图:
在这里插入图片描述
我们可以实现多个输入通道的一维互相关运算:

def corr1d_multi_in(X, K):# 首先,遍历'X'和'K'的第0维(通道维)。然后,把它们加在一起return sum(corr1d(x, k) for x, k in zip(X, K))

可以验证结果:

X = torch.tensor([[0, 1, 2, 3, 4, 5, 6],[1, 2, 3, 4, 5, 6, 7],[2, 3, 4, 5, 6, 7, 8]])
K = torch.tensor([[1, 2], [3, 4], [-1, -3]])
print(corr1d_multi_in(X, K))

输出结果:

tensor([ 2., 8., 14., 20., 26., 32.])

多输入通道的一维互相关等同于单输入通道的二维互相关,如上图中的例子可以等价为下图:
在这里插入图片描述

最大时间池化层

类似地,我们可以使用池化层从序列表示中提取最大值,作为跨时间步的最重要特征。textCNN中使用的最大时间池化层的工作原理类似于一维全局池化。对于每个通道在不同时间步存储值的多通道输入,每个通道的输出是该通道的最大值。注意,最大时间池化允许在不同通道上使用不同数量的时间步。

textCNN模型

使用一维卷积核最大时间池化,textCNN模型将单个预训练的词元表示作为输入,然后获得并转换用于下游任务的序列表示。
对于具有由d维向量表示的n个词元的单个文本序列,输入张量的宽度、高度和通道数分别为n、1和d。textCNN模型将输入转换为输出,如下所示:
1、定义多个一维卷积核,并分别对输入执行卷积运算。具有不同宽度的卷积核可以捕获不同数目的相邻词元之间的局部特征。
2、在所有输出通道上执行最大时间池化层,然后将所有标量池化输出连结为向量。
3、使用全连接层将连结后的向量转换为输出类别。dropout可以用来减少过拟合。
如下所示:
在这里插入图片描述
上面所示的例子,我们有一个宽度为11的6通道输入。定义两个宽度为2和4的一维卷积核,分别具有4个和5个输出通道。它们产生4个宽度为11-2+1=10的输出通道和5个宽度为11-4+1=8的输出通道。尽管这9个通道的宽度不同,但最大时间池化层给出了一个连结的9维向量,该向量最终被转换为用于二元情感预测的2维输出向量。

定义模型

现在实现textCNN模型,与之前的双向循环神经网络模型相比,除了用卷积层代替循环神经网络层外,我们还使用了两个嵌入层:一个是可训练权重,另一个是固定权重。

class TextCNN(nn.Module):def __init__(self, vocab_size, embed_size, kernel_sizes, num_channels,**kwargs):super(TextCNN, self).__init__(**kwargs)self.embedding = nn.Embedding(vocab_size, embed_size)# 这个嵌入层不需要训练self.constant_embedding = nn.Embedding(vocab_size, embed_size)self.dropout = nn.Dropout(0.5)self.decoder = nn.Linear(sum(num_channels), 2)# 最大时间汇聚层没有参数,因此可以共享此实例self.pool = nn.AdaptiveAvgPool1d(1)self.relu = nn.ReLU()# 创建多个一维卷积层self.convs = nn.ModuleList()for c, k in zip(num_channels, kernel_sizes):self.convs.append(nn.Conv1d(2 * embed_size, c, k))def forward(self, inputs):# 沿着向量维度将两个嵌入层连结起来,# 每个嵌入层的输出形状都是(批量大小,词元数量,词元向量维度)连结起来embeddings = torch.cat((self.embedding(inputs), self.constant_embedding(inputs)), dim=2)# 根据一维卷积层的输入格式,重新排列张量,以便通道作为第2维embeddings = embeddings.permute(0, 2, 1)# 每个一维卷积层在最大时间汇聚层合并后,获得的张量形状是(批量大小,通道数,1)# 删除最后一个维度并沿通道维度连结encoding = torch.cat([torch.squeeze(self.relu(self.pool(conv(embeddings))), dim=-1)for conv in self.convs], dim=1)outputs = self.decoder(self.dropout(encoding))return outputs

让我们创建一个textCNN实例。它有3个卷积层,卷积核宽度分别为3、4和5,均有100个输出通道。

embed_size, kernel_sizes, nums_channels = 100, [3, 4, 5], [100, 100, 100]
devices = d2l.try_all_gpus()
net = TextCNN(len(vocab), embed_size, kernel_sizes, nums_channels)def init_weights(m):if type(m) in (nn.Linear, nn.Conv1d):nn.init.xavier_uniform_(m.weight)net.apply(init_weights)

加载预训练词向量

我们加载预训练的100维GloVe嵌入作为初始化的词元表示。这些词元表示(嵌入权重)在embedding中将被训练,在constant_embedding中将被固定。

glove_embedding = d2l.TokenEmbedding('glove.6b.100d')
embeds = glove_embedding[vocab.idx_to_token]
net.embedding.weight.data.copy_(embeds)
net.constant_embedding.weight.data.copy_(embeds)
net.constant_embedding.weight.requires_grad = False

训练和评估模型

现在我们可以训练textCNN模型进行情感分析。

lr, num_epochs = 0.001, 5
trainer = torch.optim.Adam(net.parameters(), lr=lr)
loss = nn.CrossEntropyLoss(reduction="none")
d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs, devices)

运行结果:

loss 0.064, train acc 0.979, test acc 0.873
138.7 examples/sec on [device(type=‘cpu’)]

运行图片:
在这里插入图片描述

下面,我们使用训练好的模型来预测两个简单句子的情感。

d2l.predict_sentiment(net, vocab, 'this movie is so great')

预测结果:

‘positive’

d2l.predict_sentiment(net, vocab, 'this movie is so bad')

预测结果:

‘negative’

小结

1、一维卷积神经网络可以处理文本中的局部特征,例如n元语法。
2、多输入通道的一维互相关等价于单输入通道的二维互相关。
3、最大时间池化层允许在不同通道上使用不同数量的时间步长。
4、textCNN模型使用一维卷积层和最大时间池化层将单个词元表示转换为下游应用输出。

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

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

相关文章

SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程

首先,如果在某个类或某个方法被标记为Transactional时,Spring boot底层会在创建这个bean时生成代理对象(默认使用cglib) 示例: 当调用studentService的addStudent方法时,会直接跳到CglibAopProxy类去执行intercept方…

jenkins 安装nodejs 14

参考: jenkins容器安装nodejs-前端问答-PHP中文网

VR漫游:720度实景参观,打造魅力生态小区

随着城市的不断发展,小区的建设越发具有生态化、绿色化的特点,人们也会偏向选择更加适合居住的小区。为了让更多的用户体验小区的舒适性,不少地产开发商准备引入VR漫游技术。 VR漫游不仅能够真实地展示现场环境,还可以改变传统网络…

【大虾送书第六期】搞懂大模型的智能基因,RLHF系统设计关键问答

目录 ✨1、RLHF是什么? ✨2、RLHF适用于哪些任务? ✨3、RLHF和其他构建奖励模型的方法相比有何优劣? ✨4、什么样的人类反馈才是好的反馈 ✨5、RLHF算法有哪些类别,各有什么优缺点? ✨6、RLHF采用人类反馈会带来哪些局…

Android13新特性之通知权限提升

Android13新特性之通知权限提升 随着移动通信的高速发展,保障通信的安全性变得尤为重要。在Android 13的最新版本中,通知权限的管理得到了进一步加强。为了实现安全的通信和确保用户的隐私,必须正确申请通知权限。本文将详细探讨如何在Andro…

人类反馈强化学习RLHF;微软应用商店推出AI摘要功能

🦉 AI新闻 🚀 微软应用商店推出AI摘要功能,快速总结用户对App的评价 摘要:微软应用商店正式推出了AI摘要功能,该功能能够将数千条在线评论总结成一段精练的文字,为用户选择和下载新应用和游戏提供参考。该…

excel常见的数学函数篇2

一、数学函数 1、ABS(number):返回数字的绝对值 语法:ABS(数字);返回数字的绝对值;若引用单元格,把数字换为单元格地址即可 2、INT(number):向小取整 语法:INT(数字);若引用单元格…

神经网络基础-神经网络补充概念-14-逻辑回归中损失函数的解释

概念 逻辑回归损失函数是用来衡量逻辑回归模型预测与实际观测之间差异的函数。它的目标是找到一组模型参数,使得预测结果尽可能接近实际观测。 理解 在逻辑回归中,常用的损失函数是对数似然损失(Log-Likelihood Loss)&#xff…

ES:一次分片设计问题导致的故障

### 现象: 1. 单节点CPU持续高 2.写入骤降 3.线程池队列积压,但没有reject 4.使用方没有记录日志 ### 排查 1.ES监控 只能看到相应的结果指标,无法反应出原因。 2.ES日志:大量日志打印相关异常(routate等调用栈&a…

RabbitMq:Topic exchange(主题交换机)的理解和使用

RabbitMq:Topic exchange(主题交换机)的理解和使用 在RabbitMq中,生产者的消息都是通过交换机来接收,然后再从交换机分发到不同的队列中去,在分发的过程中交换机类型会影响分发的逻辑,下面主要讲解一下主题交换机。 ​ 主题交换…

渗透测试之逻辑漏洞

文章目录 一、支付漏洞1.修改附属值2.多重替换支付3.重复支付4.最小额支付5.最大值支付6.越权支付7.无限制试用8.多线程并发9.支付漏洞思路 二、密码找回漏洞1.本地验证绕过2.利用session重新绑定客户3.去掉验证参数绕过4.总结 三、短信验证码绕过1.短信验证码生命期限内可暴力…

【Java基础教程】(二十二)Java新特性篇 · 第二讲:foreach循环——概念及优缺点、使用方式及应用场景~

Java基础教程之新特性 foreach循环 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用及应用场景🌾 总结 1️⃣ 概念 Java的 foreach 特性最初出现在JDK 1.5中,也被称为“增强的for循环”。它的设计目的是提供一种简洁、易读的语法,用于遍历集合或数组…

一个WPF开发的、界面简洁漂亮的音频播放器

项目简介 这是一个基于C# WPF开发的,界面外观简洁大方,操作体验良好的音频播放器。 支持各种音频格式,包括:MP4、WMA、OGG、FLAC、M4A、AAC、WAV、APE 和 OPUS;支持标记、实时显示歌词等功能;支持换肤、…

深入解析:如何打造高效的直播视频美颜SDK

在当今数字化时代,视频直播已经成为人们交流、娱乐和信息传递的重要方式。然而,许多人在直播时都希望能够呈现出最佳的外观,这就需要高效的直播视频美颜技术。本文将深入解析如何打造高效的直播视频美颜SDK,以实现令人满意的视觉效…

【0815作业】搭建select的TCP客户端、poll客户端、tftp文件上传

IO多路复用(重点!!!) 进程中如果同时需要处理多路输入输出流,在使用单进程单线程的情况下,同时处理多个输入输出请求。在无法用多进程多线程,可以选择用IO多路复用;由于不…

6个主流的工业3D管道设计软件

3D 管道设计软件是大多数行业工程工作的主要部分,例如: 电力、石油和天然气、石化、炼油厂、纸浆和造纸、化学品和加工业。 全球各工程公司使用了近 50 种工厂或管道设计软件。 每个软件都有优点和缺点,包括价格点。 EPC 和业主部门当前的趋势…

会声会影和Pr哪个好?

会声会影是加拿大Corel公司制作的一款功能强大的视频编辑软件,正版英文名:Corel VideoStudio,具有图像抓取和编修功能,可以抓取,转换MV、DV、V8、TV和实时记录抓取画面文件,并提供有超过100 多种的编制功能…

MySQL卸载并重装指定版本

MySQL卸载并重装制定版本 学习新的项目,发现之前的Navicat已经失去了与现有MySQL的链接,而且版本也不适合,为了少走弯路,准备直接重装相应版本的MySQL 卸载现有MySQL 停止windows的MySQL服务,【windowsR】打开运行框…

Java性能分析中常用命令和工具

当涉及到 Java 性能分析时,有一系列强大的命令和工具可以帮助开发人员分析应用程序的性能瓶颈、内存使用情况和线程问题。以下是一些常用的 Java 性能分析命令和工具,以及它们的详细说明和示例。 以下是一些常用的性能分析命令和工具汇总: …

如何使用ChatGPT创建个性化的健身锻炼计划

ChatGPT广泛应用于各个行业,健身也不例外。 ChatGPT 在健身领域的一个常用案例是创建个性化的锻炼计划。 在要求 ChatGPT 创建锻炼计划时,简单地输入自己的目标和当前的健身水平是一个很好的开始。完成此操作后,你还可以使用其他提示和措施来…