RNN--详解

RNN

1. 概述

循环神经网络 (Recurrent Neural Network, RNN) 是一种专门用于处理序列数据的神经网络模型。与传统的前馈神经网络不同,RNN 具有循环结构,能够处理时间序列和其他顺序依赖的数据。其关键在于可以利用前一个时刻的信息,通过隐状态 (Hidden State) 在时间步长上进行传递,从而具有记忆性。

2. RNN 的基本结构

RNN的核心在于处理序列数据时,每个时间步 (time step) 的输入不仅会影响当前的输出,还会影响下一时间步的输入。其网络结构如下:

  • 输入层 (Input Layer):序列数据中的每个元素会逐步输入神经网络,每个时间步对应一个输入。

  • 隐藏层 (Hidden Layer):在每个时间步,隐藏层的输出不仅依赖当前的输入,还依赖前一时间步的隐藏层状态。隐藏状态通过时间步传播,从而使网络具备记忆力。

  • 输出层 (Output Layer):每个时间步的输出可以是即时的(每个时间步输出),或者在最后的时间步产生整体输出。

3.相关代码实现

使用 PyTorch 来实现一个基本的 RNN 模型,并应用于文本分类任务(例如,情感分类)。代码包括数据预处理、模型构建、训练和分析。

1. 数据预处理

在文本处理中,我们通常需要将文本数据转换为数值形式,如单词的索引或词向量。为了简化,将使用 TorchText 来处理文本数据。

数据预处理示例代码:
import torch
import torch.nn as nn
import torch.optim as optim
from torchtext.legacy import data, datasets
​
# 设置随机种子以确保结果可重复
torch.manual_seed(1234)
​
# 定义字段,TEXT 用于存储文本数据,LABEL 用于存储标签
TEXT = data.Field(tokenize='spacy', tokenizer_language='en_core_web_sm', include_lengths=True)
LABEL = data.LabelField(dtype=torch.float)
​
# 加载IMDB数据集,数据集包含影评文本和情感标签
train_data, test_data = datasets.IMDB.splits(TEXT, LABEL)
​
# 构建词汇表,使用预训练的词向量(GloVe)
TEXT.build_vocab(train_data, max_size=25000, vectors="glove.6B.100d", unk_init=torch.Tensor.normal_)
LABEL.build_vocab(train_data)
​
# 创建迭代器
BATCH_SIZE = 64
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
​
train_iterator, test_iterator = data.BucketIterator.splits((train_data, test_data), batch_size=BATCH_SIZE, sort_within_batch=True,device=device)

2. RNN 模型定义

下面的代码定义了一个基本的 RNN 模型。使用一个嵌入层和一个简单的 RNN 层来对文本进行分类。输出的隐藏状态将传递到全连接层来预测情感标签。

模型定义代码:
class RNN(nn.Module):def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, n_layers, bidirectional, dropout):super().__init__()# 嵌入层self.embedding = nn.Embedding(input_dim, embedding_dim)# RNN层self.rnn = nn.RNN(embedding_dim, hidden_dim, num_layers=n_layers, bidirectional=bidirectional, dropout=dropout)# 全连接层self.fc = nn.Linear(hidden_dim * 2 if bidirectional else hidden_dim, output_dim)# Dropoutself.dropout = nn.Dropout(dropout)def forward(self, text, text_lengths):# text: [sent_len, batch_size]# 嵌入embedded = self.dropout(self.embedding(text))# 打包,RNN 可以处理不同长度的序列packed_embedded = nn.utils.rnn.pack_padded_sequence(embedded, text_lengths.to('cpu'))packed_output, hidden = self.rnn(packed_embedded)# 解包output, output_lengths = nn.utils.rnn.pad_packed_sequence(packed_output)# 只使用最后的隐藏状态hidden = self.dropout(hidden[-1,:,:])return self.fc(hidden)
​
# 初始化模型
INPUT_DIM = len(TEXT.vocab)
EMBEDDING_DIM = 100
HIDDEN_DIM = 256
OUTPUT_DIM = 1
N_LAYERS = 2
BIDIRECTIONAL = True
DROPOUT = 0.5
​
model = RNN(INPUT_DIM, EMBEDDING_DIM, HIDDEN_DIM, OUTPUT_DIM, N_LAYERS, BIDIRECTIONAL, DROPOUT)

3. 模型训练

接下来定义损失函数和优化器,并进行模型的训练。由于这是一个二分类问题,使用二元交叉熵损失函数。

训练代码:
# 使用预训练的词向量初始化嵌入层
pretrained_embeddings = TEXT.vocab.vectors
model.embedding.weight.data.copy_(pretrained_embeddings)
​
# 定义损失函数和优化器
optimizer = optim.Adam(model.parameters())
criterion = nn.BCEWithLogitsLoss()
​
model = model.to(device)
criterion = criterion.to(device)
​
# 计算准确率
def binary_accuracy(preds, y):rounded_preds = torch.round(torch.sigmoid(preds))correct = (rounded_preds == y).float()acc = correct.sum() / len(correct)return acc
​
# 训练函数
def train(model, iterator, optimizer, criterion):epoch_loss = 0epoch_acc = 0model.train()for batch in iterator:optimizer.zero_grad()text, text_lengths = batch.textpredictions = model(text, text_lengths).squeeze(1)loss = criterion(predictions, batch.label)acc = binary_accuracy(predictions, batch.label)loss.backward()optimizer.step()epoch_loss += loss.item()epoch_acc += acc.item()return epoch_loss / len(iterator), epoch_acc / len(iterator)
​
# 测试函数
def evaluate(model, iterator, criterion):epoch_loss = 0epoch_acc = 0model.eval()with torch.no_grad():for batch in iterator:text, text_lengths = batch.textpredictions = model(text, text_lengths).squeeze(1)loss = criterion(predictions, batch.label)acc = binary_accuracy(predictions, batch.label)epoch_loss += loss.item()epoch_acc += acc.item()return epoch_loss / len(iterator), epoch_acc / len(iterator)
​
# 开始训练
N_EPOCHS = 5
for epoch in range(N_EPOCHS):train_loss, train_acc = train(model, train_iterator, optimizer, criterion)test_loss, test_acc = evaluate(model, test_iterator, criterion)print(f'Epoch: {epoch+1}')print(f'\tTrain Loss: {train_loss:.3f} | Train Acc: {train_acc*100:.2f}%')print(f'\tTest Loss: {test_loss:.3f} | Test Acc: {test_acc*100:.2f}%')

4. 模型分析

通过训练和测试结果,可以观察模型在情感分类任务上的表现。进一步使用混淆矩阵、分类报告等工具来分析模型性能。

模型分析示例代码:
from sklearn.metrics import classification_report
​
# 预测函数
def predict_sentiment(model, sentence):model.eval()tokenized = [tok.text for tok in nlp.tokenizer(sentence)]indexed = [TEXT.vocab.stoi[t] for t in tokenized]length = [len(indexed)]tensor = torch.LongTensor(indexed).to(device)tensor = tensor.unsqueeze(1)length_tensor = torch.LongTensor(length)prediction = torch.sigmoid(model(tensor, length_tensor))return prediction.item()
​
# 示例测试
test_sentence = "This movie is absolutely wonderful!"
prediction = predict_sentiment(model, test_sentence)
print(f"Sentiment score: {prediction}")

5. 代码分析

  1. 数据预处理:使用 TorchText 来加载数据,并将文本数据转换为索引。我们使用 GloVe 预训练词向量来初始化嵌入层。

  2. RNN 模型:定义了一个带双向(Bidirectional)的 RNN 模型。该模型包含嵌入层、RNN 层和全连接层,用于情感分类任务。

  3. 模型训练:使用 Adam 优化器和二元交叉熵损失函数对模型进行训练,并通过准确率评估性能。

  4. 模型分析:可以通过预测情感分数来进一步分析模型的表现。

通过这些步骤,实现了一个完整的文本处理流水线,使用 RNN 对影评数据进行情感分类。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【工作流引擎集成】springboot+Vue+activiti+mysql带工作流集成系统,直接用于业务开发,流程设计,工作流审批,会签

前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,流行的前后端…

Case:cocos地图和网格初始化

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言非盈利博客,只是学习笔记,如有雷同,十分抱歉。 一、生成一个100*100的网格背景代码分析导入必要的模块定义装饰器和类类定义…

c++继承(下)

c继承(下) (1)继承与友元(2)继承与静态成员(3)多继承及其菱形继承问题3.1 继承模型3.2 虚继承3.3 多继承中指针偏移问题 (4)继承和组合(9&#xf…

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型)

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型) 目录 Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型) 1. 项目说明 2. 数据说明 (1)心跳信号分类预测数据集 3. 模型训练 (1)项目安装 &am…

大模型项目如何判断用RAG还是微调

大模型项目如何判断用RAG还是微调 在大模型项目中,选择使用检索增强生成(Retrieval-Augmented Generation, RAG)还是微调(Fine-Tuning)取决于多个因素,包括项目的具体需求、数据的可用性、性能要求、成本和…

jQuery——平滑翻页

平滑翻页 param next true:下一页 false:下一页 本文分享到此结束,欢迎大家评论区相互讨论学习,下一篇继续分享jQuery中循环翻页的学习。

自动驾驶传感器系列—自动驾驶中的“眼睛”:摄像头技术详解

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

字节放大招:无需LORA训练,小红书写真轻松搞定,Pulid-Flux换脸方案来了

前言 在这之前,SD常用的换脸节点还不支持Flux模型,使用Flux 做虚拟模特最好的方法是炼制人脸lora,但是炼丹是个有技术门槛的活。 之前文章有提过字节跳动的 Pulid团队,率先推出了Pulid-Flux模型,但是之前只能在线上使用…

这些编程工具竟然能让我效率翻倍?开发者必备神器盘点!

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

【STL】stack模拟实现

stack模拟实现比较简单&#xff0c;就是直接调用deque的函数即可。 具体实现&#xff1a; #pragma once#include<deque> #include<iostream>using std::istream; using std::ostream; using std::endl; using std::cout;namespace zyy { //stack -> 后进先出t…

美客多测评系统:批量注册买家号的新利器

美客多&#xff08;MercadoLibre&#xff09;测评系统作为一种在跨境电商领域广泛应用的策略&#xff0c;其核心在于通过批量注册并管理买家账号&#xff0c;模拟真实用户的购物行为&#xff0c;以提升产品的销量、评价数量和店铺权重。以下是对美客多测评系统中批量注册买家号…

数字化转型的实践路径:如何运用TOGAF框架推动企业变革

数字化转型的迫切性与挑战 随着技术的飞速发展和全球市场的快速变化&#xff0c;数字化转型已经成为企业提高竞争力、推动创新、提升运营效率的核心战略。然而&#xff0c;数字化转型并不是简单的技术升级&#xff0c;它涉及到从业务模式、组织结构到技术架构的全面变革。企业…

为什么营业执照显示经营异常

经营异常是怎么回事&#xff1f;是什么意思&#xff1f;1、年报未依照正常的时间公示或者某些要素没有公示;2、营业执照的地址与实际的地址不符&#xff0c;该地址联络不到人。经营异常不处理有什么后果&#xff1f;有什么影响&#xff1f;企业被列入工商异常一般会对公司的经营…

实操了 AI 大模型项目的落地过程,成功实现了向 AI 大模型工程师的华丽转变

前言 根据《2024 年全球人工智能行业报告》最新的数据显示&#xff0c;全球 AI 市场预计将以每年超过 40% 的速度增长&#xff0c;到 2030 年市值将达到数万亿美元&#xff0c;这也是预示着在接下来的十年到十五年里&#xff0c;人工智能将获得巨大的发展红利。 在过去的一年…

大语言模型入门(四)——检索增强生成(RAG)

一、什么是检索增强生成 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;由Facebook AI Research&#xff08;FAIR&#xff09;团队于2020年首次提出&#xff0c;这是一种结合了信息检索技术与语言生成模型的人工智能技术。它通过从外部知…

分词的艺术:为AI拆解文本

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Koa学习

Koa 安装与配置 1. 初始化项目 在终端中执行以下命令&#xff1a; # 创建项目文件夹 mkdir koa cd koa# 初始化并安装依赖 npm init -y npm install koa npm install nodemon --save-dev2. 修改 package.json 在 package.json 文件中进行如下修改&#xff1a; {"type…

LabVIEW提高开发效率技巧----点阵图(XY Graph)

在LabVIEW开发中&#xff0c;点阵图&#xff08;XY Graph&#xff09; 是一种强大的工具&#xff0c;尤其适用于需要实时展示大量数据的场景。通过使用点阵图&#xff0c;开发人员能够将实时数据可视化&#xff0c;帮助用户更直观地分析数据变化。 1. 点阵图的优势 点阵图&…

RabbitMQ 集群

文章目录 集群搭建使用 Docker-Compose 镜像队列搭建步骤工作原理镜像策略主从同步 同步延迟 集群搭建 参考&#xff1a; docker中安装并启动rabbitMQ Docker中搭建RabbitMQ集群 使用 Docker-Compose 这里提供一个脚本来使用 docker-compose 完成RabbitMQ集群的配置及启动…

【含开题报告+文档+PPT+源码】基于SSM + Vue的养老院管理系统【包运行成功】

开题报告 随着社会的发展和经济的进步&#xff0c;人口老龄化问题逐渐凸显。统计数据显示&#xff0c;全球范围内的老龄人口比例正在逐年上升&#xff0c;养老需求也随之增长。养老院作为提供专业养老服务的机构&#xff0c;承担着照料老人、提供医疗保健和社交活动等责任。传…