質問: model.fit(x_trains, y_trains, # 訓練データ、正解ラベル batch_size=100, # ミニバッチのサイズ epochs=10, # 学習回数 verbose=1, # 学習の進捗状況を出力する validation_data=( # テストデータの指定 x_tests, y_tests) ) # 損失と正解率をグラフにする import matplotlib.pyplot as plt # プロット図のサイズを設定 plt.figure(figsize=(15, 6)) # プロット図を縮小して図の間のスペースを空ける plt.subplots_adjust(wspace=0.2) # 1×2のグリッドの左(1,2,1)の領域にプロット plt.subplot(1, 2, 1) # 訓練データの損失(誤り率)をプロット plt.plot(history.history['loss'], label='training', color='black') # テストデータの損失(誤り率)をプロット plt.plot(history.history['val_loss'], label='test', color='red') plt.ylim(0, 1) # y軸の範囲 plt.legend() # 凡例を表示 plt.grid() # グリッド表示 plt.xlabel('epoch') # x軸ラベル plt.ylabel('loss') # y軸ラベル # 1×2のグリッドの右(1,2,21)の領域にプロット plt.subplot(1, 2, 2) # 訓練データの正解率をプロット plt.plot(history.history['acc'], label='training', color='black') # テストデータの正解率をプロット plt.plot(history.history['val_acc'], label='test', color='red') plt.ylim(0.5, 1) # y軸の範囲 plt.legend() # 凡例を表示 plt.grid() # グリッド表示 plt.xlabel('epoch') # x軸ラベル plt.ylabel('acc') # y軸ラベル plt.show() ```
回答: 「28次元のベクトル」が変化していく時系列データを「28ステップ分」記録したもの だと思ってLSTMは処理しています。 (追記) 質問に貼ってあるソースの動きはこうです。 1層目のLSTMの時刻t0の入力x0は「画像の一番上の28ピクセル」に対応する「28個の数値」を、28次元のベクトルだと見たものです。 LSTMにx0を入れると内部状態(128次元ベクトル)を更新してh0になります。(と同時にこれが出力でもあります。後述) 1層目のLSTMの時刻t1の入力x1は「画像の上から2番目の28ピクセル」に対応する「28個の数値」を、28次元のベクトルだと見たものです。 LSTMは1つ前の内部状態h0と、x1から、内部状態を更新してh1になります。 (略) 1層目のLSTMの時刻t27の入力x27は「画像の一番下の28ピクセル」に対応する「28個の数値」を、28次元のベクトルだと見たものです。 LSTMは1つ前の内部状態h26と、x27から、内部状態を更新してh27になります。 `return_sequences=True`が指定してありますから、1層目のLSTMの出力は、h0からh27の128次元のベクトル28個をconcatenateしたものです。 したがって、2層目のLSTMの入力は128次元のベクトルの28ステップの時系列データとなります。 2層目のLSTMの時刻t0の入力x0は「1層目のLSTMの時刻0の内部状態ベクトル」です。 LSTMにx0を入れると内部状態を更新してh0になります。 2層目のLSTMの時刻t1の入力x1は「1層目のLSTMの時刻1の内部状態ベクトル」です。 LSTMは1つ前の内部状態h0と、x1から、内部状態を更新してh1になります。 (略) 2層目のLSTMの時刻t27の入力x27は「1層目のLSTMの時刻27の内部状態ベクトル」です。 LSTMは1つ前の内部状態h26と、x27から、内部状態を更新してh27になります。 `return_sequences=True`が指定してありますから、2層目のLSTMの出力は、h0からh27の128次元のベクトル28個をconcatenateしたものです。 したがって、3層目のLSTMの入力も2層目と同様、128次元のベクトルの28ステップの時系列データとなります。 3層目のLSTMの時刻t0の入力x0は「2層目のLSTMの時刻0の内部状態ベクトル」です。 LSTMにx0を入れると内部状態を更新してh0になります。 (略) 3層目のLSTMの時刻t27の入力x27は「2層目のLSTMの時刻27の内部状態ベクトル」です。 LSTMは1つ前の内部状態h26と、x27から、内部状態を更新してh27になります。 `return_sequences=False`が指定してありますから、3層目のLSTMの出力は、**最後の**内部状態ベクトルh27です。つまり128次元のベクトルを出力します。 したがって、最後の全結合層の入力は128次元のベクトルになります。 最後に、128次元の入力から全結合層につながって、10次元のベクトルをsoftmax関数を通して出力することでクラス分類の結果としています。