預測一個正弦曲線的下一段的波形
例如輸入[0,49]的值,要求預測[1,50]的值
我們這是數字數據,就不需要embedding了,所以word_vec也就是1
batch也就是1,沒有多個
word_num即sequence設置爲50,就是1次喂50個點的數據
所以,輸入數據的shape是[1,50,1],這裏採用的是第②種表達方式
start是開始的點
import numpy as np import torch import torch.nn as nn import torch.optim as optim from matplotlib import pyplot as plt num_time_steps = 50 input_size = 1 hidden_size = 16 output_size = 1 lr=0.01 class Net(nn.Module): def __init__(self, ): super(Net, self).__init__() self.rnn = nn.RNN( input_size=input_size, hidden_size=hidden_size, num_layers=1, batch_first=True, ) for p in self.rnn.parameters(): nn.init.normal_(p, mean=0.0, std=0.001) self.linear = nn.Linear(hidden_size, output_size) def forward(self, x, hidden_prev): #hidden_prev是h0 out, hidden_prev = self.rnn(x, hidden_prev) # [b, seq, h] out = out.view(-1, hidden_size) #把out打平 out = self.linear(out) out = out.unsqueeze(dim=0) #插入一個新的維度,因爲後面要和y做MSE比較 return out, hidden_prev model = Net() criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr) hidden_prev = torch.zeros(1, 1, hidden_size) #h0 for iter in range(6000): start = np.random.randint(3, size=1)[0] time_steps = np.linspace(start, start + 10, num_time_steps) data = np.sin(time_steps) data = data.reshape(num_time_steps, 1) x = torch.tensor(data[:-1]).float().view(1, num_time_steps - 1, 1) y = torch.tensor(data[1:]).float().view(1, num_time_steps - 1, 1) output, hidden_prev = model(x, hidden_prev) hidden_prev = hidden_prev.detach() #將x和h0送進去得到output,output又和y進行MSE誤差更新 loss = criterion(output, y) model.zero_grad() loss.backward() optimizer.step() if iter % 100 == 0: print("Iteration: {} loss {}".format(iter, loss.item())) start = np.random.randint(3, size=1)[0] #start在0-3之間隨機地初始化,只會取0,1,2 time_steps = np.linspace(start, start + 10, num_time_steps)#將[start,start+10]的波形作爲一個輸入,在其中採樣50個點 data = np.sin(time_steps) data = data.reshape(num_time_steps, 1) #reshape成50行1列 x = torch.tensor(data[:-1]).float().view(1, num_time_steps - 1, 1) y = torch.tensor(data[1:]).float().view(1, num_time_steps - 1, 1) #首先x和y都是sin函數的函數值,y是相當於x的x軸整體向右平移了一個得到的 predictions = [] input = x[:, 0, :] #由input得到predict點,在作爲下一個的input,...... for _ in range(x.shape[1]): input = input.view(1, 1, 1) (pred, hidden_prev) = model(input, hidden_prev) input = pred predictions.append(pred.detach().numpy().ravel()[0]) x = x.data.numpy().ravel() y = y.data.numpy() plt.scatter(time_steps[:-1], x.ravel(), s=90) plt.plot(time_steps[:-1], x.ravel()) plt.scatter(time_steps[1:], predictions) plt.show()
深度學習與神經網絡 之 時間序列預測實戰(RNN)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.