下面的图表指定了循环神经网络的完整方法和工作:
在上图中,c1、c2、c3、x1被认为是输入,其中包含了一些隐藏的输入值,即h1、h2、h3分别交付o1的输出。现在我们将重点实现PyTorch,在循环神经网络的帮助下创建正弦波。
在训练期间,我们将采用每次只使用一个数据点的模型培训方法。输入序列x由20个数据点组成,目标序列被认为与输入序列相同。
1、导入PyTorch相关包
导入使用以下代码实现经常性神经网络的必要软件包:
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、定义神经网络的forward函数
现在,创建一个唯一定义神经网络的forward函数是很重要的:
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)
下一步是开始循环神经网络正弦波实现的训练程序。外部循环遍历每个循环,内部循环遍历序列元素。在这里,我们也将计算均方误差(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、Step 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()
输出
上述过程的输出如下: