創建LSTM模型

二 創建LSTM模型 

class RNN(nn.Module):
  def __init__(self):
    super(RNN,self).__init__() #面向對象中的繼承
    self.lstm = nn.LSTM(2,6,2) #輸入數據2個特徵維度,6個隱藏層維度,2個LSTM串聯,第二個LSTM接收第一個的計算結果
    self.out = nn.Linear(6,1) #線性擬合,接收數據的維度爲6,輸出數據的維度爲1

  def forward(self,x):
    x1,_ = self.lstm(x)
    a,b,c = x1.shape
    out = self.out(x1.view(-1,c)) #因爲線性層輸入的是個二維數據,所以此處應該將lstm輸出的三維數據x1調整成二維數據,最後的特徵維度不能變
    out1 = out.view(a,b,-1) #因爲是循環神經網絡,最後的時候要把二維的out調整成三維數據,下一次循環使用
    return out1

 rnn = RNN()

#參數尋優,計算損失函數

optimizer = torch.optim.Adam(rnn.parameters(),lr = 0.02)
loss_func = nn.MSELoss()

 

原始數據

時間序列問題: 時間的那一列是不代入訓練或者測試的,所以時間列可以刪除。是用前幾行的預測下一行的。

通俗點[1,2,3,4,5,6,7],可以通過1,2,3預測出4,。然後2,3,4預測出5.訓練的時候跟時間列沒關係

df1 = pd.read_excel(r'D:\Personal\cs3h.xlsx')

一  數據準備

datas = df1.values

#歸一化處理,這一步必不可少,不然後面訓練數據誤差會很大,模型沒法用
max_value = np.max(datas)
min_value = np.min(datas)
scalar = max_value - min_value
datas = list(map(lambda x: x / scalar, datas))

#數據集和目標值賦值,dataset爲數據,look_back爲以幾行數據爲特徵維度數量

def creat_dataset(dataset,look_back):
  data_x = []
  data_y = []
  for i in range(len(dataset)-look_back):
    data_x.append(dataset[i:i+look_back])
    data_y.append(dataset[i+look_back])
  return np.asarray(data_x), np.asarray(data_y) #轉爲ndarray數據

#以2爲特徵維度,得到數據集
dataX, dataY = creat_dataset(datas,2)

train_size = int(len(dataX)*0.7)

x_train = dataX[:train_size] #訓練數據
y_train = dataY[:train_size] #訓練數據目標值

x_train = x_train.reshape(-1, 1, 2) #將訓練數據調整成pytorch中lstm算法的輸入維度
y_train = y_train.reshape(-1, 1, 1)  #將目標值調整成pytorch中lstm算法的輸出維度

#將ndarray數據轉換爲張量,因爲pytorch用的數據類型是張量
x_train = torch.from_numpy(x_train)
y_train = torch.from_numpy(y_train)

三 訓練模型 

for i in range(1000):
  var_x = Variable(x_train).type(torch.FloatTensor)
  var_y = Variable(y_train).type(torch.FloatTensor)
  out = rnn(var_x)
  loss = loss_func(out,var_y)
  optimizer.zero_grad()
  loss.backward()
  optimizer.step()
  if (i+1)%100==0:
    print('Epoch:{}, Loss:{:.5f}'.format(i+1, loss.item()))

 

四 模型測試

#準備測試數據
dataX1 = dataX.reshape(-1,1,2)
dataX2 = torch.from_numpy(dataX1)
var_dataX = Variable(dataX2).type(torch.FloatTensor)

pred = rnn(var_dataX)
pred_test = pred.view(-1).data.numpy()  #轉換成一維的ndarray數據,這是預測值; dataY爲真實值

 

From: 

Pytorch循環神經網絡LSTM時間序列預測風速

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章