【深度学习】零基础介绍循环神经网络(RNN)
RNN介绍
- 零基础介绍
- 语言处理技术基本介绍
- 分词算法
- 词法分析工具
- 文本分类与聚类
- 情感分析
- 自然语言处理
- 词向量
- 词向量学习模型
- 1. 神经网络语言模型
- 2. CBOW 和 skip-gram
- 3. 层次化softmax方法
- 4. 负采样方法
- RNN介绍
- RNN的变种:LSTM
- 1. Forget Gate
- 2. Input Gate
- 3. Update Memory
- 4. Output Gate
- RNN的变种:GRU
- Attention 注意力机制
- RNN的应用
- 1. 序列到类别
- 2. 同步序列到序列
- (1)中文分词
- (2)命名实体识别
- 3. 异步序列到序列
- (1)机器翻译
- (2)对话系统
- 4. 看图说话
- 5. 自动摘要
- 6. 自动写诗
- 7. 自动作曲
- RNN代码
- 一个简单的RNN代码
- 电影评论情感分析
零基础介绍
循环神经网络(RNN, Recurrent Neural Network)是一种特殊的神经网络,用于处理和分析序列数据(比如时间序列、文本、语音等)。它的特别之处在于,它能够“记住”之前的信息并用来处理当前的数据,这使得它比普通的前馈神经网络(比如卷积神经网络 CNN)更适合处理时间序列数据。
很多实际问题中,当前的输入往往和之前的数据有关系,比如:
语音识别:一个单词的发音会受到前后音节的影响。
语言翻译:一个句子的理解不仅要看当前的词,还要结合前面的词。
股票预测:当前股票的价格会受到过去价格的影响。
RNN的工作原理:
RNN的优缺点:
优点:
处理序列数据:RNN非常适合处理和预测序列数据,可以记住历史的信息,理解当前输入与过去输入之间的关系。
灵活性高:可以处理任意长度的序列,不需要固定输入长度。
缺点:
梯度消失/爆炸问题:在长时间序列中,RNN会遇到“梯度消失”或者“梯度爆炸”问题,即网络在训练时,梯度可能会变得非常小或非常大,导致学习过程困难。
训练速度慢:由于需要考虑历史信息,RNN的训练过程通常比普通神经网络慢。
RNN的变种:
为了克服RNN的一些缺点,研究者提出了一些变种模型,最常见的有:
长短期记忆网络(LSTM, Long Short-Term Memory):通过引入“门控机制”,LSTM能够更好地处理长时间依赖问题,避免梯度消失问题。
门控循环单元(GRU, Gated Recurrent Unit):GRU是LSTM的一个简化版本,同样可以有效处理长时间依赖问题,但结构更简单。
语言处理技术基本介绍
分词算法
词法分析工具
文本分类与聚类
情感分析
自然语言处理
词向量
词向量学习模型
1. 神经网络语言模型
2. CBOW 和 skip-gram
3. 层次化softmax方法
4. 负采样方法
RNN介绍
传统的前馈神经网络(Feedforward Neural Network,简称 FNN),其中最常见的一种形式就是 多层感知器(Multilayer Perceptron,简称 MLP)
自然语言处理(NLP, Natural Language Processing)
MLP是典型的前馈神经网络,在输入层和输出层之间没有任何循环结构。它的每个输入都独立处理,无法处理序列数据和时间依赖关系。而RNN能够通过隐藏状态和递归结构处理时序数据,捕捉序列中的上下文信息。
MLP适合处理独立的输入数据(如静态图像分类、非时序特征等),而RNN更适合处理有时间依赖的序列数据(如文本生成、机器翻译、语音识别等)。
引入RNN:
于是引入 LSTM
RNN的变种:LSTM
STM引入了三个门控(输入门、遗忘门和输出门)来控制信息的流动:
遗忘门(Forget Gate):决定上一时刻的记忆单元状态有多少需要被“忘记”。
输入门(Input Gate):决定当前输入有多少需要被写入记忆单元。
输出门(Output Gate):决定当前的记忆单元状态对输出的贡献
1. Forget Gate
2. Input Gate
3. Update Memory
4. Output Gate
RNN的变种:GRU
GRU是LSTM的一种简化版本,只有两个门(更新门和重置门):
更新门(Update Gate):控制当前隐藏状态的更新程度。
重置门(Reset Gate):决定当前输入与过去的隐藏状态结合的程度。
Attention 注意力机制
RNN的应用
1. 序列到类别
2. 同步序列到序列
(1)中文分词
(2)命名实体识别
3. 异步序列到序列
(1)机器翻译
(2)对话系统
4. 看图说话
5. 自动摘要
6. 自动写诗
7. 自动作曲
RNN代码
一个简单的RNN代码
每10个训练周期会打印出损失值,训练完成后,图表会显示模型的预测结果和真实的正弦曲线对比。
(使用均方误差损失函数(MSELoss)来计算模型的误差,优化器选择了Adam。)
import torch
import torch.nn as nn
import torch.optim as optim# 定义一个简单的RNN模型
class SimpleRNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleRNN, self).__init__()self.hidden_size = hidden_size# 定义RNN层self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)# 定义输出层self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):# 初始化隐藏状态(初始时刻为0)h0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device)# 通过RNN层得到输出和最终的隐藏状态out, hn = self.rnn(x, h0)# 获取最后一个时刻的输出out = out[:, -1, :]# 通过输出层得到预测结果out = self.fc(out)return out# 超参数设置
input_size = 1 # 每个时间步的输入特征数(例如,序列中的每个元素)
hidden_size = 5 # 隐藏层的大小
output_size = 1 # 输出的特征数
learning_rate = 0.01 # 学习率
num_epochs = 100 # 训练的轮数# 构造一个简单的序列输入(比如一个简单的正弦波或者线性序列)
x_train = torch.linspace(0, 10, steps=100).view(-1, 1, 1) # 100个时间步,每个时间步的输入是一个1维数据
y_train = torch.sin(x_train).view(-1, 1) # 正弦函数作为目标输出# 创建RNN模型
model = SimpleRNN(input_size, hidden_size, output_size)# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 训练模型
for epoch in range(num_epochs):model.train()# 前向传播outputs = model(x_train)# 计算损失loss = criterion(outputs, y_train)# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()if (epoch+1) % 10 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')# 预测
model.eval()
with torch.no_grad():predicted = model(x_train)# 可视化结果
import matplotlib.pyplot as pltplt.plot(x_train.numpy(), y_train.numpy(), label='True')
plt.plot(x_train.numpy(), predicted.numpy(), label='Predicted')
plt.legend()
plt.show()
电影评论情感分析
使用IMDb数据集,它包含大量的电影评论,并且每条评论都已经标注为“正面”或“负面”情感。
import torch
import torch.nn as nn
import torch.optim as optim
from torchtext.datasets import IMDB
from torchtext.data import Field, BucketIterator
import random
import numpy as np
SEED = 1234
random.seed(SEED)
torch.manual_seed(SEED)
torch.backends.cudnn.deterministic = True
# 定义Field
TEXT = Field(sequential=True, lower=True, include_lengths=True)
LABEL = Field(sequential=False, use_vocab=True, is_target=True)# 加载IMDb数据集
train_data, test_data = IMDB.splits(TEXT, LABEL)# 构建词汇表
TEXT.build_vocab(train_data, max_size=25000, vectors="glove.6B.100d", unk_init=torch.Tensor.normal_)
LABEL.build_vocab(train_data)# 创建数据迭代器
BATCH_SIZE = 64train_iterator, test_iterator = BucketIterator.splits((train_data, test_data),batch_size=BATCH_SIZE,device=torch.device("cuda" if torch.cuda.is_available() else "cpu"),sort_within_batch=True,sort_key=lambda x: len(x.text),
)
class RNN_Sentiment(nn.Module):def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, n_layers, dropout):super(RNN_Sentiment, self).__init__()self.embedding = nn.Embedding(input_dim, embedding_dim)self.rnn = nn.RNN(embedding_dim, hidden_dim, n_layers, batch_first=True, dropout=dropout)self.fc = nn.Linear(hidden_dim, output_dim)self.dropout = nn.Dropout(dropout)def forward(self, text, text_lengths):embedded = self.embedding(text)# RNN expects packed sequencespacked_embedded = nn.utils.rnn.pack_padded_sequence(embedded, text_lengths.cpu(), batch_first=True, enforce_sorted=False)packed_output, hidden = self.rnn(packed_embedded)# Get the last hidden state (for classification)hidden = self.dropout(hidden[-1])output = self.fc(hidden)return output
# 定义超参数
INPUT_DIM = len(TEXT.vocab)
EMBEDDING_DIM = 100
HIDDEN_DIM = 256
OUTPUT_DIM = 1
N_LAYERS = 2
DROPOUT = 0.5model = RNN_Sentiment(INPUT_DIM, EMBEDDING_DIM, HIDDEN_DIM, OUTPUT_DIM, N_LAYERS, DROPOUT)# 使用预训练的GloVe词向量初始化嵌入层
model.embedding.weight.data.copy_(TEXT.vocab.vectors)# 如果有UNK和PAD的token,它们的向量应该是随机初始化
model.embedding.weight.data[TEXT.vocab.stoi[TEXT.pad_token]] = torch.zeros(EMBEDDING_DIM)
model.embedding.weight.data[TEXT.vocab.stoi[TEXT.unk_token]] = torch.randn(EMBEDDING_DIM)# 将模型转移到GPU(如果可用)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)# 定义损失函数和优化器
optimizer = optim.Adam(model.parameters())
criterion = nn.BCEWithLogitsLoss()# 将损失函数放到GPU(如果可用)
criterion = criterion.to(device)# 训练模型
def train(model, iterator, optimizer, criterion):model.train()epoch_loss = 0epoch_acc = 0for batch in iterator:text, text_lengths = batch.textlabels = batch.labeloptimizer.zero_grad()predictions = model(text, text_lengths).squeeze(1)loss = criterion(predictions, labels)acc = binary_accuracy(predictions, labels)loss.backward()optimizer.step()epoch_loss += loss.item()epoch_acc += acc.item()return epoch_loss / len(iterator), epoch_acc / len(iterator)# 计算准确率
def binary_accuracy(preds, y):rounded_preds = torch.round(torch.sigmoid(preds))correct = (rounded_preds == y).float()acc = correct.sum() / len(correct)return acc# 开始训练
N_EPOCHS = 5
for epoch in range(N_EPOCHS):train_loss, train_acc = train(model, train_iterator, optimizer, criterion)print(f'Epoch {epoch+1}, Train Loss: {train_loss:.3f}, Train Accuracy: {train_acc*100:.2f}%')
def evaluate(model, iterator, criterion):model.eval()epoch_loss = 0epoch_acc = 0with torch.no_grad():for batch in iterator:text, text_lengths = batch.textlabels = batch.labelpredictions = model(text, text_lengths).squeeze(1)loss = criterion(predictions, labels)acc = binary_accuracy(predictions, labels)epoch_loss += loss.item()epoch_acc += acc.item()return epoch_loss / len(iterator), epoch_acc / len(iterator)# 测试模型
test_loss, test_acc = evaluate(model, test_iterator, criterion)
print(f'Test Loss: {test_loss:.3f}, Test Accuracy: {test_acc*100:.2f}%')
- 数据预处理:使用torchtext加载和处理IMDb数据集。
- 模型设计:使用RNN进行文本情感分类,经过词向量嵌入、RNN层处理和全连接层输出。
- 训练和评估:通过计算损失函数和准确率来训练模型并评估其性能。
与之前的CNN比较:
相关文章:

【深度学习】零基础介绍循环神经网络(RNN)
RNN介绍 零基础介绍语言处理技术基本介绍分词算法词法分析工具文本分类与聚类情感分析 自然语言处理词向量词向量学习模型1. 神经网络语言模型2. CBOW 和 skip-gram3. 层次化softmax方法4. 负采样方法 RNN介绍RNN的变种:LSTM1. Forget Gate2. Input Gate3. Update M…...

青少年编程与数学 02-004 Go语言Web编程 13课题、模板引擎
青少年编程与数学 02-004 Go语言Web编程 13课题、模板引擎 一、模板引擎模板引擎的主要特点包括:模板引擎的应用场景:Go语言中的模板引擎:示例:使用Go的html/template包 二、工作流程1. 创建模板文件2. 准备数据3. 加载模板4. 渲染…...

如何优雅的关闭GoWeb服务器
以下内容均为Let’s Go Further内容节选以及作者本人理解。 这里创建了一个后台进程用于捕获关闭信号,在后台进程中,主要内容为: 创建一个缓冲通道 quit使用signal.Notify函数监听并捕获关机信号SIGINT,SIGTERM,在捕获关机信号后…...

AI程序员,开源的Devin,OpenHands 如何使用HuggingFace Inference API
我用了一下,界面这样子: Github:https://github.com/All-Hands-AI/OpenHands OpenHands 如何使用HuggingFace Inference API huggingface/meta-llama/Llama-3.3-70B-Instruct 而不是 meta-llama/Llama-3.3-70B-Instruct 不要设置base URL&…...

【动手学运动规划】 5.2 数值优化基础:梯度下降法,牛顿法
朕四季常服, 不过八套. — 大明王朝1566 道长 🏰代码及环境配置:请参考 环境配置和代码运行! 上一节我们介绍了数值优化的基本概念, 让大家对最优化问题有了基本的理解. 那么对于一个具体的问题, 我们应该如何求解呢? 这一节我们将介绍几个基本的求解…...

电子应用设计方案66:智能打印机系统设计
智能打印机系统设计 一、引言 随着科技的不断发展,打印机也在向智能化方向演进。智能打印机不仅能够提供高质量的打印服务,还具备便捷的操作、智能的管理和连接功能。 二、系统概述 1. 系统目标 - 实现高效、高质量的打印输出。 - 支持多种连接方式&am…...

iClient3D for Cesium 实现限高分析
作者:gaogy 1、背景 随着地理信息技术的发展,三维地球技术逐渐成为了许多领域中的核心工具,尤其是在城市规划、环境监测、航空航天以及军事领域。三维地图和场景的应用正在帮助人们更加直观地理解空间数据,提供更高效的决策支持。…...

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python
支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用,今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机(SVM)是一种监督学习算法,广泛用于分类和回归问题。 它的核心思想是通过…...

torch.unsqueeze:灵活调整张量维度的利器
在深度学习框架PyTorch中,张量(Tensor)是最基本的数据结构,它类似于NumPy中的数组,但可以在GPU上运行。在日常的深度学习编程中,我们经常需要调整张量的维度以适应不同的操作和层。torch.unsqueeze函数就是…...

【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例
预处理系统 WPS 详解:以4.5版本为例 每个 WPS 程序的功能程序1:geogrid程序2:ungrib程序3:metgrid WPS运行(Running the WPS)步骤1:Define model domains with geogrid步骤2:Extract…...

SD ComfyUI工作流 根据图像生成线稿草图
文章目录 线稿草图生成SD模型Node节点工作流程工作流下载效果展示线稿草图生成 该工作流的设计目标是将输入的图像转换为高质量的线稿风格输出。其主要流程基于 Stable Diffusion 技术,结合文本和图像条件,精确生成符合预期的线条艺术图像。工作流的核心是通过模型的条件设置…...

挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串
一 C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上ÿ…...

git中的多人协作
目录 1.1多人协作1.1.1创建仓库1.1.2协作处理1.1.3冲突处理 1.2分支推送协作1.3分支拉取协作1.4远程分支的删除 1.1多人协作 1.1.1创建仓库 新建两个文件夹,不需要初始化为git仓库,直接克隆远程仓库命名testGit1,testGit2 指定本地仓库级别…...

解决新安装CentOS 7系统mirrorlist.centos.org can‘t resolve问题
原因 mirrorlist.centos.org yum源用不了 解决办法就是 # cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo_bak # vim CentOS-Base.repoCentOS系统操作 # mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/*.repo_bak # curl -o /etc/yum.repos.d/CentOS-Linux-Ba…...

RK3588 , mpp硬编码yuv, 保存MP4视频文件.
RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ Ubuntu x64 架构, 交叉编译aarch64 FFmpeg mppRK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBRK3588 , mpp硬编码yuv, 保存MP4视频文件....

Elasticsearch:什么是查询语言?
查询语言定义 查询语言包括数据库查询语言 (database query language - DQL),是一种用于查询和从数据库检索信息的专用计算机语言。它充当用户和数据库之间的接口,使用户能够管理来自数据库管理系统 (database management system - DBMS) 的数据。 最广…...

均值聚类算法
K-均值聚类算法是一种常用的无监督学习算法,用于将数据集划分为 K 个簇。它基于以下的思想:通过计算数据点与各个簇中心之间的距离来确定数据点所属的簇,并更新簇中心来最小化簇内数据点的平方误差。K-均值算法的步骤如下: 1. 选…...

MySQL 中快速插入大量数据
在 MySQL 中快速插入大量数据(例如 20 万条记录)可以通过多种方法实现。以下是一些优化技巧和步骤,可以帮助你高效地插入大量数据: 1. 禁用索引和约束(如果可能) 在插入大量数据之前,禁用索引和…...

腾讯云智能结构化OCR:以多模态大模型技术为核心,推动跨行业高效精准的文档处理与数据提取新时代
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...

最大似然检测在通信解调中的应用
最大似然检测(Maximum Likelihood Detection,MLD),也称为最大似然序列估计(Maximum Likelihood Sequence Estimation,MLSE),是一种在通信系统中广泛应用的解调方法。其核心思想是在给…...

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能
概述 论文地址:https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具,包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息,因此从古代岩画到现代建筑图纸,素描在世界各地被用于各种用途。儿童…...

[JAVA备忘录] Lambda 表达式简单介绍
目录 前言 函数式接口 Lambda 表达式使用实例 简单示例 1. 无参数,无返回值 2. 有参数,无返回值 3. 无参数,有返回值 4. 有参数,有返回值 解释: 集合框架 1.forEach:遍历集合 2.排序࿱…...

[python]使用flask-caching缓存数据
简介 Flask-Caching 是 Flask 的一个扩展,为任何 Flask 应用程序添加了对各种后端的缓存支持。它基于 cachelib 运行,并通过统一的 API 支持 werkzeug 的所有原始缓存后端。开发者还可以通过继承 flask_caching.backends.base.BaseCache 类来开发自己的…...

裸机按键输入实验
一、硬件原理分析 按键就两个状态:按下或弹起,将按键连接到一个 IO 上,通过读取这个 IO 的值就知道按 键是按下的还是弹起的。至于按键按下的时候是高电平还是低电平要根据实际电路来判断。前 面几章我们都是讲解 I.MX6U 的 GPIO 作为输出使用…...

GaussDB运维管理工具(二)
GaussDB运维管理工具(二) 集群管理组件cm_ctl工具介绍cm_ctl工具使用查询集群状态启停集群主备切换重建备DN检测进程运行查看实例配置文件手动剔除故障CNCM参数获取和配置停止仲裁 Cluster Manager(缩写为CM)是GaussDB的集群管理工…...

【HarmonyOS之旅】HarmonyOS开发基础知识(一)
目录 1 -> 应用基础知识 1.1 -> 用户应用程序 1.2 -> 用户应用程序包结构 1.3 -> Ability 1.4 -> 库文件 1.5 -> 资源文件 1.6 -> 配置文件 1.7 -> pack.info 1.8 -> HAR 2 -> 配置文件简介 2.1 -> 配置文件的组成 3 -> 配置文…...

Mysql数据究竟是如何存储的
Mysql行列式 开篇 笔者这几日在学习mysql是这么运行的这本书,感觉书中的内容受益匪浅,想整理成自己的话分享给大家,平时大家工作和生活中可能没有时间去专心投入读取一本书,而mysql是这么运行的这本书需要投入大量的时间的学…...

STM32单片机使用CAN协议进行通信
CAN总线(控制器局域网总线) 理论知识 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 CAN总线特征 两根通信线(CAN_H、CAN_L),线路少,无需共地差分信号通信&…...

Docker 入门:如何使用 Docker 容器化 AI 项目(二)
四、将 AI 项目容器化:示例实践 - 完整的图像分类与 API 服务 让我们通过一个更完整的 AI 项目示例,展示如何将 AI 项目容器化。我们以一个基于 TensorFlow 的图像分类模型为例,演示如何将训练、推理、以及 API 服务过程容器化。 4.1 创建 …...

MVVM、MVC、MVP 的区别
MVVM(Model-View-ViewModel)、MVC(Model-View-Controller)和MVP(Model-View-Presenter)是三种常见的软件架构模式,它们在客户端应用开发中被广泛使用。每种模式都有其特定的设计理念和应用场景&…...