今週月、水曜日に「PyTorchを使ったディープラーニング」セミナーの第4、5回がありました。
第4回は畳み込みニューラルネットワークの理論と実装。第5回はオートエンコーダとDropoutについてです。
畳み込みニューラルネットワーク(CNN)
CNNの理論を学んだあとにLeNet-5のモデルをPyTorchで実装し、数字が書かれた画像から0~9を識別するプログラムを作成します。
LeNet-5のモデルは以下の通りです。
- 1枚の32×32の画像を入力
- 畳み込み層(6出力チャネル×28×28の画像を出力)
- プーリング層(Maxpooling→6×14×14)
- 畳み込み層(16×10×10)
- プーリング層(Maxpooling→16×5×5)
- 全結合層(16×5×5→120)
- 全結合層(120→84)
- 出力層(84→10)
最終的に出力される値が0~9のどの数字かを表しています。各層での具体的な画像イメージは下記サイトが参考になります。手書きで文字を書くとリアルタイムで各層のイメージが作成されCNNモデルがどのように数字を判断するのかの流れが分かります。
引用元: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を追加することで結果は改善し、画像データをそのまま使うより良い値が出力されました。