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

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

时间:2023-12-28 14:02:11浏览次数:29  
标签:字符 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/9014268

相关文章

  • 神经网络优化篇:详解归一化输入(Normalizing inputs)
    归一化输入训练神经网络,其中一个加速训练的方法就是归一化输入。假设一个训练集有两个特征,输入特征为2维,归一化需要两个步骤:零均值归一化方差;希望无论是训练集和测试集都是通过相同的\(μ\)和\(σ^2\)定义的数据转换,这两个是由训练集得出来的。第一步是零均值化,\(\mu......
  • 深度Q神经网络(DQN)
    有了上节课值函数近似的铺垫,这节课就来到了DQN,推开了深度强化学习的大门为什么要学习DQN呢,为什么一定要有神经网络的参与呢,AI的发展肯定是为了帮助人类去完成一些事情,而人类的世界是很复杂的,很抽象的,不可能你几个数据就能训练出一个很厉害的模型,所以你需要上百万甚至不止的数据,......
  • 自然语言处理与神经网络的结合
    1.背景介绍自然语言处理(NLP)是计算机科学与人工智能领域的一个分支,研究如何让计算机理解、生成和处理人类语言。自然语言处理的主要任务包括文本分类、情感分析、命名实体识别、语义角色标注、语言模型、机器翻译、语音识别、语音合成等。自然语言处理的一个重要方向是基于神经网络......
  • 神经网络优化的时间序列预测和序列生成
    1.背景介绍时间序列预测和序列生成是一类重要的问题,它们的核心是利用过去的数据来预测未来的数据。传统的方法包括ARIMA、ExponentialSmoothing等,但随着深度学习技术的发展,神经网络也成为了一种非常有效的方法。本文将介绍神经网络优化的时间序列预测和序列生成的核心概念、算法原......
  • 循环层神经网络在图像识别中的应用与实践
    1.背景介绍循环层神经网络(RecurrentNeuralNetworks,RNN)是一种人工神经网络,可以处理序列数据,如自然语言、音频、视频等。在图像识别领域,循环层神经网络在传统的卷积神经网络(ConvolutionalNeuralNetworks,CNN)之上,可以提高模型的表现。图像识别是计算机视觉领域的一个重要分支,它涉及......
  • 神经网络优化篇:详解其他正则化方法(Other regularization methods)
    其他正则化方法除了\(L2\)正则化和随机失活(dropout)正则化,还有几种方法可以减少神经网络中的过拟合:一.数据扩增假设正在拟合猫咪图片分类器,如果想通过扩增训练数据来解决过拟合,但扩增数据代价高,而且有时候无法扩增数据,但可以通过添加这类图片来增加训练集。例如,水平翻转图片,并......
  • PyTorch 中的卷积神经网络: 原理与实践
    1.背景介绍卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一种深度学习模型,主要应用于图像处理和计算机视觉领域。它的核心思想是利用卷积层来提取图像中的特征,然后通过全连接层进行分类或回归预测。在过去的几年里,CNN已经取得了巨大的成功,如图像分类、对象检测、自然语言处理等......
  • RNN语言模型的最新进展与未来趋势
    1.背景介绍自从2010年的深度学习革命以来,深度学习技术已经成为人工智能领域的核心技术之一,其中自然语言处理(NLP)也是其中的一个重要应用领域。在NLP中,语言模型是一个非常重要的组件,它用于预测给定上下文的下一个词。传统的语言模型如N-gram模型和条件随机场(CRF)模型已经被深度学习中......
  • RNN vs. CNN vs. 深度神经网络:比较与应用
    1.背景介绍深度学习是人工智能领域的一个热门话题,其中之一最为重要的技术就是神经网络。在过去的几年里,我们已经看到了许多不同类型的神经网络,如卷积神经网络(CNN)、循环神经网络(RNN)和深度神经网络(DNN)等。在这篇文章中,我们将讨论这三种神经网络的区别以及它们在不同应用中的优势。首......
  • P5333 [JSOI2019] 神经网络
    题面传送门本来以为\(m\)这么小是\(m\sumk_i\logk\)的NTT的,写完发现一点不用(首先我们发现,这样的图上面的一个哈密顿回路可以表示成原森林若干条链,每个点都在其中一条链上,且相邻两条链不在同一棵树上。先跑一个DP把\(f_{i,j}\)表示用\(j\)条链覆盖\(i\)的方案数......