no-image

BidirectinalRNNでMNIST予測をしてTensorBoardで結果を表示してみた

一般的に画像認識と言うと、CNNがよく使われますが、今回はRNNを使ってMNIST解析をやってみました。

使ったのはKerasのBidirectionalRNNです。
BidirectionalRNNというのはその名の通り、
前方向からも後方向からも再帰的に学習させていく手法です。

従来の一方学習のRNNとは違って二方向から学習することでより良い結果になるのではないかというアプローチです。

MNISTといえば1枚が28*28ピクセルの手書き数字の画像データですが、
画像認識にRNNをどのようにして使うのかというと、この1枚の画像を1*28の画像が28枚集まったものと捉え、
時系列的に上から下へ学習していきます。

このサイトにあったgif画像がイメージしやすくてわかりやすいです。

の画像を上部から下部に向けて遷移させながらLSTMで学習します。以下のGIFアニメのように画像上部からタイムステップ毎に遷移させてどの数字になりそうかの情報を状態として保持するイメージです。

【参考】RNN:時系列データを扱うRecurrent Neural Networksとは – DeepAge

 

コードは以下のような感じです。

 

今回使用したパラメータは以下の通り。

  • batch_size: 200
  • epoch: 60
  • 隠れ層の数: 1
  • 入力層のユニット数(n_in): 28*28
  • 隠れ層のユニット数(n_hidden): 128
  • 出力層のユニット数(n_out): 10
  • Activation function: softmax
  • dropout: なし(0%)
  • Optimizer: Adam(パラメータは論文が推奨する値)
  • Loss function: mean_squared_error(平均二乗誤差関数)

 

今回は初めてTensorBoardを使ってみたので、そのときのことをメモ。
ここのサイトのコードを参考にして、
実行する場所は関係なく
$ tensorboard --logdir=/Users/username/mydl/mycode/log
で表示されたURLにアクセスしたら見れた。

 

TensorBoardには様々な機能がありますが、その中にaccuracyの推移を見れるものがありました。
それで確認してみると、最終的な正答率は96.6%くらいでした。MNISTにしては微妙な気がします。

 

TensorBoardの中にはモデルをマッピングしてくれる機能があったりするのですが、よくわからなかったので、追々勉強していきたいと思います。

 

で、今回はBidirectionalRNNを使って上述したパラメータで学習させてみると正答率が96%だったわけですが、まだまだ微妙な結果なのでTensorBoardの勉強も兼ねて、パラメータをいじってみたいと思います。
どこかで見たサイトではRNNを使ったMNIST予測では99%以上出していたので、そこも目指してみたいと思います。