LSTMとKerasでLSTMを構築する方法を理解しようとしています。私は、RNNを実行するための4つのモードが主に存在することを発見しました(図の正しい4つのモード)
画像ソース: Andrej Karpathy
今、私はそれらのそれぞれの最小限のコードスニペットがケラスでどのように見えるのだろうかと思います。のようなもの
model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, data_dim)))
model.add(Dense(1))
4つのタスクのそれぞれについて、おそらく少し説明があります。
そう:
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))
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim)))
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
編集:広告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
ベクトルを使用して、適切なサイズに調整します。
@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'))