首页 > 其他分享 >PyTorch:从零实现一个双向循环神经网络

PyTorch:从零实现一个双向循环神经网络

时间:2024-08-12 20:53:58浏览次数:12  
标签:input self torch 神经网络 PyTorch 双向 output hidden size

从零实现一个双向循环神经网络(Bi-directional Recurrent Neural Network, Bi-RNN)从零开始,可以帮助我们深入理解 RNN 的机制。以下是实现步骤:

  1. 定义 RNN 单元:实现一个简单的 RNN 单元,能够处理单个时间步长的数据。
  2. 定义双向 RNN:实现前向和后向的 RNN,组合它们的输出。
  3. 定义损失函数和优化器:使用 PyTorch 提供的工具来定义损失函数和优化器。

以下是实现一个简单的双向 RNN 的完整代码:

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

# 定义一个简单的 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 BiRNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(BiRNN, self).__init__()
        self.hidden_size = hidden_size
        self.rnn_fw = SimpleRNNCell(input_size, hidden_size)
        self.rnn_bw = SimpleRNNCell(input_size, hidden_size)
        self.fc = nn.Linear(2 * hidden_size, output_size)

    def forward(self, input):
        seq_len, batch_size, _ = input.size()
        h_fw = torch.zeros(batch_size, self.hidden_size)
        h_bw = torch.zeros(batch_size, self.hidden_size)

        output_fw = []
        output_bw = []

        for t in range(seq_len):
            h_fw = self.rnn_fw(input[t], h_fw)
            output_fw.append(h_fw)
        
        for t in range(seq_len-1, -1, -1):
            h_bw = self.rnn_bw(input[t], h_bw)
            output_bw.append(h_bw)
        
        output_fw = torch.stack(output_fw, dim=0)
        output_bw = torch.stack(output_bw[::-1], dim=0)
        
        output = torch.cat((output_fw, output_bw), dim=2)
        output = self.fc(output)
        
        return output

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

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

# 定义损失函数和优化器
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. BiRNN:实现一个双向 RNN,包含前向和后向的 RNN 单元。它处理输入序列,分别计算前向和后向的隐藏状态,并将它们连接起来,通过一个全连接层生成最终输出。
  3. 训练步骤:生成一些随机数据,定义损失函数和优化器,执行前向传播、计算损失、反向传播和参数更新。

通过上述步骤,可以实现一个简单的双向 RNN。

标签:input,self,torch,神经网络,PyTorch,双向,output,hidden,size
From: https://blog.csdn.net/qq_41934789/article/details/141141973

相关文章

  • 双向重发布
    要求:1.如图搭建网络拓扑,所有路由器各自创建一个环回接口,合理规划IP地址2.R1-R2-R3-R4-R6之间使用OSPF协议,R4-R5-R6之间使用RIP协议3.R1环回重发布方式引入OSPF网络4.R4/R6上进行双点双向重发布5.分析网络中出现路由环路的原因6.路由优化1.如图搭建网络拓扑,所有路由......
  • 牛客JS题(三十八)双向绑定
    注释很详细,直接上代码涉及知识点:浅度监听作用域链Object.defineProperty题干:我的答案<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/></head><body><style>ul{list-sty......
  • 零基础学习人工智能—Python—Pytorch学习(四)
    前言接续上一篇的optimizer的学习。optimizer代码和上一篇文章的一样,如下:importtorchimportnumpyasnpimporttorch.nnasnnX=torch.tensor([1,2,3,4],dtype=torch.float32)Y=torch.tensor([2,4,6,8],dtype=torch.float32)w2=torch.tensor(0.0,requ......
  • pytorch无法使用cuda和cudnn返回false
    下面乱七八糟的实验过后问题解决,用了三天的时间,总算搭建成功了 查了无数资料无法解决问题,将目标定为pytorch和cuda版本不匹配,重新下载pytorch发现报错在pytorch官方可以下载版本对应的pytorch从本地开始|Py火炬(pytorch.org)这里根据自己需要点一点,然后复制下面代码......
  • pytorch_geometric的Planetoid出现“TypeError: expected np.ndarray (got matrix)”
    问题和解决方案运行GCN的例子的时候,出现了这个错误:out=torch.from_numpy(out).to(torch.float)TypeError:expectednp.ndarray(gotmatrix)解决方案:在torch_geometric.io.planetoid.py中添加importnumpyasnp,将out=torch.from_numpy(out).to(torch.float)......
  • 深度学习武器库-timm-非常好用的pytorch CV模型库 - 常用模型操作
    简要介绍timm库,全称pytorch-image-models,是最前沿的PyTorch图像模型、预训练权重和实用脚本的开源集合库,其中的模型可用于训练、推理和验证。github源码链接:https://github.com/huggingface/pytorch-image-models文档教程文档:https://huggingface.co/docs/hub/timm上手教程:h......
  • 用电量预测 | 基于BiLSTM双向长短期记忆神经网络算法的用电量预测附matlab完整代码
    用电量预测|基于BiLSTM双向长短期记忆神经网络算法的用电量预测附matlab完整代码数据收集:收集历史用电量数据,包括时间戳和相应的用电量值。选择模型:选择合适的模型进行预测,可以根据数据特点和需求选择合适的模型。训练模型:使用历史数据训练模型,并根据评估指标来调整......
  • Pytorch入门:tensor张量的构建
    tensor数据结构是pytorch的基础与核心,本文主要介绍三种常用的tensor张量的构建方式。1.从已有其他数据转换为tensor数据常用方法有如下两种:torch.tensortorch.Tensor上述两种方法有细微的差别,具体通过示例来进行展示运行结果为 首先,torch.tensor会对转换前容器内元素......
  • pytorch深度学习实践(刘二大人)课后作业——Titanic数据集分析预测
    一、课后作业构造分类器对Titanic数据集进行预测1.数据集预处理(1)数据集下载与分析下载地址:https://www.kaggle.com/c/titanic/data导入必要的包,并查看训练集、测试集前五行数据importtorchimportnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimp......
  • 混合策略改进的蜣螂算法(IDBO)优化BP神经网络
    目录0引言1数学模型2模型对比3matlab代码3.1改进的主代码3.2IDBO-BP4视频讲解0引言针对DBO算法全局探索能力不足、易陷入局部最优以及收敛精度不理想等问题,多为学者提出了混合多策略改进的蜣螂优化算法(IDBO)。主要混合策略改进首先是采用混沌映射结合随机反向......