畳み込みニューラルネットワークで文字を識別する過程

今週月、水曜日に「PyTorchを使ったディープラーニング」セミナーの第4、5回がありました。

第4回は畳み込みニューラルネットワークの理論と実装。第5回はオートエンコーダとDropoutについてです。

畳み込みニューラルネットワーク(CNN)

CNNの理論を学んだあとにLeNet-5のモデルをPyTorchで実装し、数字が書かれた画像から0~9を識別するプログラムを作成します。

LeNet-5のモデルは以下の通りです。

  1. 1枚の32×32の画像を入力
  2. 畳み込み層(6出力チャネル×28×28の画像を出力)
  3. プーリング層(Maxpooling→6×14×14)
  4. 畳み込み層(16×10×10)
  5. プーリング層(Maxpooling→16×5×5)
  6. 全結合層(16×5×5→120)
  7. 全結合層(120→84)
  8. 出力層(84→10)

最終的に出力される値が0~9のどの数字かを表しています。各層での具体的な画像イメージは下記サイトが参考になります。手書きで文字を書くとリアルタイムで各層のイメージが作成されCNNモデルがどのように数字を判断するのかの流れが分かります。

f:id:denim012:20190425220036j:plain

引用元:An Interactive Node-Link Visualization of Convolutional Neural Networks(demo

先週、隠れ層2層のニューラルネットワークモデルで、4万枚の画像で訓練後テストした際の数字識別正答率は95%でした。

今週作成した畳み込みニューラルネットワークモデルで同一条件(同じLoss関数:Cross-entropy loss、optimizer:Adam)で試したところ正答率は97.6%まで上がりました。

 オートエンコーダ

オートエンコーダの実習では、数字が書かれた画像からKmeansを使って10種類に分類を行います。

  • 画像データそのまま使う場合
  • オートエンコーダで次元圧縮した中間層の値を使った場合

で、どれだけ正しくクラスタリングできるか確認します。

実際に動作させてみるとオートエンコーダ(エンコーダ、デコーダ1層、活性関数:LeakyReLU、Loss関数:mse_loss、optimizer:Adam、エポック数:100)の値を使った場合の方が結果が悪くなってしまいました。

これは過学習の状態になっているためです。dropoutを追加することで結果は改善し、画像データをそのまま使うより良い値が出力されました。