Kerasを使用したLSTMのinput_shapeパラメーターについて


20

「シーケンス分類用のStacked LSTM」という名前のKerasのドキュメントに記載されている例を使用しようとしています(以下のコードを参照)input_shape、データのコンテキストでパラメーターを把握できません。

入力として、最大長31のパディングされたシーケンスに整数でエンコードされた25の可能な文字のシーケンスのマトリックスがあります。その結果、my x_trainはshapeの(1085420, 31)意味を持ち(n_observations, sequence_length)ます。

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

data_dim = 16
timesteps = 8
num_classes = 10

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# Generate dummy training data
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))

# Generate dummy validation data
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))

model.fit(x_train, y_train,
          batch_size=64, epochs=5,
          validation_data=(x_val, y_val))

このコードでx_trainは、(1000, 8, 16)16要素の8配列の1000配列の配列のように、形状を持ちます。そこで私は、データが何であり、どのようにデータがこの形に到達するかについて完全に迷います。

KerasのドキュメントとさまざまなチュートリアルとQ&Aを見ると、明らかな何かを見逃しているようです。誰かが私に何を探すべきかのヒントをくれますか?

ご協力いただきありがとうございます !

回答:


23

LSTMの形状は厳しいので、気分を悪くしないでください。自分でそれらと戦うのに数日費やさなければなりませんでした。

入力には31文字のタイムステップがあり、それぞれが1文字であるため、データを一度に1文字ずつフィードする場合、入力形状は(31,1)になります。x_trainを(1085420、31)から(1085420、31,1)に変更する必要がありますが、これは次のコマンドで簡単に実行できます。

 x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],1))

2

このgitリポジトリLSTM Kerasの概要図を確認してください。すべてを明確にする必要があります。

このgitリポジトリには、以下を示すKeras LSTMの概要図が含まれています。

  • 以下のようなパラメータを使用しますreturn_sequencesbatch_sizetime_step...
  • lstm層の実際の構造
  • ケラのこれらの層の概念
  • モデル要件に合わせて入力データと出力データを操作する方法LSTMのレイヤーをスタックする方法

もっと


@MohammadFneish、ありがとうございます。これは、今ではもっと役立つようです。しかし、これは有用な提案とは対照的に、これが質問に対するかなりの答えであることは明らかではありません。Cross Validatedは、フォーラムではなくQ&Aサイトであることに注意してください。[さらに]情報を追加して、入力形状パラメーターを説明できますか?
gung-モニカの復職

3
@gung標準を維持するためにこれらの回答を確認する方法を本当に感謝していますが、技術的な詳細が多くあるこれらのパラメータについてはこれ以上詳しく説明できないと思います。私の答えは、必ずしもこの特定の問題ではなく、keras入力で同様の問題に直面している開発者にとって役立つと思います。ありがとう
モハマド・フニッシュ

1

私はそれがあなたの質問に対する直接的な答えではないことを知っています。これは、LSTMセルが1つしかない単純化された例であり、入力データの形状変更操作を理解するのに役立ちます。

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
import numpy as np

# define model
inputs1 = Input(shape=(2, 3))
lstm1, state_h, state_c = LSTM(1, return_sequences=True, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])

# define input data
data = np.random.rand(2, 3)
data = data.reshape((1,2,3))

# make and show prediction
print(model.predict(data))

これは、単一のLSTMセルと特定の形状の入力データを持つLSTMネットワークの例です。

結局のところ、ここでは単に予測しているだけであり、簡単にするためにトレーニングはありませんが、predictメソッドの前にデータを再構成する(ディメンションを追加する)必要があるかを見てください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.