- PyTorch 教程
- PyTorch - 首页
- PyTorch - 简介
- PyTorch - 安装
- 神经网络的数学基础
- PyTorch - 神经网络基础
- 机器学习的通用工作流程
- 机器学习与深度学习
- 实现第一个神经网络
- 神经网络到功能模块
- PyTorch - 术语
- PyTorch - 加载数据
- PyTorch - 线性回归
- PyTorch - 卷积神经网络
- PyTorch - 循环神经网络
- PyTorch - 数据集
- PyTorch - 卷积网络简介
- 从头开始训练卷积网络
- PyTorch - 卷积网络中的特征提取
- PyTorch - 卷积网络的可视化
- 使用卷积网络进行序列处理
- PyTorch - 词嵌入
- PyTorch - 递归神经网络
- PyTorch 有用资源
- PyTorch - 快速指南
- PyTorch - 有用资源
- PyTorch - 讨论
PyTorch - 循环神经网络
循环神经网络是一种面向深度学习的算法,它遵循顺序方法。在神经网络中,我们总是假设每个输入和输出都独立于所有其他层。这类神经网络被称为循环神经网络,因为它们以顺序方式执行数学计算,一个任务接一个任务地完成。
下图说明了循环神经网络的完整方法和工作原理:
在上图中,c1、c2、c3 和 x1 被视为输入,其中包括一些隐藏的输入值,例如 h1、h2 和 h3,它们分别输出 o1。现在,我们将重点介绍如何使用 PyTorch 和循环神经网络来创建正弦波。
在训练过程中,我们将采用一次一个数据点的训练方法来训练我们的模型。输入序列 x 包含 20 个数据点,目标序列被认为与输入序列相同。
步骤 1
导入使用以下代码实现循环神经网络所需的包:
import torch from torch.autograd import Variable import numpy as np import pylab as pl import torch.nn.init as init
步骤 2
我们将设置模型超参数,输入层的大小设置为 7。将有 6 个上下文神经元和 1 个输入神经元来创建目标序列。
dtype = torch.FloatTensor input_size, hidden_size, output_size = 7, 6, 1 epochs = 300 seq_length = 20 lr = 0.1 data_time_steps = np.linspace(2, 10, seq_length + 1) data = np.sin(data_time_steps) data.resize((seq_length + 1, 1)) x = Variable(torch.Tensor(data[:-1]).type(dtype), requires_grad=False) y = Variable(torch.Tensor(data[1:]).type(dtype), requires_grad=False)
我们将生成训练数据,其中 x 是输入数据序列,y 是所需的目标序列。
步骤 3
在循环神经网络中,权重使用均值为零的正态分布进行初始化。W1 将表示接受输入变量,w2 将表示生成的输出,如下所示:
w1 = torch.FloatTensor(input_size, hidden_size).type(dtype) init.normal(w1, 0.0, 0.4) w1 = Variable(w1, requires_grad = True) w2 = torch.FloatTensor(hidden_size, output_size).type(dtype) init.normal(w2, 0.0, 0.3) w2 = Variable(w2, requires_grad = True)
步骤 4
现在,重要的是为前馈创建一个函数,该函数唯一地定义了神经网络。
def forward(input, context_state, w1, w2): xh = torch.cat((input, context_state), 1) context_state = torch.tanh(xh.mm(w1)) out = context_state.mm(w2) return (out, context_state)
步骤 5
下一步是开始循环神经网络正弦波实现的训练过程。外循环遍历每个循环,内循环遍历序列的元素。在这里,我们还将计算均方误差 (MSE),这有助于预测连续变量。
for i in range(epochs): total_loss = 0 context_state = Variable(torch.zeros((1, hidden_size)).type(dtype), requires_grad = True) for j in range(x.size(0)): input = x[j:(j+1)] target = y[j:(j+1)] (pred, context_state) = forward(input, context_state, w1, w2) loss = (pred - target).pow(2).sum()/2 total_loss += loss loss.backward() w1.data -= lr * w1.grad.data w2.data -= lr * w2.grad.data w1.grad.data.zero_() w2.grad.data.zero_() context_state = Variable(context_state.data) if i % 10 == 0: print("Epoch: {} loss {}".format(i, total_loss.data[0])) context_state = Variable(torch.zeros((1, hidden_size)).type(dtype), requires_grad = False) predictions = [] for i in range(x.size(0)): input = x[i:i+1] (pred, context_state) = forward(input, context_state, w1, w2) context_state = context_state predictions.append(pred.data.numpy().ravel()[0])
步骤 6
现在,是时候绘制正弦波了,就像我们需要的那样。
pl.scatter(data_time_steps[:-1], x.data.numpy(), s = 90, label = "Actual") pl.scatter(data_time_steps[1:], predictions, label = "Predicted") pl.legend() pl.show()
输出
上述过程的输出如下:
广告