Pytorch 简明教程
PyTorch - Recurrent Neural Network
递归神经网络是一种面向深度学习的算法,采用顺序方法。在神经网络中,我们总是假设每个输入和输出都与所有其他层无关。这类神经网络被称为递归,因为它们以顺序方式执行数学计算,逐个完成任务。
下图说明了递归神经网络的完整方法和工作原理——
在上图中,c1、c2、c3 和 x1 被视为包含一些隐藏输入值的输入,即 h1、h2 和 h3,提供 o1 的相应输出。我们现在将重点放在实施 PyTorch 以借助递归神经网络创建正弦波。
在训练期间,我们将以一次一个数据点的方式对模型遵循训练方法。输入序列 x 由 20 个数据点组成,并且目标序列被认为与输入序列相同。
Step 1
导入必要的包以使用以下代码实现递归神经网络——
import torch
from torch.autograd import Variable
import numpy as np
import pylab as pl
import torch.nn.init as init
Step 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 是所需的目标序列。
Step 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)
Step 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)
Step 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])