長短期記憶(LSTM)系列_LSTM的資料準備(7)——總結(完結)
阿新 • • 發佈:2018-12-08
以下是 《長短期記憶(LSTM)系列_LSTM的資料準備》 專題的概況圖
本專題包含6篇文章:
長短期記憶(LSTM)系列_LSTM的資料準備(1)——如何重塑Keras中長短期記憶體網路的輸入資料
長短期記憶(LSTM)系列_LSTM的資料準備(2)——如何編寫OneHotEncoder(熱編碼)序列資料
長短期記憶(LSTM)系列_LSTM的資料準備(3)——如何使用差分法消除資料的趨勢和季節性
長短期記憶(LSTM)系列_LSTM的資料準備(4)——如何歸一化標準化長短期記憶網路的資料
長短期記憶(LSTM)系列_LSTM的資料準備(5)——如何配置Keras中截斷反向傳播預測的輸入序列步長
長短期記憶(LSTM)系列_LSTM的資料準備(6)——如何處理序列預測問題中的缺失時間步長(附兩個完整LSTM例項)
前置課程為:
長短期記憶(LSTM)系列_1.1、迴歸神經網路在時間序列預測中的介紹和應用
長短期記憶(LSTM)系列_2.1~2.3、用遞迴神經網路簡要介紹序列預測模型
長短期記憶(LSTM)系列_3.1~3.3、第一個LSTM小例子:Keras中長短期記憶模型的5個核心步驟(python)
下面一個是完整的LSTM例項,每一步的結果和說明都在註釋中
閱讀完本文基本可以對LSTM有一個清晰的理解
同時自己能寫出一個最簡單完整的LSTM程式
這裡《LSTM的資料準備》這個專題到此就結束了,我們準備下一個專題的學習《使用LSTM建模》
from pandas import DataFrame from pandas import concat from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM # 建立一個0.1~0.9的序列[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] length = 10 sequence = [i/float(length) for i in range(length)] print(sequence) # 構建一個X->y的對映關係 """DataFrame方法可以把一個數組序列轉換成一個有序編碼的矩陣序列 0 0 0.0 1 0.1 2 0.2 3 0.3 4 0.4 5 0.5 6 0.6 7 0.7 8 0.8 9 0.9 """ df = DataFrame(sequence) print(df) """concat是一個連結方法,把多個數據拼接起來,axis=1就相當於把資料按照行對應拼接起來 DataFrame.shift是一個位移函式,df.shift(1)就相當於將df序列向下整體移動一位,第一位用NAN值補上。 0 0 0 NaN 0.0 1 0.0 0.1 2 0.1 0.2 3 0.2 0.3 4 0.3 0.4 5 0.4 0.5 6 0.5 0.6 7 0.6 0.7 8 0.7 0.8 9 0.8 0.9 """ df = concat([df.shift(1), df], axis=1) print(df) """刪除資料中為NAN的資料 0 0 1 0.0 0.1 2 0.1 0.2 3 0.2 0.3 4 0.3 0.4 5 0.4 0.5 6 0.5 0.6 7 0.6 0.7 8 0.7 0.8 9 0.8 0.9 """ df.dropna(inplace=True) print(df) # 使用reshape方法,把序列轉換為LSTM可識別的陣列格式 """將df這個矩陣序列中的有用值提取出來,變成一個二維的陣列資料 [[0. 0.1] [0.1 0.2] [0.2 0.3] [0.3 0.4] [0.4 0.5] [0.5 0.6] [0.6 0.7] [0.7 0.8] [0.8 0.9]] """ values = df.values print(values) """values[:, 0]是將陣列中第0列的所有行提取,賦值給X,values[:, 1]則是獲取第1列 [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8] (9,) """ X, y = values[:, 0], values[:, 1] print(X) print(X.shape) """pandas.reshape將一個一維陣列轉換成一個三維的資料型別,神經網路的輸入資料都是三維的 [[[0. ]] [[0.1]] [[0.2]] [[0.3]] [[0.4]] [[0.5]] [[0.6]] [[0.7]] [[0.8]]] (9, 1, 1) (9, 1, 1)代表9個樣本,每個樣本步長為1,並且有1個特徵值 """ X = X.reshape(len(X), 1, 1) print(X.shape) print(X) # 1. 定義網路型別,Sequential是一個引數容器 model = Sequential() # 由儲存器單元組成的LSTM迴圈層稱為LSTM(),input_shape(步長,特徵值),可以指定input_shape引數,該引數需要包含時間步長和特徵值的元組 model.add(LSTM(10, input_shape=(1,1))) # 通常跟隨LSTM層並用於輸出預測的完全連線層稱為Dense()。 model.add(Dense(1)) # 2. 編譯網路,設定損失引數 model.compile(optimizer='adam', loss='mean_squared_error') # 3. 呼叫網路開始訓練模型 history = model.fit(X, y, epochs=1000, batch_size=len(X), verbose=0) # 4. 評估網路 loss = model.evaluate(X, y, verbose=0) print(loss) # 5. 利用訓練好的模型,帶入原始的X進行單步預測 predictions = model.predict(X, verbose=0) print(predictions[:, 0]) # 建立一個0.1~0.9的序列 length = 10 sequence = [(i+5)/float(length) for i in range(length)] print(sequence) # 構建一個X->y的對映關係 df = DataFrame(sequence) df = concat([df.shift(1), df], axis=1) df.dropna(inplace=True) # 使用reshape方法,把序列轉換為LSTM可識別的陣列格式 values = df.values X, y = values[:, 0], values[:, 1] X = X.reshape(len(X), 1, 1) predictions = model.predict(X, verbose=0) print(predictions[:, 0])