今回は、オートエンコーダによるノイズ除去をやってみます。
オートエンコーダ ( Auto Encoder ) とは、入力画像の次元圧縮によって特徴量を覚えて、次元復元させると入力画像とそっくりな画像を出力するネットワークです。
入力と同じ画像を出力するネットワークなんて意味がないように思われますが、実はこれノイズ除去に使えるんです。
オートエンコーダは、ノイズが入った画像を入力されると、ノイズはランダムな要素なので無視し、覚えた特徴量のみに従って画像を復元するので、結果ノイズが除去されるわけです。
というわけで、今回は、オートエンコーダによるノイズ除去をやってみます。
オートエンコーダを設計する
サンプルプロジェクトには、06_auto_encoder というオートエンコーダがありますが、全結合層(affine)が2層だけなので、ノイズ除去能力はあまり期待できません。なので、今回はオリジナルのネットワークを組んでみます。
これが今回のネットワークです。32枚の28×28画像をMaxPooling で、28×28 → 14×14 → 7×7 と次元を圧縮した後に、UnPooling で 7×7→ 14×14 → 28×28 と復元する構成です。
これがパラメータの設定表です。SquaredError の T.dataset は「x」であることに注意して下さい。
データセットは、small_mnist_4or9_training.csv と small_mnist_4or9_test.csv を使います。バッチ64、エポック100で学習開始します。42分で学習が完了です。
評価を実行すると、覚えた特徴量に従って、入力画像を復元した結果が現れます。結構上手く復元できている様です。
ついでに、覚えた特徴量がどんなものか可視化してみましょう。
学習・評価が完了したプロジェクトを TRAINING 画面にして、右側の OverView のネットワークの中から見たいレイヤーをクリックすると、学習した重みが読み込まれ、可視化することが出来ます(今回のネットワークはCostParameterが大きいので、読み込みにはしばらく掛かります)。
表示されているのは、Convolution_3が学習した重みです。
とは言っても、機械が抽出した特徴量を人間が見てもピンと来ませんね(笑)。
ノイズが入ったデータセットを作る
オートエンコーダのノイズ除去性能を見るためのデータセットを作成します。
使うのは、2/17のブログ「画像水増しレイヤーの効果はどれくらいか?」でご紹介した、このネットワーク。Image Augmentation の設定は、Noise のみ「0.5」と設定し、それ以外は画像を変化させない設定にしています。
学習用ファイルは、small_mnist_4or9_training.csv (ダミー)を使います。評価用ファイルは、MNISTの「4」を100個だけコピーしてきて、+Create Dataset 機能で作ったものです。
学習ボタン「▷」上で右クリックして、Create Training Result を選び強制的に学習を完了させます。
そして、バッチ50で評価ボタンを押せば、ノイズ入り「4」が100個できます。
作成したノイズ入り「4」のデータは、ノイズ入り画像の上で右クリックし、Open File Location をクリックした場所に保管されています。
これと同様にして、ノイズ入り「9」も100個作ります。
そして、ノイズ入りの「4」と「9」を使って、再度 +Create Dataset 機能でデータセットを作成すれば、ノイズ除去性能を見るための評価ファイルができます。
ノイズ除去性能をみてみる
さきほど学習・評価を完了したプロジェクトの「評価ファイル」を「ノイズ除去性能を見るための評価ファイル」に入れ替えて、再度評価してみます。
評価結果を見てみると、ノイズは除去され、上手く画像が復元が出来ていることが分かると思います。
オートエンコーダは地味な存在ですが、こうやって使ってみると結構面白いです。
では、また。
コメントを残す