如何為LSTM重新構建輸入資料(Keras)

2021-09-23 02:05:54 字數 4702 閱讀 5780

對於初入門的開發人員來說,這可能是非常困難的事情為

lstm

模型準備序列資料。通常入門的開發者會在有關如何定義

lstm

模型的輸入層這件事情上感到困惑。還有關於如何將可能是1d或

2d數字矩陣的序列資料轉換可以輸入到

lstm

輸入層所需的

3d格式的困難。

在本文中,你將了解如何將輸入層定義為

lstm

模型,以及如何重新構建可以輸入到

lstm

模型的輸入資料。

看完本文後,你將知道:

如何定義

lstm

的輸入層。

如何重塑

lstm

模型的一維序列資料並定義輸入層。

如何重塑

lstm

模型的多並行系列資料並定義輸入層。

1.lstm

輸入層。

2.具有單輸入樣本的

lstm

示例。

3.具有多個輸入特徵的

lstm

示例。

4.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

準備資料的例子。

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

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_shape(10

,1)的lstm

的輸入(

x )。

model = sequential()

model.add(lstm(32, input_shape=(10, 1)))

model.add(dense(1))

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

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

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_shape

(10,2

)作為lstm

的輸入(

x)使用。

model = sequential()

model.add(lstm(32, input_shape=(10, 2)))

model.add(dense(1))

接下來我列出了在為

lstm

準備輸入資料時可以幫助你的一些提示。

1.lstm

輸入層必須是3d。

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

3.lstm

輸入層由第乙個隱藏層上的

input_shape

引數定義。

4.所述input_shape

引數是限定的時間的步驟和特徵數量的兩個值的元組。

5.樣本數預設假定為大於1。

6.numpy

陣列中的

reshape

()函式可用於將你的1d或

2d資料重塑為3d。

7.reshape

()函式會將乙個元組作為新定義的形狀的引數。

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

recurrent layers keras api。

numpy reshape

()函式

api。

如何將時間序列轉換為

python

中的監督學習問題。

時間序列**作為監督學習。

如果你在lstm上有任何問題,可以去原文作者部落格與之交流。

本文由本文由北郵@愛可可-愛生活老師

推薦,@阿里云云棲社群組織翻譯。

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

文章為簡譯,更為詳細的內容,請檢視原文

如何為LSTM重新構建輸入資料(Keras)

分步閱讀 對於初入門的開發人員來說,這可能是非常困難的事情為lstm模型準備序列資料。通常入門的開發者會在有關如何定義lstm模型的輸入層這件事情上感到困惑。還有關於如何將可能是1d或2d數字矩陣的序列資料轉換可以輸入到lstm輸入層所需的3d格式的困難。在本文中,你將了解如何將輸入層定義為lstm...

如何為LSTM重新構建輸入資料(Keras)

對於初入門的開發人員來說,這可能是非常困難的事情為 lstm 模型準備序列資料。通常入門的開發者會在有關如何定義 lstm 模型的輸入層這件事情上感到困惑。還有關於如何將可能是1d或 2d數字矩陣的序列資料轉換可以輸入到 lstm 輸入層所需的 3d格式的困難。在本文中,你將了解如何將輸入層定義為 ...

重新思考資料輸入

在目前的產品互動中,輸入資料然後程式或者產品對資料進行驗證是非常常見的需求,而產品進行驗證的目的性也很明確,就是為了避免髒資料進入資料庫。但是從產品互動本身來講,產品是為了讓使用者更加準確的 簡單的使用乙個功能,而不是在出錯或者使用者目的很明確的時候告訴他輸入錯誤了。資料完整換句話就是產品對資料庫中...