KerasでLSTM層の前にDense層を挟む(TimeDistributedを使う)

技術備忘録

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層は全ステップで共有されたものであることがわかります。


コメント

タイトルとURLをコピーしました