KerasでLSTMを使う時、inputのshapeは (batch_size, timesteps, input_dim) である必要があります。しかしLSTMの前に各time stepで特徴抽出するような層を追加したい場合、単に層を追加するだけではtimestepsが含まれるinput形式のデータを処理をすることが出来ません。
今回はこのような場合の対処方法について調べたので備忘録として残しておきます。
TimeDistributedを使う
各timestepで同じ処理を行いたい場合はTimeDistributedを使います。
追加したい層をTimeDistributedで囲むことによって実装することが出来ます。
実行例
LSTMの処理の前にDenseを入れたモデルを構築します。
from tensorflow.keras.layers import Input, Dense, LSTM
from tensorflow.keras.models import Model
from tensorflow.keras.utils import plot_model
input = Input((100, 784))
dense = TimeDistributed(Dense(128))(input)
lstm = LSTM(32, return_sequences=False)(dense)
out = Dense(1)(lstm)
model = Model(inputs=input, outputs=out)
model.summary()
plot_model(model, show_shapes=True, show_layer_names=False)
出力結果
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 100, 784)] 0
_________________________________________________________________
time_distributed (TimeDistri (None, 100, 128) 100480
_________________________________________________________________
lstm (LSTM) (None, 32) 20608
_________________________________________________________________
dense_1 (Dense) (None, 1) 33
=================================================================
Total params: 121,121
Trainable params: 121,121
Non-trainable params: 0
_________________________________________________________________
Dense層のパラメータ数を見ると、100480=784×128+128 になっていることから、Dense層は全ステップで共有されたものであることがわかります。
コメント