SONY Neural Network Console でノイズ除去をやってみる

今回は、オートエンコーダによるノイズ除去をやってみます。

オートエンコーダ ( Auto Encoder ) とは、入力画像の次元圧縮によって特徴量を覚えて、次元復元させると入力画像とそっくりな画像を出力するネットワークです。

入力と同じ画像を出力するネットワークなんて意味がないように思われますが、実はこれノイズ除去に使えるんです。

オートエンコーダは、ノイズが入った画像を入力されると、ノイズはランダムな要素なので無視し、覚えた特徴量のみに従って画像を復元するので、結果ノイズが除去されるわけです。

というわけで、今回は、オートエンコーダによるノイズ除去をやってみます。

 

オートエンコーダを設計する

サンプルプロジェクトには、06_auto_encoder というオートエンコーダがありますが、全結合層(affine2層だけなので、ノイズ除去能力はあまり期待できません。なので、今回はオリジナルのネットワークを組んでみます。

 

これが今回のネットワークです。32枚28×28画像MaxPooling で、28×28 → 14×14 → 7×7 と次元を圧縮した後に、UnPooling7×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 機能でデータセットを作成すれば、ノイズ除去性能を見るための評価ファイルができます。

 

ノイズ除去性能をみてみる

さきほど学習・評価を完了したプロジェクトの「評価ファイル」を「ノイズ除去性能を見るための評価ファイル」に入れ替えて、再度評価してみます。

評価結果を見てみると、ノイズは除去され、上手く画像が復元が出来ていることが分かると思います。

オートエンコーダは地味な存在ですが、こうやって使ってみると結構面白いです。

では、また。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)