RNN模型

avatar
作者
猴君
阅读量:0

介绍

        循环神经网络(RNN)是一种深度学习模型,专门用于处理序列数据。它通过内部的循环结构,能够有效地捕捉序列数据中的时间关系和上下文信息。

        RNN模型在短序列任务上性能和效果都表现优异,但在过长的序列导致梯度的计算异常, 发生梯度消失或爆炸。

手动构建RNN模型

import torch import torch.nn as nn   class RNN(nn.Module):     def __init__(self, input_size, hidden_size, output_size):         """         初始化RNN模型。          Args:             input_size (int): 输入张量的最后一个维度大小。             hidden_size (int): 隐藏层张量的最后一个维度大小。             output_size (int): 输出层张量的最后一个维度大小。         """         super(RNN, self).__init__()         self.hidden_size = hidden_size          # 第一个线性层:输入到隐藏层         self.input_to_hidden = nn.Linear(input_size + hidden_size, hidden_size)          # Tanh 激活函数         self.tanh = nn.Tanh()          # 第二个线性层:隐藏层到输出层         self.input_to_output = nn.Linear(hidden_size, output_size)          # LogSoftmax 层用于输出         self.softmax = nn.LogSoftmax(dim=-1)      def forward(self, current_input, prev_hidden_state):         """         RNN 模型的前向传播逻辑。          Args:             current_input (torch.Tensor): 当前时间步的输入张量。                 形状应为 (1, input_size)。             prev_hidden_state (torch.Tensor): 上一个时间步的隐藏状态张量。                 形状应为 (1, hidden_size)。          Returns:             torch.Tensor: 经过 softmax 处理后的输出张量。             torch.Tensor: 更新后的隐藏状态张量。         """         # 将当前输入张量和上一个时间步的隐藏状态张量拼接起来         concatenated = torch.cat((current_input, prev_hidden_state), dim=1)          # 进入第一个线性层:输入到隐藏层         hidden = self.input_to_hidden(concatenated)          # 应用 Tanh 激活函数         hidden = self.tanh(hidden)          # 进入第二个线性层:隐藏层到输出层         output = self.input_to_output(hidden)          # 应用 LogSoftmax 函数         output = self.softmax(output)          return output, hidden      def init_hidden(self):         """         初始化隐藏状态张量。          Returns:             torch.Tensor: 初始化的隐藏状态张量,全为0。                 形状为 (1, hidden_size)。         """         return torch.zeros(1, self.hidden_size)   if __name__ == '__main__':     # Define parameters     input_size = 768     hidden_size = 128     output_size = 2      # 初始化模型     rnn_model = RNN(input_size, hidden_size, output_size)      # 随机生成输入张量和隐藏状态张量     input_tensor = torch.rand(1, input_size)     hidden_tensor = rnn_model.init_hidden()      # 前向传播     outputs, hiddens = rnn_model(input_tensor, hidden_tensor)     print("outputs size:", outputs.size())     print("hidden state size:", hiddens.size()) 

 outputs size: torch.Size([1, 2])
hidden state size: torch.Size([1, 128])

使用Pytorch的API构建RNN模型

import torch import torch.nn as nn   class RNN(nn.Module):     def __init__(self, input_size, hidden_size, output_size, num_layers=1):         """         初始化RNN模型          Args:             input_size (int): 输入张量的最后一个维度大小。             hidden_size (int): 隐藏层张量的最后一个维度大小。             output_size (int): 输出层张量的最后一个维度大小。             num_layers (int, optional): RNN的层数。默认为1。         """         super(RNN, self).__init__()         self.hidden_size = hidden_size         self.num_layers = num_layers          # RNN层         self.rnn_layer = nn.RNN(input_size, hidden_size, num_layers)          # 输出线性层         self.output_layer = nn.Linear(hidden_size, output_size)          # LogSoftmax层用于输出         self.softmax = nn.LogSoftmax(dim=-1)      def forward(self, current_input, prev_hidden_state):         """         RNN前向传播逻辑          Args:             current_input (torch.Tensor): 当前时间步的输入张量。                 形状应为 (1, input_size)。             prev_hidden_state (torch.Tensor): 上一个时间步的隐藏状态张量。                 形状应为 (num_layers, 1, hidden_size)。          Returns:             torch.Tensor: 经过LoSoftmax处理后的输出张量。             torch.Tensor: 更新后的隐藏状态张量。         """         current_input = current_input.unsqueeze(0)  # 添加批次维度         rnn_output, new_hidden_state = self.rnn_layer(current_input, prev_hidden_state)         output = self.output_layer(rnn_output)         output = self.softmax(output)         return output, new_hidden_state      def init_hidden(self):         """         初始化隐藏状态张量          Returns:             torch.Tensor: 初始化的隐藏状态张量。                 形状为 (num_layers, 1, hidden_size)。         """         return torch.zeros(self.num_layers, 1, self.hidden_size)   if __name__ == '__main__':     # 定义参数     input_size = 768     hidden_size = 128     output_size = 2     num_layers = 1      # 实例化RNN模型     rnn = RNN(input_size, hidden_size, output_size, num_layers)      # 随机生成输入张量和隐藏状态张量     input_tensor = torch.rand(1, input_size)     hidden_tensor = rnn.init_hidden()      # 前向传播     outputs, hiddens = rnn(input_tensor, hidden_tensor)      # 打印输出结果和隐藏状态     print("outputs size:", outputs.size())     print("hidden state size:", hiddens.size()) 

outputs size: torch.Size([1, 1, 2])
hidden state size: torch.Size([1, 1, 128]) 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!