1. ホーム
  2. machine-learning

[解決済み] Kerasにおける多対一および多対多のLSTMの例

2022-05-05 13:40:51

質問

私はLSTMとそれをKerasで構築する方法について理解しようとしています。RNNを実行するには、主に4つのモードがあることがわかりました(写真の右4つ)。

画像の出典はこちら アンドレイ・カルパシー

さて、それぞれの最小限のコードスニペットは、Kerasではどのように見えるのでしょう。 つまり、以下のようなものです。

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

を4つのタスクのそれぞれについて、たぶん少し説明を加えてください。

どのように解決するのか?

だから

  1. 1対1 : を使用することができます。 Dense レイヤーは、シーケンスを処理しないので

    model.add(Dense(output_size, input_shape=input_shape))
    
    
  2. 一対多 でモデルを連結するのはあまり簡単ではないので、このオプションはあまりサポートされていません。 Keras そのため、以下のバージョンが最も簡単なものとなっています。

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

    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

最近のあるアプリケーションで、次のようなものを実装しました。 多対多 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:, :])) #Select last N from output

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

になるここから。

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

は、長さの人工的なパディング列と同じくらい単純です。 N を使って、例えば 0 ベクターを使って、適切なサイズに調整することができます。