PyTorch程序练习(二):循环神经网络的PyTorch实现

一、RNN实现

结构原理

代码实现

import torch
import torch.nn as nn

class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNN, self).__init__()
        self.hidden_size = hidden_size
        self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
        self.i2o = nn.Linear(input_size + hidden_size, output_size)
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, input, hidden):
        combined = torch.cat((input, hidden), 1)
        hidden = self.i2h(combined)     #全连接层
        output: object = self.i2o(combined)
        output = self.softmax(output)
        return output, hidden

    def initHidden(self):
        return torch.zeros(1, self.hidden_size)

二、LSTM实现

结构原理

封装好的LSTM

import torch
import torch.nn as nn

class LSTMTagger(nn.Module):
    def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size):
        super(LSTMTagger, self).__init__()
        self.hidden_dim = hidden_dim
        self.word_embeddings = nn.Embedding(vocab_size, embedding_dim)

        # LSTM以word_embeddings作为输入, 输出维度为 hidden_dim 的隐藏状态值
        self.lstm = nn.LSTM(embedding_dim, hidden_dim)

        # 线性层将隐藏状态空间映射到标注空间
        self.hidden2tag = nn.Linear(hidden_dim, tagset_size)
        self.hidden = self.init_hidden()

    def init_hidden(self):
        # 一开始并没有隐藏状态所以要先初始化一个
        # 各个维度的含义是 (num_layers, minibatch_size, hidden_dim)
        return (torch.zeros(1, 1, self.hidden_dim),
                torch.zeros(1, 1, self.hidden_dim))

    def forward(self, sentence):
        embeds = self.word_embeddings(sentence)
        lstm_out, self.hidden = self.lstm(embeds.view(len(sentence), 1, -1), self.hidden)
        tag_space = self.hidden2tag(lstm_out.view(len(sentence), -1))
        tag_scores = F.log_softmax(tag_space, dim=1)
        return tag_scores

未封装的LSTM

import torch
import torch.nn as nn

class LSTMCell(nn.Module):
    def __init__(self, input_size, hidden_size, cell_size, output_size):
        super(LSTMCell, self).__init__()
        self.hidden_size = hidden_size
        self.cell_size = cell_size
        self.gate = nn.Linear(input_size + hidden_size, cell_size)  # 门:线性全连接层
        self.output = nn.Linear(hidden_size, output_size)
        self.sigmoid = nn.Sigmoid()
        self.tanh = nn.Tanh()
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, input, hidden, cell):
        combined = torch.cat((input, hidden), 1)        #维度上连接
        f_gate = self.sigmoid(self.gate(combined))      #遗忘门
        i_gate = self.sigmoid(self.gate(combined))      #输入门
        o_gate = self.sigmoid(self.gate(combined))      #输出门
        z_state = self.tanh(self.gate(combined))
        cell = torch.add(torch.mul(cell, f_gate), torch.mul(z_state, i_gate))
        """
        cell长期记忆细胞:(cell·f_gate)+(z_state·i_gate)
        遗忘门经过sigmoid后,值在[0,1]之间:
            当f_gate趋于0时,和cell矩阵相乘后,记忆细胞为0,忘记长期记忆;
            当f_gate区域1时,cell全部输入,作为长期记忆。
        """
        hidden = torch.mul(self.tanh(cell), o_gate)     #隐藏层:长期记忆细胞cell先过一层tanh激活函数,然后和输出门o_gate矩阵相乘
        output = self.output(hidden)    #隐藏层作为输出层的输出
        output = self.softmax(output)
        return output, hidden, cell

    def initHidden(self):
        return torch.zeros(1, self.hidden_size)

    def initCell(self):
        return torch.zeros(1, self.cell_size)

三、GRU实现

结构原理

 

代码实现

import torch
import torch.nn as nn

class GRUCell(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(GRUCell, self).__init__()
        self.hidden_size = hidden_size
        self.gate = nn.Linear(input_size + hidden_size, hidden_size)
        self.output = nn.Linear(hidden_size, output_size)
        self.sigmoid = nn.Sigmoid()
        self.tanh = nn.Tanh()
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, input, hidden):
        combined = torch.cat((input, hidden), 1)
        z_gate = self.sigmoid(self.gate(combined))      #重置门
        r_gate = self.sigmoid(self.gate(combined))      #更新门
        combined01 = torch.cat((input, torch.mul(hidden, r_gate)), 1)
        h1_state = self.tanh(self.gate(combined01))

        h_state = torch.add(torch.mul((1 - z_gate), hidden), torch.mul(h1_state, z_gate))
        output = self.output(h_state)
        output = self.softmax(output)
        return output, h_state

    def initHidden(self):
        return torch.zeros(1, self.hidden_size)

四、程序分析

1、RNN(Recurrent Natural Network,循环神经网络) 

         PyTorch提供了两个版本的循环神经网络接口,单元版的输入是每个时间步,或循环神经网络的一个循环,而封装版的是一个序列。

 2、LSTM(Long Short-TermMemory,长短时记忆网络)

        LSTM是在RNN基础上增加了长时间记忆功能,具体通过增加一个状态C及利用3个门(Gate)实现对信息的更精准控制。
        LSTM比标准的RNN多了3个线性变换,多出的3个线性变换的权重合在一起是RNN的4倍,偏移量也是RNN的4倍。所以,LSTM的参数个数是RNN的4倍。
        除了参数的区别外,隐含状态除h0外,多了一个c0,两者形状相同,都是(num_layers*num_directions,batch,hidden_size),它们合在一起构成了LSTM的隐含状态。所以,LSTM的输入隐含状态为(h0,c0),输出的隐含状态为(hn,cn),其他输入与输出与RNN相同。

 3、GRU(Gated Recurrent Unit,门控循环单元)

        GRU网络结构与LSTM基本相同,主要区别是LSTM共有3个门,两个隐含状态;而GRU只有两个门,一个隐含状态。其参数是标准RNN的3倍。

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PyTorch教程电子书是一本全面介绍PyTorch深度学习框架的资源,它为初学者和有经验的用户提供了系统性的学习材料。这本电子书以教程的形式呈现,涵盖了PyTorch的基础知识以及高级应用技巧。以下是关于PyTorch教程电子书的300字回答。 PyTorch教程电子书首先介绍了PyTorch的基本概念、安装和使用方法。读者可以学习如何配置开发环境,下载和安装PyTorch库,并了解基本的PyTorch操作和语法。这些基础知识对于进一步学习和掌握PyTorch非常重要。 此外,教程电子书还深入讲解了PyTorch的核心概念,例如张量(Tensor)和自动求导(Autograd)。读者可以学习如何使用张量进行数值计算和矩阵操作,并了解自动求导的原理和使用方法。这为深度学习算法的实现提供了基础。 教程电子书还介绍了PyTorch的模型构建和训练。读者可以学习如何使用PyTorch构建常见的神经网络模型,包括全连接网络、卷积神经网络循环神经网络等。教程详细介绍了PyTorch的模型定义、参数优化和训练过程。读者可以通过实践练习来巩固所学知识。 此外,教程电子书还涵盖了PyTorch在计算机视觉、自然语言处理和生成对抗网络等领域的应用。读者可以学习如何使用PyTorch进行图像分类、目标检测、文本生成等任务,并了解相关的数据处理和评估方法。 总而言之,PyTorch教程电子书提供了一个全面而系统的学习资源,帮助读者从入门到精通PyTorch框架。无论是初学者还是有一定经验的用户,都可以通过这本电子书深入了解PyTorch的基本概念和高级应用技巧,并通过实践练习来提升自己的深度学习能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香菜仙人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值