pytorch 学习 | 使用pytorch动手实现LSTM模块

LSTM 简介

LSTM是RNN中一个较为流行的网络模块。主要包括输入,输入门,输出门,遗忘门,激活函数,全连接层(Cell)和输出。其结构如下:
在这里插入图片描述
在这里插入图片描述
上述公式不做解释,我们只要大概记得以下几个点就可以了:

  1. 当前时刻LSTM模块的输入有来自当前时刻的输入值,上一时刻的输出值,输入值和隐含层输出值,就是一共有四个输入值,这意味着一个LSTM模块的输入量是原来普通全连接层的四倍左右,计算量多了许多。
  2. 所谓的门就是前一时刻的计算值输入到sigmoid激活函数得到一个概率值,这个概率值决定了当前输入的强弱程度。 这个概率值和当前输入进行矩阵乘法得到经过门控处理后的实际值。
  3. 门控的激活函数都是sigmoid,范围在(0,1),而输出输出单元的激活函数都是tanh,范围在(-1,1)。

Pytorch实现如下:

import torch
import torch.nn as nn
from torch.nn import Parameter
from torch.nn import init
from torch import Tensor
import math

class NaiveLSTM(nn.Module):
    """Naive LSTM like nn.LSTM"""
    def __init__(self, input_size: int, hidden_size: int):
        super(NaiveLSTM, self).__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size

        # input gate
        self.w_ii = Parameter(Tensor(hidden_size, input_size))
        self.w_hi = Parameter(Tensor(hidden_size, hidden_size))
        self.b_ii = Parameter(Tensor(hidden_size, 1))
        self.b_hi = Parameter(Tensor(hidden_size, 1))

        # forget gate
        self.w_if = Parameter(Tensor(hidden_size, input_size)
  • 9
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
PyTorch 中,实现 LSTM 的方式有两种:使用 `nn.LSTM` 模块或手动实现。如果不想使用 `nn.LSTM` 模块实现 LSTM,可以手动编写 LSTM 的前向传播函数。下面是一个手动实现 LSTM 的示例代码: ``` import torch class LSTM(torch.nn.Module): def __init__(self, input_size, hidden_size): super().__init__() self.input_size = input_size self.hidden_size = hidden_size self.W_i = torch.nn.Parameter(torch.Tensor(input_size, hidden_size)) self.U_i = torch.nn.Parameter(torch.Tensor(hidden_size, hidden_size)) self.b_i = torch.nn.Parameter(torch.Tensor(hidden_size)) self.W_f = torch.nn.Parameter(torch.Tensor(input_size, hidden_size)) self.U_f = torch.nn.Parameter(torch.Tensor(hidden_size, hidden_size)) self.b_f = torch.nn.Parameter(torch.Tensor(hidden_size)) self.W_c = torch.nn.Parameter(torch.Tensor(input_size, hidden_size)) self.U_c = torch.nn.Parameter(torch.Tensor(hidden_size, hidden_size)) self.b_c = torch.nn.Parameter(torch.Tensor(hidden_size)) self.W_o = torch.nn.Parameter(torch.Tensor(input_size, hidden_size)) self.U_o = torch.nn.Parameter(torch.Tensor(hidden_size, hidden_size)) self.b_o = torch.nn.Parameter(torch.Tensor(hidden_size)) self.reset_parameters() def reset_parameters(self): stdv = 1.0 / math.sqrt(self.hidden_size) for weight in self.parameters(): weight.data.uniform_(-stdv, stdv) def forward(self, x, h0=None, c0=None): seq_len, batch_size, _ = x.size() if h0 is None: h0 = x.new_zeros(batch_size, self.hidden_size) if c0 is None: c0 = x.new_zeros(batch_size, self.hidden_size) hiddens = [] for t in range(seq_len): xt = x[t] i_t = torch.sigmoid(xt @ self.W_i + h0 @ self.U_i + self.b_i) f_t = torch.sigmoid(xt @ self.W_f + h0 @ self.U_f + self.b_f) c_tilda_t = torch.tanh(xt @ self.W_c + h0 @ self.U_c + self.b_c) c_t = f_t * c0 + i_t * c_tilda_t o_t = torch.sigmoid(xt @ self.W_o + h0 @ self.U_o + self.b_o) h_t = o_t * torch.tanh(c_t) hiddens.append(h_t.unsqueeze(0)) h0, c0 = h_t, c_t hiddens = torch.cat(hiddens, dim=0) return hiddens, (h_t, c_t) ``` 这个示例代码中,我们手动实现LSTM 的前向传播过程,包括输入门、遗忘门、细胞状态和输出门。这个实现使用 `nn.LSTM` 模块实现方式相似,但是需要手动计算 LSTM 的参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值