Kerasでの多対一および多対多のLSTMの例


107

私はLSTMと、それらをKerasで構築する方法を理解しようとしています。私は、RNNを実行するために主に4つのモードがあることを発見しました(図の4つの正しいモード)

ここに画像の説明を入力してください 画像ソース:Andrej Karpathy

さて、それぞれのミニマルなコードスニペットがKerasでどのように見えるのかと思います。だから何かのような

model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, data_dim)))
model.add(Dense(1))

4つのタスクのそれぞれについて、少しの説明があるかもしれません。

回答:


120

そう:

  1. 1対1Denseシーケンスを処理していないため、レイヤーを使用できます。

    model.add(Dense(output_size, input_shape=input_shape))
  2. 1対多:このオプションはサポートされていません。モデルのチェーンはで簡単ではないKerasため、次のバージョンが最も簡単です。

    model.add(RepeatVector(number_of_times, input_shape=input_shape))
    model.add(LSTM(output_size, return_sequences=True))
  3. 多対1:実際、コードスニペットは(ほぼ)このアプローチの例です。

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim)))
  4. 多対多:これは、入力と出力の長さが繰り返しステップの数と一致する場合に最も簡単なスニペットです。

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
  5. ステップ数が入力/出力長と異なる場合の多対多:これはKerasでは非常に困難です。それをコーディングする簡単なコードスニペットはありません。

編集:広告5

私の最近のアプリケーションの1つで、4番目の画像の多対多に似たものを実装しました。次のアーキテクチャのネットワークが必要な場合(入力が出力より長い場合):

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | | | | 
                                  O O O O O O

これは次の方法で実現できます。

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
    model.add(Lambda(lambda x: x[:, -N:, :]

Nカバーしたい最後のステップの数はどこですか(画像N = 3)。

この時点から:

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | 
                                  O O O 

適切なサイズに調整するために、ベクトルなどNを使用して長さの人工的なパディングシーケンスと同じくらい簡単0です。


10
1つの明確化:たとえば、多対1の場合、LSTM(1、input_shape =(timesteps、data_dim)))を使用しますと言うと、512ノードよりも、(私は似たようなものを読んだので、model.add(LSTM(512、input_shape = ...))で行われるだろうと思いました)model.add(Dense(1))それよりも何に使用されているのですか?)
Luca Thiede

1
この場合-あなたのコード-タイプミスを修正した後でも大丈夫です。
MarcinMożejko2017年

最初のエントリが1 = 0で他のすべてのエントリが0のベクトルではなく、RepeatVectorを使用する理由(上の図によると、後の状態では入力はまったくなく、常に同じ入力であるとは限りません)、 Repeat Vectorが私の理解で何をするか)
Luca Thiede 2017年

1
この図について注意深く検討すると、これは1対多の概念の概念的な提示にすぎません。このすべての非表示のユニット、何かを入力として受け入れる必要があります。つまり、最初の入力が等しいx、他の入力が等しい入力と同じ入力を受け入れる可能性があり0ます。しかし、その一方で、彼らは同じxことが何度も繰り返されることを受け入れるかもしれません。別のアプローチは、で難しいモデルをチェーンすることですKeras。私が提供したオプションは、での1対多アーキテクチャの最も簡単なケースですKeras
MarcinMożejko2017年

いいね!LSTM N to NをGANアーキテクチャで使用することを考えています。LSTMベースのジェネレーターを用意します。このジェネレーター(ガンの「潜在変数」で使用される)を時系列の前半に指定し、このジェネレーターが時系列の後半を生成します。次に、2つの半分(実際と生成)を組み合わせて、ガンの「偽の」入力を生成します。あなたのpoin 4を使用するとうまくいくと思いますか?または、言い換えると、これ(ソリューション4)はこれを行う正しい方法ですか?
rjpg '19年

6

@MarcinMożejkoによる素晴らしい答え

私は考えNR.5に以下を追加します(長さアウト/内の別の持つ多くの多くの):

A)バニラLSTMとして

model = Sequential()
model.add(LSTM(N_BLOCKS, input_shape=(N_INPUTS, N_FEATURES)))
model.add(Dense(N_OUTPUTS))

B)エンコーダー/デコーダーLSTMとして

model.add(LSTM(N_BLOCKS, input_shape=(N_INPUTS, N_FEATURES))  
model.add(RepeatVector(N_OUTPUTS))
model.add(LSTM(N_BLOCKS, return_sequences=True))  
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear')) 

1
B) Encoder-Decoder LSTMアーキテクチャの詳細について説明していただけますか?「RepeatVector」/「TimeDistributed」ステップの役割を理解するのに問題があります。
Marsellus Wallace
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.