※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

Chainer:超簡単なAutoEncoderを作ってみる(1)


2017年 03月 05日

Deep Learningでクラス分けをやってきたが、今回はちょっと違った処理をしてみる。
クラス分けというのは、よく分からないデータを分類するもので、Irisの場合は4種のデータからIrisの種類を推測するものであり、手書き数字の場合は数字の画像データから数字を当てるものであった。

今回は、そういうのとは全然違う AutoEncoder というものを作ってみる。
今回は、簡単に済ますために、またIrisのデータを使うことにする。
すると、入力は4つの値の組である。
クラス分けでは、出力はIrisの種類であったのだが、今回は出力は入力と同じものになるように指示してみよう。つまり、入力と出力が同じである。

ネットワーク図いうと、入力と出力は4ノードである。
しかし、中間層は、2ノードの層を1つだけにする。
つまり、次図のような構成だ。

AutoEncoder.pngつまり、4つのデータを、途中で2つのデータに変換(圧縮)し、その2つのデータから元のデータを復元し、4つのデータにすることを考える。
これを実現するのに、いままで説明してきた仕組みをそのまま使う。
違うところは、誤差を最小化するところで、今回は、入力がこのネットワークで変換され出力された値と、元の値との2乗誤差を求め、その誤差が最小化するようにする。

とりあえず、今回は、誤差がどんどん小さくなっていることだけを確認してみよう。
class MyAE(Chain):
def __init__(self):
super(MyAE, self).__init__(
l1=L.Linear(4,2),               # 中間層は2ノード    
l2=L.Linear(2,4),
)

def __call__(self,x):
bv = self.fwd(x)
return F.mean_squared_error(bv, x)  # 結果と元データとの2乗誤差

def fwd(self,x):
fv = F.sigmoid(self.l1(x))
bv = self.l2(fv)
return bv

これを利用して実行すると、次第に2乗誤差が小さくなる。
Chainer$ python -i ae1.py
999     0.602435
1999     0.340246
2999     0.208172
3999     0.156505
4999     0.136456

今回は、数値による結果だけを示し、次回にプログラムも含めて説明する。