【深度学习】Pytorch实现LSTM

思路

如图中,左二右三共五个公式,

  1. 首先实现分别关于o 、f 、i三个门的Wx、 Wh、 b,分别对应输入到该门的权重矩阵、上一时间步隐藏状态到该门的权重矩阵、偏置向量;
  2. 其次,得到三个参数矩阵后,根据右面三个公式进行三个门的计算;
  3. 我们将当前时间步的输入片段设为x_t,h_t是上一时间步的隐藏状态;
  4. 另取一个参数y_t= tanh(Wxc * x_t + h_t * Whc + bc),即左二中下面公式中 i 后面的部分
  5. 根据遗忘门 f 和输入门 i ,即左二中下面的公式,计算更新状态c_t = f_t * c_t + i_t * y_t
  6. 根据左二上面的公式更新h_t = o_t * tanh(c_t)
 ps:`hidden_seq`
  • 是一个存储隐藏状态的序列。它是一个三维张量,形状为`(seq_length, batch_size, hidden_size)`,其中`seq_length`是序列的长度(也就是时间步的数量),`batch_size`是批次的大小,`hidden_size`是隐藏状态的维度大小。
  • 在许多序列模型中,如循环神经网络(RNN)和长短期记忆网络(LSTM),隐藏状态是在时间步之间传递的重要信息。`hidden_seq`会存储在训练过程中每个时间步的隐藏状态。
  • 在上述代码中,`hidden_seq`的目的是将当前时间步的隐藏状态`h_t`存储并追加到序列中,以便在后续时间步中使用。在代码的其他部分,可能会使用`hidden_seq`来进行序列的处理和相关计算
batch_size 
  • batch size)是一次处理的样本数量。在训练神经网络时,通常会将数据划分为多个批次,并将每个批次作为模型的输入进行训练。每个批次中包含的样本数量即为批次大小。
  • 批次大小的选择是一个重要的超参数,需要根据具体问题和计算资源进行调整。较小的批次大小可能导致更频繁的参数更新,使模型更加敏感,但计算效率较低。较大的批次大小可以提高计算效率,但也可能降低模型的学习速度和泛化能力。
  • 在训练过程中,通常会将所有的样本数据分为若干个批次,并依次将每个批次作为输入送入神经网络进行前向传播和反向传播。通过按批次处理数据,可以加速模型的训练过程,提高计算效率,并充分利用硬件设备(如GPU)的并行计算能力。

import torch
import torch.nn as nn

class Lstm(nn.Module):
    #用于创建神经网络模型。所有自定义的神经网络模型都应该继承自`nn.Module`。
    def __intit(self, input_sz, hidden_sz):
        super().__init__()
        self.input_size = input_sz
        self.hidden_size = hidden_sz

        #i
        self.Wxi = nn.Parameter(torch.Tensor(input_sz, hidden_sz))
        self.Whi = nn.Parameter(torch.Tensor(input_sz, hidden_sz))
        self.bi = nn.Parameter(torch.Tensor(input_sz, hidden_sz))

        #f
        self.Wxf = nn.Parameter(torch.Tensor(input_sz, hidden_sz))
        self.Whf = nn.Parameter(torch.Tensor(input_sz, hidden_sz))
        self.bf = nn.Parameter(torch.Tensor(input_sz, hidden_sz))

        #o
        self.Wxo = nn.Parameter(torch.Tensor(input_sz, hidden_sz))
        self.Who = nn.Parameter(torch.Tensor(input_sz, hidden_sz))
        self.bo = nn.Parameter(torch.Tensor(input_sz, hidden_sz))

        #c
        self.Wxc = nn.Parameter(torch.Tensor(input_sz, hidden_sz))
        self.Whc = nn.Parameter(torch.Tensor(input_sz, hidden_sz))
        self.bc = nn.Parameter(torch.Tensor(input_sz, hidden_sz))

        self.init_weights()#用于初始化神经网络中的权重参数。

    def forward(self, x, init_states=None):
        batch_size, seq_sz, _ = x.size()
        hidden_seq = []

        if init_states is None:
            h_t, c_t = (
                torch.zeros(batch_size, self.hidden_size).to(x.device),#x.device表示输入张量x所在的设备
                torch.zeros(batch_size, self.hidden_size).to(x.device)
            )
        else:
            h_t, c_t = init_states

        for t in range(seq_sz):
            x_t = x[:, t, :]
            i_t = torch.sigmoid(x_t @ self.Wxi + h_t @ self.Whi + self.bi)
            f_t = torch.sigmoid(x_t @ self.Wxf + h_t @ self.Whf + self.bf)
            o_t = torch.sigmoid(x_t @ self.Wxo + h_t @ self.Who + self.bo)

            y_t = torch.tanh(x_t @ self.Wxc + h_t @ self.Whc + self.bc)
            c_t = f_t * c_t + i_t * y_t
            h_t = o_t * torch.tanh(c_t)

            hidden_seq.append(h_t.unsqueeze(0))
            hidden_seq = torch.cat(hidden_seq, dim = 0)
            hidden_seq = hidden_seq.transpose(0, 1).contiguous
            return hidden_seq, (h_t, c_t)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个开源机器学习库,它提供了丰富的工具和函数,用于构建和训练深度学习模型。在PyTorch实现LSTM(长短期记忆)模型可以通过以下步骤完成: 1. 导入必要的库和模块: ```python import torch import torch.nn as nn ``` 2. 定义LSTM模型的类: ```python class LSTMModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(LSTMModel, self).__init__() self.hidden_size = hidden_size self.num_layers = num_layers self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device) c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device) out, _ = self.lstm(x, (h0, c0)) out = self.fc(out[:, -1, :]) return out ``` 3. 创建LSTM模型实例: ```python input_size = ... # 输入数据的特征维度 hidden_size = ... # LSTM隐含层的特征维度 num_layers = ... # LSTM模型的层数 output_size = ... # 输出结果的维度 model = LSTMModel(input_size, hidden_size, num_layers, output_size) ``` 4. 定义损失函数和优化器: ```python criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` 5. 训练LSTM模型: ```python epochs = ... # 训练的轮数 for epoch in range(epochs): # 前向传播 outputs = model(inputs) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 每隔一定步数打印损失值 if (epoch+1) % print_interval == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, epochs, loss.item())) ``` 通过以上步骤,我们就可以在PyTorch实现一个简单的LSTM模型,并对其进行训练。当然,具体的实现方式还可以根据具体的任务需求做一些调整和改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值