Pytorch實現LSTM案例總結學習

目錄

前言

關鍵步驟主要分為數據準備和模型構建兩大部分,其中,

數據準備主要工作:

  • 1、訓練集和測試集得劃分
  • 2、訓練數據得歸一化
  • 3、規范輸入數據得格式

模型構建部分主要工作

1、構建網絡層、前向傳播forward()

class LSTM(nn.Module):#注意Module首字母需要大寫    def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):        super().__init__()        self.hidden_layer_size = hidden_layer_size        # 創建LSTM層和linear層,LSTM層提取特征,linear層用作最后得預測        # LSTM算法接受三個輸入:先前得隱藏狀態,先前得單元狀態和當前輸入。        self.lstm = nn.LSTM(input_size, hidden_layer_size)        self.linear = nn.Linear(hidden_layer_size, output_size)        #初始化隱含狀態及細胞狀態C,hidden_cell變量包含先前得隱藏狀態和單元狀態        self.hidden_cell = (torch.zeros(1, 1, self.hidden_layer_size),                            torch.zeros(1, 1, self.hidden_layer_size))                            # 為什么得第二個參數也是1                            # 第二個參數代表得應該是batch_size吧                            # 是因為之前對數據已經進行過切分了嗎?????    def forward(self, input_seq):    	#lstm得輸出是當前時間步得隱藏狀態ht和單元狀態ct以及輸出lstm_out        lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq), 1, -1), self.hidden_cell)        #按照lstm得格式修改input_seq得形狀,作為linear層得輸入        predictions = self.linear(lstm_out.view(len(input_seq), -1))        #返回predictions得最后一個元素        return predictions[-1]

定義好每層之后,最后還需要通過前向傳播得方式把這些串起來,這就涉及如何定義forward函數。

forward函數得任務需要把輸入層、網絡層、輸出層鏈接起來,實現信息得前向傳導。

forward該函數得參數一般為輸入數據,返回值是輸出數據。

2、實例化網絡,定義損失函數和優化器

#創建LSTM()類得對象,定義損失函數和優化器model = LSTM()loss_function = nn.MSELoss()optimizer = torch.optim.Adam(model.parameters(), lr=0.001)#建立優化器實例print(model)

3、訓練模型、反向傳播backward()

epochs = 150for i in range(epochs):    for seq, labels in train_inout_seq:        #清除網絡先前得梯度值        optimizer.zero_grad()        #初始化隱藏層數據        model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size),                             torch.zeros(1, 1, model.hidden_layer_size))        #實例化模型        y_pred = model(seq)                #計算損失,反向傳播梯度以及更新模型參數        #訓練過程中,正向傳播生成網絡得輸出,計算輸出和實際值之間得損失值        single_loss = loss_function(y_pred, labels)        single_loss.backward()#調用backward()自動生成梯度        optimizer.step()#使用optimizer.step()執行優化器,把梯度傳播回每個網絡    # 查看模型訓練得結果    if i%25 == 1:        print(f'epoch:{i:3} loss:{single_loss.item():10.8f}')print(f'epoch:{i:3} loss:{single_loss.item():10.10f}')

訓練模型時需要使模型處于訓練模式,即調用model.train()。

缺省情況下梯度是累加得,需要手工把梯度初始化或者清零,調用optimizer.zero_grad()。

在訓練過程中正向傳播生成網絡得輸出,計算輸出與實際值之間得損失值。調用loss.backward()自動生成反向傳播梯度,然后使用optimizer.step()執行優化器,把梯度傳播回每個網絡。

實現梯度反向傳播得方法主要是復合函數得鏈式法則。Pytorch提供了自動反向傳播得功能,使用nn工具箱,無需自己編寫反向傳播,直接讓損失函數調用backward()即可。

反向傳播中,優化器十分重要,這類優化算法通過使用參數得梯度值更新參數。

4、測試模型

fut_pred = 12test_inputs = train_data_normalized[-train_window:].tolist()#首先打印出數據列表得最后12個值print(test_inputs)#更改模型為測試或者驗證模式model.eval()#把training屬性設置為false,使模型處于測試或驗證狀態for i in range(fut_pred):    seq = torch.FloatTensor(test_inputs[-train_window:])    with torch.no_grad():        model.hidden = (torch.zeros(1, 1, model.hidden_layer_size),                        torch.zeros(1, 1, model.hidden_layer_size))        test_inputs.append(model(seq).item())#打印最后得12個預測值print(test_inputs[fut_pred:])#由于對訓練集數據進行了標準化,因此預測數據也是標準化了得#需要將歸一化得預測值轉換為實際得預測值。通過inverse_transform實現actual_predictions = scaler.inverse_transform(np.array(test_inputs[train_window:]).reshape(-1, 1))print(actual_predictions)

全部代碼如下:

import torchimport torch.nn as nnimport torch.nn.functional	import seaborn as snsimport numpy as npimport pandas as pdimport matplotlib.pyplot as plt"""導入數據"""flight_data = sns.load_dataset("flights")print(flight_data.head())print(flight_data.shape)#繪制每月乘客得出行頻率fig_size = plt.rcParams['figure.figsize']fig_size[0] = 15fig_size[1] = 5plt.rcParams['figure.figsize'] = fig_sizeplt.title('Month vs Passenger')plt.ylabel('Total Passengers')plt.xlabel('Months')plt.grid(True)plt.autoscale(axis='x',tight=True)plt.plot(flight_data['passengers'])plt.show()"""數據預處理"""flight_data.columns#顯示數據集中 列得數據類型all_data = flight_data['passengers'].values.astype(float)#將passengers列得數據類型改為float#劃分測試集和訓練集test_data_size = 12train_data = all_data[:-test_data_size]#除了最后12個數據,其他全取test_data = all_data[-test_data_size:]#取最后12個數據print(len(train_data))print(len(test_data))#最大最小縮放器進行歸一化,減小誤差,注意,數據標準化只應用于訓練數據而不應用于測試數據from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler(feature_range=(-1, 1))train_data_normalized = scaler.fit_transform(train_data.reshape(-1, 1))#查看歸一化之后得前5條數據和后5條數據print(train_data_normalized[:5])print(train_data_normalized[-5:])#將數據集轉換為tensor,因為PyTorch模型是使用tensor進行訓練得,并將訓練數據轉換為輸入序列和相應得標簽train_data_normalized = torch.FloatTensor(train_data_normalized).view(-1)#view相當于numpy中得resize,參數代表數組不同維得維度;#參數為-1表示,這個維得維度由機器自行推斷,如果沒有-1,那么view中得所有參數就要和tensor中得元素總個數一致#定義create_inout_sequences函數,接收原始輸入數據,并返回一個元組列表。def create_inout_sequences(input_data, tw):    inout_seq = []    L = len(input_data)    for i in range(L-tw):        train_seq = input_data[i:i+tw]        train_label = input_data[i+tw:i+tw+1]#預測time_step之后得第一個數值        inout_seq.append((train_seq, train_label))#inout_seq內得數據不斷更新,但是總量只有tw+1個    return inout_seqtrain_window = 12#設置訓練輸入得序列長度為12,類似于time_step = 12train_inout_seq = create_inout_sequences(train_data_normalized, train_window)print(train_inout_seq[:5])#產看數據集改造結果"""注意:create_inout_sequences返回得元組列表由一個個序列組成,每一個序列有13個數據,分別是設置得12個數據(train_window)+ 第13個數據(label)第一個序列由前12個數據組成,第13個數據是第一個序列得標簽。同樣,第二個序列從第二個數據開始,到第13個數據結束,而第14個數據是第二個序列得標簽,依此類推。""""""創建LSTM模型參數說明:1、input_size:對應得及特征數量,此案例中為1,即passengers2、output_size:預測變量得個數,及數據標簽得個數2、hidden_layer_size:隱藏層得特征數,也就是隱藏層得神經元個數"""class LSTM(nn.Module):#注意Module首字母需要大寫    def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):        super().__init__()        self.hidden_layer_size = hidden_layer_size        # 創建LSTM層和linear層,LSTM層提取特征,linear層用作最后得預測        ##LSTM算法接受三個輸入:先前得隱藏狀態,先前得單元狀態和當前輸入。        self.lstm = nn.LSTM(input_size, hidden_layer_size)        self.linear = nn.Linear(hidden_layer_size, output_size)        #初始化隱含狀態及細胞狀態C,hidden_cell變量包含先前得隱藏狀態和單元狀態        self.hidden_cell = (torch.zeros(1, 1, self.hidden_layer_size),                            torch.zeros(1, 1, self.hidden_layer_size))                            # 為什么得第二個參數也是1                            # 第二個參數代表得應該是batch_size吧                            # 是因為之前對數據已經進行過切分了嗎?????    def forward(self, input_seq):        lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq), 1, -1), self.hidden_cell)        #lstm得輸出是當前時間步得隱藏狀態ht和單元狀態ct以及輸出lstm_out        #按照lstm得格式修改input_seq得形狀,作為linear層得輸入        predictions = self.linear(lstm_out.view(len(input_seq), -1))        return predictions[-1]#返回predictions得最后一個元素"""forward方法:LSTM層得輸入與輸出:out, (ht,Ct)=lstm(input,(h0,C0)),其中一、輸入格式:lstm(input,(h0, C0))1、input為(seq_len,batch,input_size)格式得tensor,seq_len即為time_step2、h0為(num_layers * num_directions, batch, hidden_size)格式得tensor,隱藏狀態得初始狀態3、C0為(seq_len, batch, input_size)格式得tensor,細胞初始狀態二、輸出格式:output,(ht,Ct)1、output為(seq_len, batch, num_directions*hidden_size)格式得tensor,包含輸出特征h_t(源于LSTM每個t得最后一層)2、ht為(num_layers * num_directions, batch, hidden_size)格式得tensor,3、Ct為(num_layers * num_directions, batch, hidden_size)格式得tensor,"""#創建LSTM()類得對象,定義損失函數和優化器model = LSTM()loss_function = nn.MSELoss()optimizer = torch.optim.Adam(model.parameters(), lr=0.001)#建立優化器實例print(model)"""模型訓練batch-size是指1次迭代所使用得樣本量;epoch是指把所有訓練數據完整得過一遍;由于默認情況下權重是在PyTorch神經網絡中隨機初始化得,因此可能會獲得不同得值。"""epochs = 150for i in range(epochs):    for seq, labels in train_inout_seq:        #清除網絡先前得梯度值        optimizer.zero_grad()#訓練模型時需要使模型處于訓練模式,即調用model.train()。缺省情況下梯度是累加得,需要手工把梯度初始化或者清零,調用optimizer.zero_grad()        #初始化隱藏層數據        model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size),                             torch.zeros(1, 1, model.hidden_layer_size))        #實例化模型        y_pred = model(seq)        #計算損失,反向傳播梯度以及更新模型參數        single_loss = loss_function(y_pred, labels)#訓練過程中,正向傳播生成網絡得輸出,計算輸出和實際值之間得損失值        single_loss.backward()#調用loss.backward()自動生成梯度,        optimizer.step()#使用optimizer.step()執行優化器,把梯度傳播回每個網絡    # 查看模型訓練得結果    if i%25 == 1:        print(f'epoch:{i:3} loss:{single_loss.item():10.8f}')print(f'epoch:{i:3} loss:{single_loss.item():10.10f}')"""預測注意,test_input中包含12個數據,在for循環中,12個數據將用于對測試集得第一個數據進行預測,然后將預測值附加到test_inputs列表中。在第二次迭代中,最后12個數據將再次用作輸入,并進行新得預測,然后 將第二次預測得新值再次添加到列表中。由于測試集中有12個元素,因此該循環將執行12次。循環結束后,test_inputs列表將包含24個數據,其中,最后12個數據將是測試集得預測值。"""fut_pred = 12test_inputs = train_data_normalized[-train_window:].tolist()#首先打印出數據列表得最后12個值print(test_inputs)#更改模型為測試或者驗證模式model.eval()#把training屬性設置為false,使模型處于測試或驗證狀態for i in range(fut_pred):    seq = torch.FloatTensor(test_inputs[-train_window:])    with torch.no_grad():        model.hidden = (torch.zeros(1, 1, model.hidden_layer_size),                        torch.zeros(1, 1, model.hidden_layer_size))        test_inputs.append(model(seq).item())#打印最后得12個預測值print(test_inputs[fut_pred:])#由于對訓練集數據進行了標準化,因此預測數據也是標準化了得#需要將歸一化得預測值轉換為實際得預測值。通過inverse_transform實現actual_predictions = scaler.inverse_transform(np.array(test_inputs[train_window:]).reshape(-1, 1))print(actual_predictions)"""根據實際值,繪制預測值"""x = np.arange(132, 132+fut_pred, 1)plt.title('Month vs Passenger')plt.ylabel('Total Passengers')plt.xlabel('Months')plt.grid(True)plt.autoscale(axis='x', tight=True)plt.plot(flight_data['passengers'])plt.plot(x, actual_predictions)plt.show()#繪制最近12個月得實際和預測乘客數量,以更大得尺度觀測數據plt.title('Month vs Passenger')plt.ylabel('Total Passengers')plt.xlabel('Months')plt.grid(True)plt.autoscale(axis='x', tight=True)plt.plot(flight_data['passengers'][-train_window:])plt.plot(x, actual_predictions)plt.show()

到此這篇關于Pytorch實現LSTM案例總結學習得內容就介紹到這了,更多相關Pytorch實現LSTM內容請搜索之家以前得內容或繼續瀏覽下面得相關內容希望大家以后多多支持之家!

聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
發表評論
更多 網友評論1 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 欧美黑人xxxx| 99久久99久久久精品久久| 韩国太太的告白韩国电影| 杨幂下面好紧好湿好爽| 国产精品免费无遮挡无码永久视频| 亚洲综合色色图| 97色在线观看| 欧美极度极品另类| 国产精品真实对白精彩久久| 亚洲熟妇av一区二区三区宅男 | 亚洲一区在线视频观看| 污视频免费网站| 欧美乱人伦中文在线观看不卡| 国产精品成人99一区无码| 亚洲国产精久久久久久久| 男女一进一出无遮挡黄| 最近更新中文字幕影视| 国产成人涩涩涩视频在线观看免费 | 97高清国语自产拍中国大陆| 欧美精品一区二区久久| 国产美女视频网站| 亚洲人成在线播放网站岛国| 国产亚洲欧美在在线人成| 日韩成人免费视频| 国产乱了真实在线观看| 中国黄色免费网站| 粗大的内捧猛烈进出视频| 天堂а√中文最新版地址在线| 亚洲精品456在线播放| 两个人看的www免费| 日韩福利电影网| 国产69精品久久久久9999| 一个人免费视频观看在线www| 特级aaaaaaaaa毛片免费视频| 国产精品无码久久av| 久久综合九色欧美综合狠狠| 色综合天天综合网国产成人网| 好吊妞视频haodiaoniucom| 亚洲狠狠色丁香婷婷综合| 韩国一区二区视频| 成人午夜私人影院入口|