#TL;DR
#概要
- Denoising Autoencoder(以下DAE)に使うノイズには色々ありますが、自分にはどのような違いがあるのかよくわかりません
- ということで、mnistの手書き数字データで学習済したDAEで自分が書いた字を再構成させることでノイズの種類による違いを体験してみました
- それで何かわかるのかというと微妙ですが、個人的に面白かったので共有しようと思います
#ネタ元
- 入力は28*28のグレイスケール画像
- tied weight
- 中間層のユニットの数は500
- 増やし過ぎるとjsのデモが重くなるのでこのくらいに
- アフィン変換&シグモイド関数のエンコーダー + アフィン変換&シグモイド関数のデコーダー。ロスはクロスエントロピー
- 入力のmnistのデータはグレイスケール画像とはいえ、ほぼ0or1のバイナリ画像として見れるのでこの組み合わせです
#試したノイズの種類
###マスキングノイズ
入力の一部を0
にします
###ソルト&ペッパーノイズ
入力の一部を0
か1
にします。0
か1
かは等確率で決めました
###ガウシアンノイズ
入力に平均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%
不完全な画像からそれっぽく数字に補完してくれる