

## 試していること

Chainer で Stacked Auto-Encoder を試してみた ( MNISTデータを利用 )

  * ホームページ : <http://wazalabo.com/chainer-stacked-auto-encoder.html>
  * [プログラムソース ( Github )](https://github.com/ISP-Kazuki-Nagasawa/chainer_1.6_sda_mnist_sample)
  * 対象ファイル 
    * chainer_1.6_sda_mnist_sample-master/libs/stacked_auto_encoder.py
    * chainer_1.6_sda_mnist_sample-master/execute.py
    * chainer_1.6_sda_mnist_sample-master/settings.py

## できていること

上記ホームページのプログラムは、正常に動作したことを確認。

## したいこと

上記、Stacked Auto-Encoder で 学習済み後に、  
１つのテストデータ(784次元)を入力し、  
最終出力層からのテスト出力結果が、正解/不正解に関係なく、  
０〜９までの１０分類の内、何番目に分類されたのかを知りたい。

なお、ホームページ作成者のプログラムは、  
最終出力層のニューロン数(ユニット数)は、２つであり、  
これは、(x, y) 座標用に、２出力しているようです。

下記、追加修正の仕方はトンチンカンなのでしょうか？  
どこをどのように追加変更すれば、分類された確認ができるのでしょうか？

或いは、Keras だったら、こうすればいいよ、というのでもいいので、  
教えて頂けたらとても有難いです。

## プログラムを追加した箇所

### `stacked_auto_encoder.py` ファイル内

[code]

    class StackedAutoEncoderForwardAll( chainer.Chain ) :
        ........
        def __call__( self, x ) :
            ........
            y = self.__getitem__( "l_f{0}".format(self.len_f_layers) )( h )
            print( "y.data_before : ", y.data )    # 追加した行！！！( 確認用 )
            y = F.softmax( y )                     # 追加した行！！！
            print( "y.data_after : ", y.data )     # 追加した行！！！( 確認用 )
            return y
    
[/code]

### `settings.py` ファイル内

[code]

    # Layer settings
    INPUT_SIZE  = 28 * 28                                      # = 784
    OUTPUT_SIZE = 10                                           # 変更した行！！！ .... 2 を 10 に変更した。
    LAYER_SIZES = [INPUT_SIZE, 1000, 500, 250, OUTPUT_SIZE]    # NN層 : [ 784, 1000, 500, 250, 10 ]
    
[/code]

## Softmax関数前後の `y.data` 表示

### 上記 `print( "y.data_before : ", y.data )` の表示

[code]

    y.data_before :  [[ 0.16361719  0.0925117   0.14825995 -0.19885089  0.21088713  0.36490795
                        0.30154228 -1.46724844 -0.9004966   0.51069123]
                      [ 0.15193619 -0.08050451  0.13325857 -0.22897118  0.22460887  0.25148487
                        0.26430339 -1.32499278 -0.76786339  0.51948214]
                      ................
                      [ 0.21231894 -0.03649403  0.1441728  -0.1944664   0.24102062  0.22770482
                        0.27350223 -1.31370342 -0.75460964  0.52975202]
                      [ 0.02851745  0.44122052  0.14630049 -0.20715928  0.12495413  0.72705191
                        0.38662156 -1.8646065  -1.28368688  0.4700928 ]]
    
[/code]

### 上記 `print( "y.data_after : ", y.data )` の表示

[code]

    y.data_after :   [[ 0.11127097  0.10363374  0.10957521  0.07743976  0.11665703  0.1360822
                        0.12772679  0.02178241  0.03839221  0.15743968]
                      [ 0.11328325  0.08978793  0.11118703  0.07739978  0.12182236  0.12514086
                        0.12675531  0.02586685  0.04515458  0.1636021 ]
                      ................
                      [ 0.1182229   0.09218144  0.11043484  0.07871128  0.12166525  0.12005592
                        0.12568201  0.0257015   0.04495416  0.16239065]
                      [ 0.09137783  0.13806245  0.10280006  0.07219178  0.10062892  0.18374288
                        0.13072647  0.01376156  0.02460128  0.14210671]]
    
[/code]

ただし、試しのため、バッチサイズは２０、エポック数は３回での実行結果なので、  
精度は望めませんが、正解ラベルと配列番目とはどうも一致してなさそうです。

## 問題解決のためにしてきたこと

### 読んだ本

  * Chainer による 実践深層学習
  * ゼロから作る Deep Learning ( オライリージャパン )

### ネット検索

かれこれ、２〜３ヶ月前からずっと検索しています。  
AutoEncoder で、入力画像を出力に再現させるサンプルプログラムは、沢山ヒットしましたが、  
AutoEncoder の学習で特徴を抽出したあとに、テストデータを入力し、  
どの分類になるかのサンプルプログラムはなかなかヒットしません。  
( 正解率を求めるサンプルプログラムはヒットしますが )

どなたかどうぞ宜しくお願いします。


CC BY-SA 3.0
2017-02-09T06:09:46.180
32523
2017-02-09T07:00:26.977
2017-02-09T07:00:26.977
19110
20579
question
python chainer
Auto-Encoder の 分類について。どなたか助けてください。