Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用pytorch写个RNN 循环神经网络

用pytorch写个RNN 循环神经网络

作者头像
程序猿川子
发布于 2022-10-21 09:54:12
发布于 2022-10-21 09:54:12
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

写代码之前先回顾一下RNN的计算公式:

隐藏层计算公式:

\mathbf{H}_t = \phi(\mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} + \mathbf{b}_h)Ht​=ϕ(Xt​Wxh​+Ht−1​Whh​+bh​)

输出计算公式:

\mathbf{O}_t = \mathbf{H}_t \mathbf{W}_{hq} + \mathbf{b}_qOt​=Ht​Whq​+bq

注意:之前我写过这么一篇:手动实现RNN - 掘金 (juejin.cn) 这个没有调用Pytorch的RNN,是自己从零开始写的。本文是调用了人家现成的RNN,两篇文章虽然都是RNN的代码实现,但是二者有本质区别。


代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l

python人必备导包技术,这段代码不用解释吧。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
batch_size, num_steps =32,35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
num_hiddens = 256
rnn_layer = nn.RNN(len(vocab), num_hiddens)
  • 设置批量大小batch_size和时间步长度num_step,时间步长度就是可以想象成一个样本中RNN要计算的时间步长度是32。
  • d2l.load_data_time_machine加载数据集。 注意:这里为了方便,加载数据集时候进行数据预处理,使用的是长度为28的语料库词汇表,不是单词表。词汇表是a~z的字母外加 空格 和<unk>。
  • 设置隐藏层大小的256
  • 在这里RNN层直接使用pytorch提供的RNN。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
state = torch.zeros((1, batch_size, num_hiddens))
state.shape
  • 使用torch.zeros用零向量初始化隐状态。隐状态是三维的,形状是隐状态层数、批量大小、隐藏层大小。
  • RNN隐状态计算\mathbf{H}_t = \phi(\mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} + \mathbf{b}_h)Ht​=ϕ(Xt​Wxh​+Ht−1​Whh​+bh​),这一步就是要初始化\mathbf{H}_{0}H0​
  • 使用state.shape看一下\mathbf{H}_{0}H0​的形状。
  • 测试一下: X = torch.rand(size=(num_steps, batch_size, len(vocab))) Y, state_new = rnn_layer(X, state) Y.shape, state_new.shape 复制代码 随便搞一个X来试试pytorch自带的rnn层。
    • X就是随机初始化的,形状是(时间步长、批量大小、语料库词汇表长度)。
    • 使用rnn层进行计算返回Ystate_new,注意这里的Y不是我们说的那个RNN的输出,\mathbf{O}_t = \mathbf{H}_t \mathbf{W}_{hq} + \mathbf{b}_qOt​=Ht​Whq​+bq,←不是这个玩意儿,是隐藏层,是\mathbf{H}H。
    • 最后一句是输出一下Ystate_new的形状: (torch.Size([35, 32, 256]), torch.Size([1, 32, 256])) 这里Y是所有的隐状态,state_new是最后一个隐状态。

    到这里我们可以得出:pytorch自带的RNN层计算的返回值是整个计算过程的隐状态和最后一个隐状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class RNNModel(nn.Module):
    def __init__(self, rnn_layer, vocab_size, **kwargs):
        super(RNNModel, self).__init__(**kwargs)
        self.rnn = rnn_layer
        self.vocab_size = vocab_size
        self.num_hiddens = self.rnn.hidden_size
        
        if not self.rnn.bidirectional:
            self.num_directions = 1
            self.linear = nn.Linear(self.num_hiddens, self.vocab_size)
        else:
            self.num_directions = 2
            self.linear = nn.Linear(self.num_hiddens * 2, self.vocab_size)

    def forward(self, inputs, state):
        X = F.one_hot(inputs.T.long(), self.vocab_size)
        X = X.to(torch.float32)
        Y, state = self.rnn(X, state)
        
        output = self.linear(Y.reshape((-1, Y.shape[-1])))
        return output, state

    def begin_state(self, device, batch_size=1):
        if not isinstance(self.rnn, nn.LSTM):
            return  torch.zeros((self.num_directions * self.rnn.num_layers,
                                 batch_size, self.num_hiddens), 
                                device=device)
        else:
            return (torch.zeros((
                self.num_directions * self.rnn.num_layers,
                batch_size, self.num_hiddens), device=device),
                    torch.zeros((
                        self.num_directions * self.rnn.num_layers,
                        batch_size, self.num_hiddens), device=device))

这个是完整的RNN模型。

  • __init__中进行基本设置。
    • 设定RNN层rnn_layer,设定字典大小vocab_size,设定隐藏层大小num_hiddens
    • 然后这个if-else语句,这个语句是为后面准备的。现在这里还是没有什么作用的。因为之后的双向rnn会用到。 not self.rnn.bidirectional也就是说当这个RNN不是双向的时候,进入if语句。此时设定它只有一个隐藏层,并且设定它的vocab_size。反之则进入else语句,此时设定它有两个隐藏层(因为是双向RNN一个正向的一个反向的),并且设定它的vocab_size
  • forward设定前向传播函数。
    • 先对X进行处理,使其变为one-hot向量。再将数据类型转换为浮点型。
    • 注意在这里Y是我们说的隐状态,不是我们常规意义上的输出。
    • 输出output这里,全连接层首先将Y的形状改为(时间步数批量大小, 隐藏单元数)。再输出output输出形状是 (时间步数批量大小, 词表大小)。
  • begin_state设定初始化的函数。里边也是一个if语句。根据rnn的类型来决定初始化的状态。 isinstance(self.rnn, nn.LSTM)是看我们的self.rnn是不是nn.LSTM,如果他只是一个普通的rnn,那就直接对其进行隐藏状态的初始化就可以了;如果他是LSTM的时候,它的隐形状态需要初始化为张量。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
device = d2l.try_gpu()
net = RNNModel(rnn_layer, vocab_size=len(vocab))
net = net.to(device)
d2l.predict_ch8('time traveller', 10, net, vocab, device)

输出:

'time travellerxsszsuxsss'

在训练之前,我们先使用我们大号的模型来看一下它的预测结果。可以看出结果非常不好,因为他后边已经开始重复输出xss了。

如果你的输出和我的输出不一样也没有关系。因为它初始化的时候是随机初始化。所以每次运行的结果可能是不同的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
num_epochs, lr = 500, 1
d2l.train_ch8(net, train_iter, vocab, lr, num_epochs, device)

对其进行训练。500个epoch,学习率设定为1。 这张代码的向量函数中还有一个可视化的函数,所以你在跑这张代码的过程中应该可以看到一个下降的过程图表。的那个坐标跑完了之后再运行下边这个预测输出的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
d2l.predict_ch8('time traveller', 10, net, vocab, device)

输出:

'time travellerit s again'

训练之后再看一下他预测生成的结果。至少比上面那一个靠谱很多。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【现代深度学习技术】循环神经网络06:循环神经网络的简洁实现
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/04/26
1280
【现代深度学习技术】循环神经网络06:循环神经网络的简洁实现
【深度学习实验】循环神经网络(五):基于GRU的语言模型训练(包括自定义门控循环单元GRU)
get_params 函数用于初始化模型的参数。它接受三个参数:vocab_size 表示词汇表的大小,num_hiddens 表示隐藏单元的数量,device 表示模型所在的设备(如 CPU 或 GPU)。
Qomolangma
2024/07/30
5230
【深度学习实验】循环神经网络(五):基于GRU的语言模型训练(包括自定义门控循环单元GRU)
循环神经网络——中篇【深度学习】【PyTorch】【d2l】
来杯Sherry
2023/09/19
4170
循环神经网络——中篇【深度学习】【PyTorch】【d2l】
【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练
【深度学习实验】循环神经网络(一):循环神经网络(RNN)模型的实现与梯度裁剪_QomolangmaH的博客-CSDN博客
Qomolangma
2024/07/30
4880
【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
LSTM(长短期记忆网络)是一种循环神经网络(RNN)的变体,用于处理序列数据。它具有记忆单元和门控机制,可以有效地捕捉长期依赖关系。
Qomolangma
2024/07/30
1.7K0
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
动手学深度学习(十一) NLP循环神经网络
本节介绍循环神经网络,下图展示了如何基于循环神经网络实现语言模型。我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量
致Great
2020/02/25
7940
动手学深度学习(十一)  NLP循环神经网络
【现代深度学习技术】循环神经网络05:循环神经网络的从零开始实现
  本节将根据循环神经网络中的描述, 从头开始基于循环神经网络实现字符级语言模型。 这样的模型将在H.G.Wells的时光机器数据集上训练。 和前面语言模型和数据集中介绍过的一样, 我们先读取数据集。
Francek Chen
2025/04/22
1280
【现代深度学习技术】循环神经网络05:循环神经网络的从零开始实现
【现代深度学习技术】现代循环神经网络01:门控循环单元(GRU)
  在通过时间反向传播中,我们讨论了如何在循环神经网络中计算梯度,以及矩阵连续乘积可以导致梯度消失或梯度爆炸的问题。下面我们简单思考一下这种梯度异常在实践中的意义:
Francek Chen
2025/05/02
2020
【现代深度学习技术】现代循环神经网络01:门控循环单元(GRU)
【现代深度学习技术】现代循环神经网络07:序列到序列学习(seq2seq)
  正如我们在机器翻译与数据集中看到的,机器翻译中的输入序列和输出序列都是长度可变的。为了解决这类问题,我们在编码器-解码器架构中设计了一个通用的”编码器-解码器“架构。本节,我们将使用两个循环神经网络的编码器和解码器,并将其应用于序列到序列(sequence to sequence,seq2seq)类的学习任务。
Francek Chen
2025/05/06
2230
【现代深度学习技术】现代循环神经网络07:序列到序列学习(seq2seq)
从零开始学Pytorch(十一)之ModernRNN
• 重置⻔有助于捕捉时间序列⾥短期的依赖关系; • 更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。
墨明棋妙27
2022/09/23
4530
【现代深度学习技术】现代循环神经网络02:长短期记忆网络(LSTM)
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/05/02
3250
【现代深度学习技术】现代循环神经网络02:长短期记忆网络(LSTM)
动手学深度学习(十二) NLP循环神经网络进阶
RNN存在的问题:梯度较容易出现衰减或爆炸(BPTT) ⻔控循环神经⽹络:捕捉时间序列中时间步距离较⼤的依赖关系 RNN:
致Great
2020/02/25
4850
动手学深度学习(十二)  NLP循环神经网络进阶
循环神经网络——下篇【深度学习】【PyTorch】【d2l】
设计多个隐藏层,目的是为了获取更多的非线性性。深度循环神经网络需要大量的调参(如学习率和修剪) 来确保合适的收敛,模型的初始化也需要谨慎。
来杯Sherry
2023/09/19
4900
循环神经网络——下篇【深度学习】【PyTorch】【d2l】
【现代深度学习技术】注意力机制04:Bahdanau注意力
  我们试着找到灵感:在为给定文本序列生成手写的挑战中,Graves设计了一种可微注意力模型,将文本字符与更长的笔迹对齐,其中对齐方式仅向一个方向移动。受学习对齐想法的启发,Bahdanau等人提出了一个没有严格单向对齐限制的可微注意力模型。在预测词元时,如果不是所有输入词元都相关,模型将仅对齐(或参与)输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力集中的输出来实现的。
Francek Chen
2025/05/11
1180
【现代深度学习技术】注意力机制04:Bahdanau注意力
【现代深度学习技术】现代循环神经网络03:深度循环神经网络
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。
Francek Chen
2025/05/03
1390
【现代深度学习技术】现代循环神经网络03:深度循环神经网络
动手学深度学习(十三) NLP机器翻译
机器翻译(MT):将一段文本从一种语言自动翻译为另一种语言,用神经网络解决这个问题通常称为神经机器翻译(NMT)。 主要特征:输出是单词序列而不是单个单词。 输出序列的长度可能与源序列的长度不同。
致Great
2020/02/25
9370
动手学深度学习(十三)  NLP机器翻译
长短期记忆(LSTM):突破性的序列训练技术
长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
数据科学工厂
2023/11/20
5680
长短期记忆(LSTM):突破性的序列训练技术
动手学深度学习(十四) NLP注意力机制和Seq2seq模型
在“编码器—解码器(seq2seq)”⼀节⾥,解码器在各个时间步依赖相同的背景变量(context vector)来获取输⼊序列信息。当编码器为循环神经⽹络时,背景变量来⾃它最终时间步的隐藏状态。将源序列输入信息以循环单位状态编码,然后将其传递给解码器以生成目标序列。然而这种结构存在着问题,尤其是RNN机制实际中存在长程梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息,所以随着所需翻译句子的长度的增加,这种结构的效果会显著下降。
致Great
2020/02/25
5290
动手学深度学习(十四) NLP注意力机制和Seq2seq模型
【现代深度学习技术】注意力机制07:Transformer
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/05/21
2450
【现代深度学习技术】注意力机制07:Transformer
【现代深度学习技术】现代循环神经网络04:双向循环神经网络
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/05/04
1350
【现代深度学习技术】现代循环神经网络04:双向循环神经网络
推荐阅读
【现代深度学习技术】循环神经网络06:循环神经网络的简洁实现
1280
【深度学习实验】循环神经网络(五):基于GRU的语言模型训练(包括自定义门控循环单元GRU)
5230
循环神经网络——中篇【深度学习】【PyTorch】【d2l】
4170
【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练
4880
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
1.7K0
动手学深度学习(十一) NLP循环神经网络
7940
【现代深度学习技术】循环神经网络05:循环神经网络的从零开始实现
1280
【现代深度学习技术】现代循环神经网络01:门控循环单元(GRU)
2020
【现代深度学习技术】现代循环神经网络07:序列到序列学习(seq2seq)
2230
从零开始学Pytorch(十一)之ModernRNN
4530
【现代深度学习技术】现代循环神经网络02:长短期记忆网络(LSTM)
3250
动手学深度学习(十二) NLP循环神经网络进阶
4850
循环神经网络——下篇【深度学习】【PyTorch】【d2l】
4900
【现代深度学习技术】注意力机制04:Bahdanau注意力
1180
【现代深度学习技术】现代循环神经网络03:深度循环神经网络
1390
动手学深度学习(十三) NLP机器翻译
9370
长短期记忆(LSTM):突破性的序列训练技术
5680
动手学深度学习(十四) NLP注意力机制和Seq2seq模型
5290
【现代深度学习技术】注意力机制07:Transformer
2450
【现代深度学习技术】现代循环神经网络04:双向循环神经网络
1350
相关推荐
【现代深度学习技术】循环神经网络06:循环神经网络的简洁实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档