1. 程式人生 > >長短期記憶(LSTM)系列_LSTM的資料準備(7)——總結(完結)

長短期記憶(LSTM)系列_LSTM的資料準備(7)——總結(完結)

以下是 《長短期記憶(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])