TIM Labs

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

| コメント(0) | トラックバック(0)
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

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

トラックバック(0)

トラックバックURL: http://labs.timedia.co.jp/mt/mt-tb.cgi/572

コメントする

このブログ記事について

このページは、fujiが2017年3月 5日 00:00に書いたブログ記事です。

ひとつ前のブログ記事は「データ解析のための統計モデリング入門 GLMのモデル選択 読書メモ3」です。

次のブログ記事は「データ解析のための統計モデリング入門 GLMのモデル選択 読書メモ4」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。