LoginSignup
26
16

More than 5 years have passed since last update.

Denoising Autoencoderで使うノイズの違いを体験してみよう

Last updated at Posted at 2015-09-21

TL;DR

デモはChromeで動作を確認しました
デモ
コード

概要

  • Denoising Autoencoder(以下DAE)に使うノイズには色々ありますが、自分にはどのような違いがあるのかよくわかりません
  • ということで、mnistの手書き数字データで学習済したDAEで自分が書いた字を再構成させることでノイズの種類による違いを体験してみました
  • それで何かわかるのかというと微妙ですが、個人的に面白かったので共有しようと思います

ネタ元

Stacked Denoising Autoencoders: Learning Useful Representations in
a Deep Network with a Local Denoising Criterion

使ったDAEの説明

  • 入力は28*28のグレイスケール画像
  • tied weight
  • 中間層のユニットの数は500
    • 増やし過ぎるとjsのデモが重くなるのでこのくらいに
  • アフィン変換&シグモイド関数のエンコーダー + アフィン変換&シグモイド関数のデコーダー。ロスはクロスエントロピー
    • 入力のmnistのデータはグレイスケール画像とはいえ、ほぼ0or1のバイナリ画像として見れるのでこの組み合わせです

試したノイズの種類

マスキングノイズ

入力の一部を0にします

ソルト&ペッパーノイズ

入力の一部を01にします。01かは等確率で決めました

ガウシアンノイズ

入力に平均0で事前に決めた分散のガウス分布からサンプルした値を加えます

コード

コード
DAEの学習にChainer1.3.1を用いました
しかし、一部すんなりと実装できない部分があるので説明します

tied weightなAutoencoder

こちらを使用しました

chainer.functions.sigmoid_cross_entropyの型が合わない

シグモイド関数からのクロスエントロピーロスにはchainer.functions.sigmoid_cross_entropyが使えます。しかしsigmoid_cross_entropyの教師の方の入力の型はint32ですが今回はfloat32の擬似バイナリ画像を使用したいので型が合いません。幸いなことにsigmoid_cross_entropyのforward,backwardの部分はfloat32も受け付けるようなので、chainerのソースからsigmoid_cross_entropyをコピペしてクラス名を変えて、check_type_forwardの部分でfloat32も受け付けるようにすればok

デモ

学習したモデルをjsに読み込ませてリアルタイムに再構成させます
https://hatoo.github.io/mnist-DAE-demo/html/

マスキングノイズ80%

不完全な画像からそれっぽく数字に補完してくれる
z80.png

ソルト&ペッパーノイズ50%

補完はしてくれないが黒いノイズを消去してくれる
sp50.png

ガウシアンノイズ 分散0.75

軽く補完したりノイズを消したり
g75_5.png
g75_2.png

26
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
16