pytorch : 从零开始实现深度 RNN

实现一个深度循环神经网络(Deep RNN),我们需要在标准 RNN 的基础上堆叠多个循环层,每个循环层的输出作为下一层的输入。以下是一个从零开始实现深度 RNN 的代码示例:

代码实现

import torch
import torch.nn as nn
import torch.optim as optim
import math

# 定义一个简单的 RNN 单元
class SimpleRNNCell(nn.Module):
    def __init__(self, input_size, hidden_size):
        super(SimpleRNNCell, self).__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.W_ih = nn.Parameter(torch.Tensor(input_size, hidden_size))
        self.W_hh = nn.Parameter(torch.Tensor(hidden_size, hidden_size))
        self.b_ih = nn.Parameter(torch.Tensor(hidden_size))
        self.b_hh = nn.Parameter(torch.Tensor(hidden_size))
        self.reset_parameters()
    
    def reset_parameters(self):
        nn.init.kaiming_uniform_(self.W_ih, a=math.sqrt(5))
        nn.init.kaiming_uniform_(self.W_hh, a=math.sqrt(5))
        nn.init.zeros_(self.b_ih)
        nn.init.zeros_(self.b_hh)

    def forward(self, input, hidden):
        hy = torch.tanh(torch.mm(input, self.W_ih) + self.b_ih + torch.mm(hidden, self.W_hh) + self.b_hh)
        return hy

# 定义深度 RNN
class DeepRNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size, num_layers):
        super(DeepRNN, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.rnn_cells = nn.ModuleList()
        
        # 创建第一个 RNN 层
        self.rnn_cells.append(SimpleRNNCell(input_size, hidden_size))
        # 创建后续的 RNN 层
        for _ in range(1, num_layers):
            self.rnn_cells.append(SimpleRNNCell(hidden_size, hidden_size))
        
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, input):
        seq_len, batch_size, _ = input.size()
        hidden_states = [torch.zeros(batch_size, self.hidden_size) for _ in range(self.num_layers)]
        outputs = []

        for t in range(seq_len):
            x = input[t]
            for layer in range(self.num_layers):
                hidden_states[layer] = self.rnn_cells[layer](x, hidden_states[layer])
                x = hidden_states[layer]
            outputs.append(x)
        
        outputs = torch.stack(outputs, dim=0)
        outputs = self.fc(outputs)
        
        return outputs

# 定义模型参数
input_size = 10
hidden_size = 20
output_size = 5
num_layers = 3
seq_len = 7
batch_size = 3

# 创建模型
model = DeepRNN(input_size, hidden_size, output_size, num_layers)

# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 生成一些随机输入和目标输出
input = torch.randn(seq_len, batch_size, input_size)
target = torch.randn(seq_len, batch_size, output_size)

# 训练步骤
output = model(input)
loss = criterion(output, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()

print(f'Loss: {loss.item()}')

代码解释

  1. SimpleRNNCell:实现一个简单的 RNN 单元,包含输入到隐藏层和隐藏层到隐藏层的线性变换,并使用 torch.tanh 作为激活函数。

  2. DeepRNN:实现一个深度 RNN,包括多个堆叠的 RNN 层。每一层的输出作为下一层的输入,最终输出通过一个全连接层生成。

  3. 训练步骤:生成一些随机数据,定义损失函数和优化器,执行前向传播、计算损失、反向传播和参数更新。

通过上述代码,你可以理解如何实现一个多层深度 RNN,以及如何训练这个网络。你可以进一步调整超参数(如隐藏层大小、层数等)来优化模型性能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

为啥全要学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值