web-dev-qa-db-ja.com

Keras、RepeatVector、またはreturn_sequence = TrueのLSTMレイヤーを接続する方法

時系列用にケラスでエンコーダーモデルを開発しようとしています。データの形状は(5039、28、1)です。これは、私のseq_lenが28で、1つの機能があることを意味します。エンコーダーの最初のレイヤーでは、112個のハントを使用しています。2番目のレイヤーには56個あり、デコーダーの入力形状に戻ることができるように、28個のハントを持つ3番目のレイヤーを追加する必要がありました(このオートエンコーダーは再構築することになっています)その入力)。しかし、LSTMレイヤーを相互に接続するための正しいアプローチが何かはわかりません。私の知る限り、RepeatVectorまたはreturn_seq=Trueを追加できます。次のコードで両方のモデルを確認できます。何が違い、どのアプローチが正しいのでしょうか?

return_sequence=Trueを使用した最初のモデル:

inputEncoder = Input(shape=(28, 1))
firstEncLayer = LSTM(112, return_sequences=True)(inputEncoder)
snd = LSTM(56, return_sequences=True)(firstEncLayer)
outEncoder = LSTM(28)(snd)

context = RepeatVector(1)(outEncoder)
context_reshaped = Reshape((28,1))(context)

encoder_model = Model(inputEncoder, outEncoder)
firstDecoder = LSTM(112, return_sequences=True)(context_reshaped)
outDecoder = LSTM(1, return_sequences=True)(firstDecoder)

autoencoder = Model(inputEncoder, outDecoder)

RepeatVectorの2番目のモデル:

inputEncoder = Input(shape=(28, 1))
firstEncLayer = LSTM(112)(inputEncoder)
firstEncLayer = RepeatVector(1)(firstEncLayer)
snd = LSTM(56)(firstEncLayer)
snd = RepeatVector(1)(snd)
outEncoder = LSTM(28)(snd)
encoder_model = Model(inputEncoder, outEncoder)

context = RepeatVector(1)(outEncoder)
context_reshaped = Reshape((28, 1))(context)

firstDecoder = LSTM(112)(context_reshaped)
firstDecoder = RepeatVector(1)(firstDecoder)
sndDecoder = LSTM(28)(firstDecoder)

outDecoder = RepeatVector(1)(sndDecoder)
outDecoder = Reshape((28, 1))(outDecoder)

autoencoder = Model(inputEncoder, outDecoder)
10
Birish

それはあなたが解決しようとしている問題に依存しているので、あなたはおそらくあなた自身のためにどちらがより良いかを見なければならないでしょう。ただし、2つの方法の違いを説明します。

Difference <code>return_sequences=True</code> and RepeatVector 基本的に、return_sequences=Trueは、エンコーダーが過去に観測したすべての出力を返し、RepeatVectorは、エンコーダーの最後の出力を繰り返します。

39
thushv89