首页 > 其他分享 >基于代码一步一步教你深度学习中循环神经网络(RNN)的原理

基于代码一步一步教你深度学习中循环神经网络(RNN)的原理

时间:2024-01-07 22:31:41浏览次数:43  
标签:字符 RNN 一步 神经网络 input hidden 文本 size


当谈到基于RNN(循环神经网络)的机器学习例子时,一个常见的任务是文本生成。RNN是一种能够处理序列数据的神经网络,它具有记忆能力。以下是一个基于RNN的文本生成例子,并给每一行添加了详细注释:

1. import torch
2. import torch.nn as nn
3. import torch.optim as optim
4.  
5. # 定义文本数据集
6. text = “Hello, how are you?”
7.  
8. # 创建字符索引映射表
9. chars = list(set(text))
10. char2idx = {c: i for i, c in enumerate(chars)}
11. idx2char = {i: c for i, c in enumerate(chars)}
12.  
13. # 将文本转换为数字序列
14. data = [char2idx[c] for c in text]

在这个例子中,我们首先定义了一个文本数据集text,它包含了要生成的文本。

接下来,我们创建了字符索引映射表。我们使用set(text)得到文本中的唯一字符,并使用enumerate为每个字符分配一个索引。char2idx是字符到索引的映射表,idx2char是索引到字符的映射表。

然后,我们将文本转换为数字序列。通过遍历文本中的每个字符,并使用char2idx将字符映射为对应的索引,得到一个数字序列作为我们模型的输入。


1. # 定义RNN模型
2. class RNN(nn.Module):
3.     def init(self, input_size, hidden_size, output_size):
4.         super(RNN, self).init()
5.         self.hidden_size = hidden_size
6.         self.embedding = nn.Embedding(input_size, hidden_size)
7.         self.rnn = nn.RNN(hidden_size, hidden_size)
8.         self.fc = nn.Linear(hidden_size, output_size)
9.  
10.     def forward(self, x, hidden):
11.         x = self.embedding(x)
12.         x, hidden = self.rnn(x, hidden)
13.         x = self.fc(x)
14.         return x, hidden

接下来,我们定义了一个RNN模型。这个模型继承自nn.Module,并在init方法中定义了模型的各个层次和参数。模型包括一个嵌入层(embedding),一个RNN层(rnn),和一个线性层(fc)。在前向传播过程中,我们将输入张量通过嵌入层转换为向量表示,然后通过RNN层处理序列并输出隐藏状态,最后通过线性层映射隐藏状态到输出空间。


1. # 定义模型参数
2. input_size = len(chars)
3. hidden_size = 32
4. output_size = len(chars)
5.  
6. # 实例化模型和损失函数
7. rnn = RNN(input_size, hidden_size, output_size)
8. criterion = nn.CrossEntropyLoss()
9. optimizer = optim.Adam(rnn.parameters(), lr=0.01)

然后,我们定义了模型的参数,包括输入大小(字符的种类数)、隐藏层大小、输出大小(字符的种类数)。

接着,我们实例化了RNN模型,并定义了损失函数和优化器。在这个例子中,我们使用交叉熵损失函数(nn.CrossEntropyLoss())和Adam优化器(optim.Adam())。


1. # 训练模型
2. num_epochs = 100
3. hidden = None
4. for epoch in range(num_epochs):
5.     inputs = torch.tensor(data[:-1]).unsqueeze(0)
6.     targets = torch.tensor(data[1:]).unsqueeze(0)
7. 
8.     optimizer.zero_grad()
9. 
10.     outputs, hidden = rnn(inputs, hidden)
11.     loss = criterion(outputs.squeeze(), targets.squeeze())
12.     loss.backward()
13.     optimizer.step()
14.  
15.     if (epoch+1) % 10 == 0:
16.         print(f‘Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}’)

在训练阶段,我们使用数据进行多个epoch的训练。每个epoch中,我们首先将输入序列和目标序列加载到模型中。然后,我们将梯度缓存清零(通过optimizer.zero_grad()),执行前向传播、计算损失和反向传播,并通过优化器更新模型的参数。我们还打印出每个epoch的损失。


1. # 生成文本
2. with torch.no_grad():
3.     input_char = text[0]
4.     result = input_char
5.     hidden = None
6. 
7.     for _ in range(len(text)-1):
8.         input_idx = torch.tensor(char2idx[input_char]).unsqueeze(0)
9.         output, hidden = rnn(input_idx, hidden)
10.         _, top_idx = torch.max(output.squeeze(), dim=1)
11.         predicted_char = idx2char[top_idx.item()]
12.         result += predicted_char
13.         input_char = predicted_char
14.  
15. print(“Generated Text:”, result)

在生成文本阶段,我们使用训练好的模型进行文本生成。我们从初始字符开始,迭代地将字符索引输入到模型中,获取模型的输出并选择最高分数对应的字符作为预测结果。然后,我们将预测字符添加到结果中,并将预测字符作为下一个时间步的输入,继续迭代生成下一个字符,直到生成与原始文本长度相同的文本序列。

最后,我们打印出生成的文本结果。

这个基于RNN的文本生成例子展示了如何使用深度学习来生成具有一定连贯性的文本。通过构建一个简单的RNN模型并进行训练,我们能够生成类似于原始文本的新文本序列。

标签:字符,RNN,一步,神经网络,input,hidden,文本,size
From: https://blog.51cto.com/u_14682436/9135342

相关文章

  • 鱼类识别Python+深度学习人工智能+TensorFlow+卷积神经网络算法
    一、介绍鱼类识别系统。使用Python作为主要编程语言开发,通过收集常见的30种鱼类('墨鱼','多宝鱼','带鱼','石斑鱼','秋刀鱼','章鱼','红鱼','罗非鱼','胖头鱼','草鱼','银鱼','青鱼','马头鱼'......
  • 从RNN到Transformmer
    下面是整理的一个思维导图2010年Mikolov提出了RNN网络,RNN网络存在长距离依赖(梯度消失),计算效率(RNN难以并行)两个问题2017年Transformmer网络结构问世,Transformer网络架构架构由AshishVaswani等人在AttentionIsAllYouNeed一文中提出,并用于机器翻译任务,和以往网络架构......
  • 《python神经网络读书笔记》
    感想:人工智能是一门古老的学科,意思是人为的创造出和人类相似的智能体。在很多科幻影视作品中都有描述,甚至有的影视作品中不是使用计算机来实现人工智能。但是实际上这门学科在21世纪之前一直没什么进展。20世纪时,这门学科的主要研究方向是通过写一些强制判断逻辑来模拟智能体。......
  • 特斯拉神经网络初探
     先递上特斯拉的AI模型HydraNets(2020)  2022年,特斯拉宣布将在其自动驾驶车辆中发布一种全新的算法:OccupancyNetworks,主要用来解决以下两个问题:问题1:检测到的物体不是数据集中训练的对象;问题2:在基于LiDAR的系统中,可以根据检测到的物体确定对象的存在但在计算机视觉系统......
  • 卷积神经网络在图像分割与段落中的应用
    1.背景介绍卷积神经网络(ConvolutionalNeuralNetworks,CNNs)是一种深度学习算法,它在图像处理领域取得了显著的成功。在这篇文章中,我们将探讨卷积神经网络在图像分割和段落检测领域的应用。图像分割是将图像划分为多个部分,以表示图像中的各个对象或区域。段落检测是识别图像中的段......
  • 深度学习的基础知识:从线性回归到卷积神经网络
    1.背景介绍深度学习是人工智能领域的一个重要分支,它旨在模仿人类大脑中的学习和认知过程,以解决复杂的问题。深度学习的核心思想是通过多层次的神经网络来学习数据的复杂结构,从而实现自主地对输入数据进行抽象、表示和理解。深度学习的发展历程可以分为以下几个阶段:1980年代:深度学习......
  • 深度学习的基础:从线性回归到卷积神经网络
    1.背景介绍深度学习是一种人工智能技术,它旨在模仿人类大脑中的学习过程,以解决复杂的问题。深度学习的核心是神经网络,这些网络由多层节点组成,每一层节点都可以进行数据处理和学习。深度学习已经应用于多个领域,包括图像识别、自然语言处理、语音识别和游戏等。在本文中,我们将从线性回......
  • 想快人一步!不得不看的《鸿蒙(HarmonyOS)学习指南》
    鸿蒙就是鸿蒙,安卓就是安卓据鸿蒙产业链人士透露,华为下一代鸿蒙5.0版本或将不再兼容安卓系统,此举意味着鸿蒙系统将退出Android生态圈,华为手机也将只支持鸿蒙系统应用。今后国内手机操作系统,将形成由安卓与iOS两大阵营演变成Android、iOS、Harmony三分天下的局面。随着鸿蒙发展速度越......
  • 新规施行推动数据资产化迈出关键一步
    《经济参考报》1月2日刊发文章《新规施行推动数据资产化迈出关键一步》。文章称,2024年1月1日起,《企业数据资源相关会计处理暂行规定》(下称《暂行规定》)正式施行。《暂行规定》明确数据资源的确认范围和会计处理适用准则等。业内人士表示,这是推动数据资产化和数据要素发展的关键一步......
  • 【史上最本质】序列模型:RNN、双向 RNN、LSTM、GRU、Seq-to-Seq、束搜索、Transformer
    序列模型:RNN、双向RNN、LSTM、GRU、Seq-to-Seq、束搜索、Transformer、Bert序列模型是啥RNN结构双向RNN长短期记忆递归神经网络LSTM门控循环单元GRU编码器-解码器Seq-to-SeqBeamSearch束搜索:选择最佳翻译结果TransformerBert 序列模型是啥序列数据是,按照时间顺序或者某......