Torch - 循环神经网络

Torch 中的循环神经网络 (RNN) 被指定用于通过对隐藏状态进行分类来处理顺序数据,该隐藏状态可从先前的输入中捕获信息。在 Torch 中,我们可以使用 torch.nn.RNN 模块来创建 RNN。这有助于我们了解输入大小、层数、非线性和隐藏大小。RNN 被指定用于自然语言处理和序列预测等任务,其中数据序列至关重要。RNN 可以处理可变长度序列作为输入并提供可变长度序列作为输出。

处理向量和序列的神经网络

在 Torch 中,神经网络是使用 torch.nn 模块构建的。这提供了一种灵活而有效的方法来构建和训练神经网络。

  • 向量:向量是一种传统的神经网络,如前馈网络,可处理固定大小的输入向量。向量中的每一层都通过一系列线性和非线性操作将输入向量转换为另一个向量。

  • 序列:RNN 被指定用于处理顺序数据,其中数据按重要的数据点顺序排列。它们保持随时间演变的隐藏状态,从而捕获来自其他输入的信息。

以下代码允许 RNN 处理序列并捕获时间依赖性,使其适用于各种任务。在 Torch − 中实现 RNN

import torch
import torch.nn as nn

class SimpleRNN(nn.Module):
    def __init__(self,int_size, hdn_size, ott_size):
        super(SimpleRNN, self).__init__()
        self.rnn = nn.RNN(int_size, hdn_size, batch_first=True)
        self.fc = nn.Linear(hdn_size, ott_size)

    def forward(self, x):
        h0 = torch.zeros(1, x.size(0), hdn_size)  
        out, _ = self.rnn(x, h0)
        out = self.fc(out[:, -1, :])  
        return out

int_size = 20  #input
hdn_size = 30  #hidden
ott_size = 2   #output

model = SimpleRNN(int_size, hdn_size, ott_size)

y = torch.randn(2, 4, input_size)

output = model(y)
print(output)

神经网络中的前向和后向传递

在神经网络训练中,前向传递涉及通过网络输入数据以完成预测和损失。后向传递使用反向传播计算损失相对于模型参数的梯度。优化器甚至使用这些梯度来更新模型参数,从而优化迭代中的损失。

前向传递

在前向传递中,输入数据逐层通过神经网络。每一层都应用变换来产生输出。最后一层生成预测,使用损失函数将其与真实标签进行比较以完成误差

  • 输入数据:数据被输入到神经网络中。

  • 逐层计算:数据按顺序通过网络的每一层。

  • 输出和损失计算:最后一层产生网络的输出,损失函数比较真实标签的预测并完成损失,从而量化误差。

反向传递

在反向传递中,损失函数通过网络反向传播以完成每个参数的损失梯度。这是使用反向传播完成的。优化器使用这些梯度来更新模型参数,从而减少后续迭代中的损失。

# 计算梯度
loss.backward()
# 更新参数
optimizer.step()
# 零梯度
optimizer.zero_grad()

nngraph 包

nngraph 包通过允许用户将神经网络定义为计算图来扩展 Torch 中 nn 包的功能。这种方法为复杂的架构(如循环和卷积神经网络)提供了更大的清晰度和灵活性。每个 nn 模块都表示为图中的节点。可视化包使用 grapgviz 等工具支持计算图。这有助于我们理解和调试网络结构。它允许灵活地创建具有多个输入和输出的网络。这支持使用顺序模型难以实现的复杂架构。

要使用 nngraph,我们需要将其与 graphviz 一起安装以实现可视化 −

brew install graphviz # Mac users

sudo apt-get install graphviz -yellow #Ubuntu users