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

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