前回は自分でデータの学習 (train) と評価 (test) を実行しました。今回は結果を検証してみます。

可視化

write

前々回の設定説明の際、CNTKが対応しているタスクまたはアクションに、ノードをファイルへ書き出す write があることを説明しました。
これを使ってテスト結果を可視化します。

設定ファイルの追加

既存の設定ファイルに追加する形でも良いですが、そうすると、学習、テストのたびにファイル書き出しが実行されてしまいます。
別に大した負荷でもないですが、あえて別にします。

まず、前回使った 01_Conv.cntk をコピーして、02_Eval.cntk とでも名前を変えます。
次に、Test コマンド全体をコピーして、Eval コマンドに名前を変えます。名前は任意です。
そして、Train コマンド、Test コマンド全体を削除します。
これで残るのはEvalコマンドだけになります。
次は、command=Train:Test となっている個所を、command=Eval に変更します。
そして、Evalコマンド内の actionwrite に変更します。
最後に、actionと同じ位置に outputPath = “$OutputDir$/Eval.txt” と追加します。
これがないと

write command: You must specify either ‘writer’or ‘outputPath’

というエラーを吐きますので。

検証

前回と同じディレクトリ (Examples\Image\Miscellaneous\CIFAR-100) から、下記のコマンドをたたきます。
コマンドプロンプトを再起動していないのでしたら、最初の一行目は無視できます。
前回TrainとTestを実行済みで Output フォルダに Models が出力されているものとします。

1
2
set PATH="..\..\..\..\Release";%PATH%
cntk configFile=02_Eval.cntk deviceId=0

これで、Outputフォルダ直下に 01_Conv_Eval.logEval.txt.OutputNodes.z が出力されます。
前者は、*.cntkファイルで指定した stderr で指定したファイル名のポストフィックスに実行したコマンド名を付与したファイルです。
今回はcommandでEvalを実行したのでこうなりました。これがあれば、コマンドプロンプトでわざわざリダイレクトする必要はありません。

後者は、今回の目的である可視化された評価結果です。outputPathで指定したものです。
内容は、与えられた入力が、各出力 (つまり100個の出口) で評価された場合、どの程度、その出口に近いか、つまり今回であれば、そのラベルに近いかを数値で表します。
数値が大きいほど、そのラベルである確率が高いです。いわゆる確信度です。

下記はExcelで集計した結果です。Eval.txt.OutputNodes.zが半角スペースで区切られているので、これをタブに変換してからExcelに張り付けています。

評価結果

前回のエラー率と同じ数値が出ています。
集計は、横軸からラベル番号 (0-99) を算出するために、最大値を MATCH 関数の結果 - 1 を使って探してラベル番号を計算しています。

Conclusion

評価もできるようになりました。
できれば、次は .NET から利用したりしたいです。
例えば、一枚の画像を指定して与えると、それの評価を出してくれる、みたいなやつ。