FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

CNTKのチュートリアル(Simple2d)の読み解きに挑戦

とりあえず前回までにCNTKのインストールは完了したので、サンプルを見ながら何が出来るのか、調査していこう。

msyksphinz.hatenablog.com

目次

まずは、最初の例としてSimple2dという、アプリケーションが紹介されている。

github.com

なんだか、何をするためのアプリケーションか良く分からないね。とりあえず、コードを走らせながら読み解いていこう。

Simple2dをCNTKで実行する

以下で実行できる。

cntk configFile=../Config/Simple.config

何が起きているのか?

まずは、Simple.configを見ていこう。開いてみると分かるのだが、これ、普通のプログラミング言語じゃない。 明らかにDSLで書かれている。これを読み解いていくのは至難の技だぞ。。。

...
ConfigDir = "$RootDir$/Config"
DataDir = "$RootDir$/Data"
OutputDir = "$RootDir$/Output"
ModelDir = "$OutputDir$/Models"

# deviceId=-1 for CPU, >=0 for GPU devices, "auto" chooses the best GPU, or CPU if no usable GPU is available
deviceId = -1

command = Simple_Demo_Train:Simple_Demo_Test

precision = "float"
traceLevel = 1
modelPath = "$ModelDir$/simple.dnn"
outputNodeNames = ScaledLogLikelihood

#######################################
#  TRAINING CONFIG                    #
#######################################

Simple_Demo_Train = [
    action = "train"
...

ちなみに、このモデル言語のリファレンスは、パッケージリリースの方にWordファイルが置いてあった。

github.com

これは読むのがしんどい。

Simple2dのサンプルで実行しているのは、CNNの構築

このサンプルでは主に2つのフェーズから成り立っているようだ。まず1つめはSimple_Demo_Train。これはネットワークに対してトレーニングデータを流して訓練をする。 さらに、トレーニング結果に基いてテストを流すのがSimple_Demo_Test。 さらに、本文ではあまり解説されていないがSimple_Demo_Outputというフェーズも存在する。これは実際にネットワークにデータを流して結果を出力するのだが、テストデータと同じものを活用している。

トレーニングファイルについて

トレーニングファイルであるSimpleDataTrainingは、3つの値を1つのグループにして格納されている。

0.55722 0.820464 0
-0.841446 0.336962 0
-0.51575 0.563136 0
-0.0891501 0.824556 0
-0.0696117 -0.6043 1
0.778311 0.433997 0
-0.461137 -0.573202 1
-0.750289 0.419899 0
...

X,Y座標、そして分類値だろうか。これらは1万行近くあり、Excelにプロットしてみると以下のようになる。

f:id:msyksphinz:20160129014117p:plain

何となく0,1で分類されているな、っていうのは分かった。

テストデータについて

これが良く分からん。同様の表現法を取っているならば、(ソースコードとしてはそうとしか読めない)、1行目がX軸で2行目がY軸? 3行目が模範解答として、エラー率を測っているのか?

########################################
#  TEST RESULTS                        #
#  (computes prediction error and      #
#   perplexity on a test set and       #
#   writes the output to the console.) #
########################################

    # Parameter values for the reader
    reader = [
        readerType = "UCIFastReader"
        file = "$DataDir$/SimpleDataTest.txt"
        randomize = "none"

        features = [
            dim = 2   // これは入力データが2次元であることを示す。
            start = 0
        ]

        labels = [
            start = 2    // 最初の2つのデータ(実際には2次元データ)をスキップして、
            dim = 1      // 分類値は1次元で
            labelDim = 2 // 2種類の値を取る
            labelMappingFile = "$DataDir$/SimpleMapping.txt"
        ]
    ]

同じ理屈でExcelに載せてみると、以下のようなテストデータを渡しているに等しい。

f:id:msyksphinz:20160129015533p:plain

何かデータとしては極端な気がするよね。よう分からん。

Simple_Demo_Outputでトレーニングの結果を出力する。

新しいフェーズを加えて、テストの結果を出力してみる。以下のようにcommandを追加する。

cntk configFile=../Config/Simple.config command=Simple_Demo_Output

出力されたファイルは、../Output/SimpleOutput.ScaledLogLikelihood だが、これが2つの値をペアにしたものになっている。2値分類なら1つの値になっていると思ったんだけどなあ。

-3.55165 4.78638
-3.52765 4.76299
-3.50334 4.73932
-3.47874 4.71534
-3.45384 4.69108
-3.42863 4.66651
-3.40312 4.64165
-3.37729 4.61647
-3.35114 4.59099
-3.32468 4.5652
-3.2979 4.53909
-3.27079 4.51266
-3.24336 4.48592
-3.21559 4.45885
-3.1875 4.43146
-3.15907 4.40374
-3.1303 4.37568
-3.10119 4.34729
...

ここらへんは、もうちょっと調査が必要だ。

ちなみに

チュートリアルも含め、このSimple2dの解説は以下のPDFにも載っている。ただし説明が少なく初学者の僕には理解不能なところが多いので、誰か解説頼む。。

http://research.microsoft.com/pubs/226641/CNTKBook-20160121.pdf

f:id:msyksphinz:20160129015914p:plain

どうやったらこの図が出てくるの。。。

過去のエントリ

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

続きのエントリ

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com