二 創建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時間序列預測風速