RNN、特にLSTMがKerasとTensorflowを使用して複数の入力次元でどのように機能しているかを理解したいと思います。つまり、入力形状は(batch_size、timesteps、input_dim)であり、input_dim> 1です。
以下の画像は、input_dim = 1の場合、LSTMの概念を非常によく示していると思います。
これは、input_dim> 1の場合、xは単一の値ではなく、配列であることを意味しますか?しかし、このような場合、重みも配列になり、x +コンテキストと同じ形状になりますか?
Kerasは、機能ごとに(ただし、すべてのユニットについて)下の画像のシーケンスを実行する計算グラフを作成します。つまり、状態値Cは常にスカラーであり、ユニットごとに1つです。機能を一度に処理するのではなく、ユニットを一度に処理し、機能を個別に処理します。
import keras.models as kem
import keras.layers as kel
model = kem.Sequential()
lstm = kel.LSTM(units, input_shape=(timesteps, features))
model.add(lstm)
model.summary()
free_params = (4 * features * units) + (4 * units * units) + (4 * num_units)
print('free_params ', free_params)
print('kernel_c', lstm.kernel_c.shape)
print('bias_c', lstm.bias_c .shape)
どこ 4
は、下の画像のf、i、c、およびoの内部パスごとに1つを表します。最初の項はカーネルの重みの数、2番目の項は反復カーネル、最後の項はバイアス(適用されている場合)です。ために
units = 1
timesteps = 1
features = 1
私たちは見る
Layer (type) Output Shape Param #
=================================================================
lstm_1 (LSTM) (None, 1) 12
=================================================================
Total params: 12.0
Trainable params: 12
Non-trainable params: 0.0
_________________________________________________________________
num_params 12
kernel_c (1, 1)
bias_c (1,)
とのために
units = 1
timesteps = 1
features = 2
私たちは見る
Layer (type) Output Shape Param #
=================================================================
lstm_1 (LSTM) (None, 1) 16
=================================================================
Total params: 16.0
Trainable params: 16
Non-trainable params: 0.0
_________________________________________________________________
num_params 16
kernel_c (2, 1)
bias_c (1,)
どこ bias_c
は、状態Cの出力形状のプロキシです。ユニットの内部作成に関しては、さまざまな実装があることに注意してください。詳細はこちら( http://deeplearning.net/tutorial/lstm.html )で、デフォルトの実装ではEq.7を使用します。お役に立てれば。
上記の回答をTensorFlow2に更新しましょう。
import tensorflow as tf
model = tf.keras.Sequential([tf.keras.layers.LSTM(units, input_shape=(timesteps, features))])
model.summary()
free_params = (4 * features * units) + (4 * units * units) + (4 * num_units)
print('free_params ', free_params)
print('kernel_c', lstm.kernel_c.shape)
print('bias_c', lstm.bias_c .shape)
このコードを使用すると、TensorFlow2.xでも同じ結果を得ることができます。