試していること

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

できていること

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

したいこと

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

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

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

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

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

stacked_auto_encoder.py ファイル内

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

settings.py ファイル内

# 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 ]

Softmax関数前後の y.data 表示

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

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 ]]

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

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]]

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

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

読んだ本

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

ネット検索

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

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