閱讀574 返回首頁    go 阿裏雲 go 技術社區[雲棲]


如何為LSTM重新構建輸入數據(Keras)

更多深度文章,請關注:https://yq.aliyun.com/cloud


對於初入門的開發人員來說,這可能是非常困難的事情為LSTM模型準備序列數據。通常入門的開發者會在有關如何定義LSTM模型的輸入層這件事情上感到困惑。還有關於如何將可能是1D2D數字矩陣的序列數據轉換可以輸入到LSTM輸入層所需的3D格式的困難。

ce0b6e9908098ed2a7549567962228006192e65f

在本文中,你將了解如何將輸入層定義為LSTM模型,以及如何重新構建可以輸入到LSTM模型的輸入數據。

看完本文後,你將知道:

如何定義LSTM的輸入層。

如何重塑LSTM模型的一維序列數據並定義輸入層。

如何重塑LSTM模型的多並行係列數據並定義輸入層。

教程概述

本文分為4部分:

1.LSTM輸入層。

2.具有單輸入樣本的LSTM示例。

3.具有多個輸入特征的LSTM示例。

4.LSTM輸入提示。

LSTM輸入層

LSTM輸入層是由神經網絡第一個隱藏層上的“ input_shape ”參數指定的。這可能會讓初學者感到困惑。例如,以下是具有一個隱藏的LSTM層和一個密集輸出層組成的神經網絡示例。

model = Sequential()
model.add(LSTM(32))
model.add(Dense(1))

在這個例子中,我們可以看到LSTM()層必須指定輸入的形狀。而且每個LSTM層的輸入必須是三維的。這輸入的三個維度是:

樣品。一個序列是一個樣本。批次由一個或多個樣本組成。

時間步。一個時間步代表樣本中的一個觀察點。

特征。一個特征是在一個時間步長的觀察得到的。

這意味著輸入層在擬合模型時以及在做出預測時,對數據的要求必須是3D數組,即使數組的特定維度僅包含單個值。

當定義LSTM網絡的輸入層時,網絡假設你有一個或多個樣本,並會給你指定時間步長和特征數量。你可以通過修改“ input_shape ”的參數修改時間步長和特征數量。例如,下麵的模型定義了包含一個或多個樣本,50個時間步長和2個特征的輸入層。

model = Sequential()
model.add(LSTM(32, input_shape=(50, 2)))
model.add(Dense(1))

現在我們知道如何定義LSTM輸入層,接下來我們來看一些我們如何為LSTM準備數據的例子。

具有單輸入樣本的LSTM示例

考慮到你可能會有多個時間步驟和一個特征序列的情況,所以我們先從這種情況講起。例如,這是一個包含10個數字的序列:

0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0

我們可以將這個數字序列定義為NumPy數組。

from numpy import array
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])

然後,我們可以使用NumPy數組中的reshape()函數將這個一維數組重構為三維數組,每個時間步長為1個樣本,那麼我們需要10個時間步長和1個特征。

在數組上調用的reshape()函數需要一個參數,它是定義數組新形狀的元組。我們不能幹涉數據的重塑,重塑必須均勻地重組數組中的數據。

data = data.reshape((1, 10, 1))

一旦重塑,我們可以打印陣列的新形狀。

print(data.shape)

完整的例子如下:

from numpy import array
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
data = data.reshape((1, 10, 1))
print(data.shape)

運行示例打印單個樣本的新3D形狀:

(1, 10, 1)
該數據現在可以為input_shape101)的LSTM的輸入(X)。
model = Sequential()
model.add(LSTM(32, input_shape=(10, 1)))
model.add(Dense(1))

具有多個輸入功能的LSTM示例

你的模型可能有多個並行數據作為輸入的情況,接下來我們來看看這種情況。

例如,這可以是兩個並行的10個值:

series 1: 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0

series 2: 1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1

我們可以將這些數據定義為具有10行的2列的矩陣:

from numpy import array
data = array([
	[0.1, 1.0],
	[0.2, 0.9],
	[0.3, 0.8],
	[0.4, 0.7],
	[0.5, 0.6],
	[0.6, 0.5],
	[0.7, 0.4],
	[0.8, 0.3],
	[0.9, 0.2],
	[1.0, 0.1]])

該數據可以被設置為1個樣本,具有10個時間步長和2個特征。

它可以重新整形為3D陣列,如下所示:

data = data.reshape(1, 10, 2)

完整的例子如下:

from numpy import array
data = array([
	[0.1, 1.0],
	[0.2, 0.9],
	[0.3, 0.8],
	[0.4, 0.7],
	[0.5, 0.6],
	[0.6, 0.5],
	[0.7, 0.4],
	[0.8, 0.3],
	[0.9, 0.2],
	[1.0, 0.1]])
data = data.reshape(1, 10, 2)
print(data.shape)

運行示例打印單個樣本的新3D形狀。

(1, 10, 2)

該數據現在可以為input_shape10,2)作為LSTM的輸入(X)使用。

model = Sequential()
model.add(LSTM(32, input_shape=(10, 2)))
model.add(Dense(1))

LSTM輸入提示

接下來我列出了在為LSTM準備輸入數據時可以幫助你的一些提示。

1.LSTM輸入層必須是3D

2.3個輸入尺寸的含義是:樣本,時間步長和特征。

3.LSTM輸入層由第一個隱藏層上的input_shape參數定義。

4.所述input_shape參數是限定的時間的步驟和特征數量的兩個值的元組。

5.樣本數默認假定為大於1

6.NumPy數組中的reshape()函數可用於將你的1D2D數據重塑為3D

7.reshape()函數會將一個元組作為新定義的形狀的參數。

進一步閱讀

如果你進一步了解,本部分將提供有關該主題的更多資源。

Recurrent Layers Keras API

Numpy reshape()函數API

如何將時間序列轉換為Python中的監督學習問題

時間序列預測作為監督學習


如果你在LSTM上有任何問題,可以去原文作者博客與之交流。

本文由本文由北郵@愛可可-愛生活老師推薦,@阿裏雲雲棲社區組織翻譯。

文章原標題《How to Reshape Input Data for Long Short-Term Memory Networks in Keras

作者:Jason Brownlee    

作者博客地址:https://machinelearningmastery.com/blog/

譯者:袁虎 審閱:主題曲哥哥

文章為簡譯,更為詳細的內容,請查看原文








最後更新:2017-09-05 12:02:44

  上一篇:go  阿裏巴巴創新中心發起2017人工智能領域TOP20·投資人評選
  下一篇:go  機房環境與機櫃有多少關係?