web-dev-qa-db-ja.com

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

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

enter image description here 画像ソース: Andrej Karpathy

今、私はそれらのそれぞれの最小限のコードスニペットがケラスでどのように見えるのだろうかと思います。のようなもの

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

4つのタスクのそれぞれについて、おそらく少し説明があります。

80
Luca Thiede

そう:

  1. 1対1:シーケンスを処理していないため、Denseレイヤーを使用できます。
    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))
  1. 多対一:実際、コードスニペットは(ほぼ)このアプローチの例です。
    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim)))
  1. 多対多:これは、入力と出力の長さが反復ステップの数と一致する場合に最も簡単なスニペットです。
    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
  1. ステップ数が入力/出力の長さと異なる場合は多対多:これはKerasでは非常に困難です。それをコーディングする簡単なコードスニペットはありません。

編集:広告5

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

                                        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ベクトルを使用して、適切なサイズに調整します。

81
Marcin Możejko

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

私はNR.5に以下を追加(異なる長さのin/outを持つ多くの多く):

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')) 
0
gustavz