読者です 読者をやめる 読者になる 読者になる

かれ4

かれこれ4個目のブログ

The Microsoft Cognitive Toolkitで、Machine Learning 界のHello World. MNISTを試す

CNTK Microsoft HelloWorld MNIST BrainScript graphviz docker

準備編

環境の準備をして blog.tottokug.com

CNTKの使い方をざっくりと理解して blog.tottokug.com

確認編

cntkにはコマンドラインで使う方法と、python から使う方法などがありますが、 まずはコマンドラインで使う方法を試してみます。

cntkのコマンドが使える状況に

$ docker run -it --rm microsoft/cntk:1.7.2-cpu-only
root@9f0cb764ac5a:/cntk# cntk
-------------------------------------------------------------------
Build info:

        Built time: Oct  1 2016 21:16:06
        Last modified date: Sat Oct  1 21:14:58 2016
        Build type: release
        Build target: CPU-only
        With 1bit-SGD: no
        Math lib: mkl
        Build Branch: HEAD
        Build SHA1: d1ad5fcc9b71c9b6122623a2a0c3d126a64cbe94
        Built by philly on 9b019bb2e014
        Build Path: /home/philly/jenkins/workspace/CNTK-Build-Linux
-------------------------------------------------------------------
No command-line argument given.
-------------------------------------------------------------------
Usage: cntk configFile=yourConfigFile
For detailed information please consult the CNTK book
"An Introduction to Computational Networks and the Computational Network Toolkit"
-------------------------------------------------------------------

無事にcontainer上でcntkが使えています.

実践編

ここからはすべてコンテナ内での操作になります。

データのダウンロード

まずはMNIST用のデータを用意します。 データを用意するためのスクリプトgithubに上がっているので、それをダウンロードしてきます。

# cd /cntk/Examples/Image/MNIST/Data
# wget https://raw.githubusercontent.com/Microsoft/CNTK/master/Examples/Image/DataSets/MNIST/install_mnist.py
# wget https://raw.githubusercontent.com/Microsoft/CNTK/master/Examples/Image/DataSets/MNIST/mnist_utils.py 
# python install_mnist.py
〜略〜
# ll
total 127392
drwxr-xr-x. 1 1000 1000      4096 Dec 11 05:40 ./
drwxr-xr-x. 1 1000 1000      4096 Dec  8 23:21 ../
-rw-r--r--. 1 root root  18649443 Dec 11 05:40 Test-28x28_cntk_text.txt
-rw-r--r--. 1 root root 111735994 Dec 11 05:40 Train-28x28_cntk_text.txt
-rw-r--r--. 1 root root       637 Dec 11 05:39 install_mnist.py
-rw-r--r--. 2 1000 1000        20 Oct  1 23:28 labelsmap.txt
-rw-r--r--. 1 root root      2463 Dec 11 05:39 mnist_utils.py
-rw-r--r--. 1 root root      2982 Dec 11 05:39 mnist_utils.pyc

無事にデータのダウンロードが完了しました。

データのフォーマット

$ head -n 1 Train-28x28_cntk_text.txt
|labels 0 0 0 0 0 1 0 0 0 0 |features 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136 175 26 166 255 247 127 0 0 0 0 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253 225 172 253 242 195 64 0 0 0 0 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251 93 82 82 56 39 0 0 0 0 0 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 241 225 160 108 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253 150 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252 253 187 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249 253 249 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253 253 207 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253 250 182 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201 78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 136 253 253 253 212 135 132 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

これが一行の内容で、labelsには10bitで0-1の数字が記録されている。(なんかもったいない)

下記の場合は左から6番目に1が付いているので(0,1,2,3,4,5)で5を表している。

|labels 0 0 0 0 0 1 0 0 0 0 |

featuresには28x28個の0-255の値が記載されたデータが入っている。 1行に並んで居ると見づらいので、数字28個毎に改行を入れてみる。

$ head -n 1  Train-28x28_cntk_text.txt |perl -pe "s/(.*?features )((\d+ ){28})/\1\n\2\n/g"
|labels 0 0 0 0 0 1 0 0 0 0 
|features 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136 175 26 166 255 247 127 0 0 0 0
0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253 225 172 253 242 195 64 0 0 0 0
0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251 93 82 82 56 39 0 0 0 0 0
0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 35 241 225 160 108 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119 25 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253 150 27 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252 253 187 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249 253 249 64 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253 253 207 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253 250 182 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201 78 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 136 253 253 253 212 135 132 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

改行を入れるとなんとなく5っぽいなというのも見える。

学習と検証

データ確認は済んだところで実際に学習と検証までをやってみます。

今回使用するのはContainerに最初から用意されているMNIST用の構成ファイル この構成ファイルはBrainScriptと呼ばれているようです。 '/cntk/Examples/Image/MNIST/Config/01_OneHidden.cntk'を利用します。 おそらくgithubにあるこれとほぼ同じものになると思います。

# cd /cntk/Examples/Image/MNIST/Config
# date ; cntk configFile=01_OneHidden.cntk ; date
Sun Dec 11 10:29:39 UTC 2016
CNTK 1.7.2 (HEAD d1ad5f, Oct  1 2016 21:16:06) on localhost at 2016/12/11 10:29:39

cntk  configFile=01_OneHidden.cntk
Redirecting stderr to file ../Output/01_OneHidden_bs_out
Sun Dec 11 10:31:31 UTC 2016

こちらMacbook Air上のParallelsで動かしているCoreOS上のDocker(とりあえず、そこまでいいスペックではない環境)で実行して だいたい 2分くらいで完了しました。

実行中にstderrの内容は../Output/01_OneHidden_bs_outに保存してあるからと言われているので、軽く見てみます。

# cat ../Output/01_OneHidden_bs_out
〜略〜

Minibatch[1-10]: errs = 1.880% * 10000; ce = 0.06162033 * 10000
Final Results: Minibatch[1-10]: errs = 1.880% * 10000; ce = 0.06162033 * 10000; perplexity = 1.06355847

なんだかしっかりとTestまで終わってますよ的な事が出ています。 てか、上記の検証結果のようにこれ標準出力に出してくれても良いんじゃないか? と思うような内容もstderrに出ていたので要注意です。

そして、肝心の学習したモデルはというと、 BrainScriptに書いてある

modelPath = "$outputDir$/Models/01_OneHidden"

に吐き出されているはずなので、見てみます。

# cd /cntk/Examples/Image/MNIST/Output/Models
# ls -la 01_OneHidden*
-rw-r--r--. 1 root root 638877 Dec 11 10:31 01_OneHidden
-rw-r--r--. 1 root root 638877 Dec 11 10:29 01_OneHidden.0
-rw-r--r--. 1 root root 638877 Dec 11 10:29 01_OneHidden.1
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.10
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.11
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.12
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.13
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.14
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.15
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.16
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.17
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.18
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.19
-rw-r--r--. 1 root root 638877 Dec 11 10:29 01_OneHidden.2
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.20
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.21
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.22
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.23
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.24
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.25
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.26
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.27
-rw-r--r--. 1 root root 638877 Dec 11 10:30 01_OneHidden.28
-rw-r--r--. 1 root root 638877 Dec 11 10:31 01_OneHidden.29
-rw-r--r--. 1 root root 638877 Dec 11 10:29 01_OneHidden.3
-rw-r--r--. 1 root root 638877 Dec 11 10:29 01_OneHidden.4
-rw-r--r--. 1 root root 638877 Dec 11 10:29 01_OneHidden.5
-rw-r--r--. 1 root root 638877 Dec 11 10:29 01_OneHidden.6
-rw-r--r--. 1 root root 638877 Dec 11 10:29 01_OneHidden.7
-rw-r--r--. 1 root root 638877 Dec 11 10:29 01_OneHidden.8
-rw-r--r--. 1 root root 638877 Dec 11 10:29 01_OneHidden.9
-rw-r--r--. 1 root root 636600 Dec 11 10:31 01_OneHidden.ckp

きちんとできていそうです。よかった。

ちなみにExampleについている 02_Convolution.cntkとか03_ConvBatchNorm.cntkについても どうようにできますが、cpu-onlyのイメージでは全然実行が終わりません。

参考までにdocker statsで見てみると

f:id:tottokug:20161211201231p:plain

CPUやばし、これはGPU積んでるマシンでやりましょう。

ここまでかMacbook Air

plotしてみる

Plot command · Microsoft/CNTK Wiki · GitHub ここにネットワークを描画出来るようなことが書いてあります。

This command loads a given computation network and describes the network topology (usually a DAG) using the DOT (http://www.graphviz.org/doc/info/lang.html) language. It can also optionally call a third-part tool (http://www.graphviz.org/Documentation/dotguide.pdf) to render the network topology. Note that many DOT rendering tools are optimized for DAG, and the rendered graph becomes quite messy if the network structure is non-DAG. The non-DAG structure is usually caused by the use of delay node. In this case, this command will treat all the delay nodes as leaf nodes.

描画にはgraphvizを使うようなのですが、 microsoft/cntk:1.7.2-cpu-only はUbuntu 14.04ベースで、 CNTKを動作させる環境は一通り入っては居るものの、graphbizは最初からインストールされていません。 なので、インストールします。

# apt-get update
# apt-get install  graphviz

そして、さっきの 01_OneHidden.cntkをコピーして編集します。

# cp 01_OneHidden{,_plot}.cntk
# vi 01_OneHidden_plot.cntk

commandの最後に:で区切ってtopoplotを追加して、 さらにtopoplotのブロックを追加します。

# command = trainNetwork:testNetwork 
command = trainNetwork:testNetwork:topoplot

# plot CONFIG
topoplot = [
    action = "plot"
    modelPath = "$modelPath$"

    # outputdotFile specifies the dot file to output
    # if the user does not specify this, it will be ${modelPath}.dot
    outputdotFile = "$outputDir$/Visualize/01_OneHidden.dot"

    # outputFile specifies the rendered image
    outputFile="$outputDir$/Visualize/01_OneHidden.jpg"

    # if RenderCmd is specified, CNTK will call the plot command after replacing
    # <IN> with ${outputdotFile} and <OUT> with ${outputfile}
    renderCmd="/usr/bin/dot -Tjpg <IN> -o<OUT>"
]

これで下記コマンドを実行すれば、/cntk/Examples/Image/MNIST/Output/Visualize には画像ファイルとdotファイルができているはずです。

# cntk configFile=01_OneHidden-plot.cntk
# ll /cntk/Examples/Image/MNIST/Output/Visualize/
drwxr-xr-x. 2 root root   4096 Dec 11 12:17 ./
drwxr-xr-x. 4 root root   4096 Dec 11 12:17 ../
-rw-r--r--. 1 root root   2182 Dec 11 12:17 01_OneHidden.dot
-rw-r--r--. 1 root root 130944 Dec 11 12:17 01_OneHidden.jpg

無事にできていました。

せっかくなので、手元に持ってきて表示してみます。

$ docker cp {containerID}:/cntk/Examples/Image/MNIST/Output/Visualize/01_OneHidden.jpg ./01_OneHidden.jpg
$ open 01_OneHidden.jpg

f:id:tottokug:20161211212033j:plain すごくシンプルな有向非巡回グラフが出てきました。 なんか可視化されると嬉しい。

さいごに

dockerを使った事によって、手軽に始めることができました。

MNISTを他の構成でもやってみたかったのですが、GPUがないためか全然終わらず、、、 やはりMacbook Airには荷が重かったという事で、諦めました。

BrainScriptについてはplotまでが定義できたりと、結構便利そうだなという印象です。

f:id:tottokug:20161211213044p:plain

Visual Studio CodeのExtensionはまだないようなので、今度時間あったら作ります。

というわけで、 CNTKの準備 から、ざっくり概念的な説明、使ってみるというところまでが終わりました。

次回は、実際にモデルを利用する事か、PythonからCNTKを使う事かのどちらかをしてみたいと思います。

CNTK usage overview

CNTK Microsoft DeepLearning 機械学習

はじめに

このページはこのWikiの内容から何かがわかる気がしたので、翻訳+追記したものになります。 github.com

原文はNikos Karampatziakisによって2016年10月26日・27日に編集されました。


CNTKを使用するには、実行可能なバイナリをダウンロードするか、 ソースコードをダウンロードしてマシン上でコンパイルする必要があります。 (詳細)。

もしくは、Dockerを利用することができます。 blog.tottokug.com

この記事はDockerで動かしている環境で試してました。

CNTKでサポートされている主な3つのタスク

  • Train : トレーニングデータを使用して訓練されたモデルを作成するために、ネットワークを定義してトレーニングする
  • Evaluate : 訓練されたモデルをテストして、テストデータを使用してそのパフォーマンスを評価する
  • Deploy : 訓練されたモデルを使用します(例:独自のソリューションで新しいインスタンスを分類する

これらの各タスクの概要を以下に示し、より詳細な説明へのポインタを提供します。

CNTKは他にも - 既存のモデルの編集 - ノード出力のファイルへの書き込み などのタスクもサポートしています

これらの詳細は、「Advanced Topics」セクションの「Top-level commands」ページにあります。

CNTKを使用したモデルトレーニング

CNTKでニューラルネットワークをトレーニングするには、 3つのコンポーネントで構成する必要があります。

  • ネットワーク : ニューラルネットワークは、その構造/公式、モデルパラメータを含む。 トレーニング基準と評価基準もここに含まれています。
  • リーダー : トレーニングデータの読み方
  • SGD : 確率勾配プロセスのハイパーパラメータ

CNTK実行ファイルを呼び出すときの最初の引数として、 この情報を記述した構成ファイルを使用して指定する必要があります。

構成ファイルは独自の構文を使用します。 構成ファイルの詳細については、Config file overviewを参照してください。

CNTKの構成ファイル例 - MNIST

'01_OneHidden.cntk'

この構成ファイルを使いMNISTの例を示します。

詳細は Image/GettingStarted を参照してください。

この例のCNTKコマンドラインは、

$ cntk configFile=01_OneHidden.cntk

です。

次のスニペットは、トレーニングに関連する設定ファイルの内容の概要を示しています。

modelDir = "$OutputDir$/Models"
deviceId = 0
command = MNISTtrain

modelPath = "$modelDir$/01_OneHidden"

MNISTtrain = {
    action = "train"

    # network definition   
    BrainScriptNetworkBuilder = (new ComputationNetwork
        include "$ConfigDir$/01_OneHidden.bs"
    )

    # learner configuration       
    SGD = [
        ...
    ]

    # reader configuration   
    reader = [
        readerType = "CNTKTextFormatReader"
        file = "$DataDir$/Train-28x28_cntk_text.txt"
        ...
    ]    
}

command

上記のコードスニペットでは"MNISTtrain"として定義されたタスクを 実行するcommandであると定義されています。

いくつかのタスクを連続して実行することもできます。 例えばtrainとtestを行うには、 commandにコロン区切りで指定することができます。

例)
command = "MNISTtrain:testNetwork"

deviceId

deviceIdパラメータは、CPUまたはGPUのどちらを使用するかを指定します。 "auto"に設定すると、CNTKは利用可能なデバイスを選択します。 CPUを使用する場合は-1に設定し、特定のGPUを使用する場合は0以上の値に設定します。

modelPath

modelPathは、中間および最終訓練モデルを格納する場所を定義します。 この例では、構成ファイルの先頭に定義されたModelDir変数を使用しています。

MNISTtrain

commandで指定した文字列と同じ文字列のパラメータでは、 トレーニングに必要な3つのコンポーネントを定義します。

action = "train" トレーニングするactionであることが定義されています。 サポートされている他のactionには、"test""write"があります。

action = "train" のために最低限必要な3つの構成ブロックは、 ネットワーク(NetworkBuilder)、 トレーニングアルゴリズムのパラメータ(SGD)、 データリーダーのためのパラメータ(reader) になります。

  • NetworkBuilder

    レイヤーのサイズと数、 ノードのタイプなど、ネットワークのトポロジーと詳細を定義します。 標準モデルにはSimple Network Builderを、 カスタムモデルにはBrainScript Network Builderを使用できます。 詳細は対応するWikiページを参照してください。

    (@see Simple Network Builder, BrainScript Network Builder)

  • SGD確率的勾配降下

    このブロックでは、トレーニングアルゴリズムをパラメータ化できます。 設定可能なオプションには、運動量、適応学習率、適応ミニバットサイズ、並列訓練などがあります。 詳細については、SGDブロックを参照してください。

  • reader

    readerブロックは、使用するリーダーと、対応する入力ファイルの場所を定義します。 CNTKはさまざまなフォーマットとタスクのためにいくつかのデータリーダーを提供しています (readerブロックを参照)。

トレーニングされたモデルの評価

'01_OneHidden.cntk' の構成は、次のようになります。

訓練されたモデルの精度を評価するには、evalまたはtestコマンドを使用します(詳細は、Train、Test、Evalも参照してください)。

testNetwork = {
    action = "test"
    minibatchSize = 1024    # reduce this if you run out of memory

    reader = {
        readerType = "CNTKTextFormatReader"
        file = "$DataDir$/Test-28x28_cntk_text.txt"
        input = {
            features = { dim = 784 ; format = "dense" }
            labels =   { dim = 10  ; format = "dense" }
        }
    }
}

この例では、modelPathtestNetworkブロック内にはありません。 最上位に定義されています(例ではTest-28x28.txtを使用)。

実行するには構成ファイルのcommandを

command = testNetwork

とし実行します。

$ cntk configFile = 01_OneHidden.cntk

テストの結果は以下のように出力されます。

Final Results: Minibatch[1-625]: errs = 2.39% * 10000; ce = 0.076812531 * 10000; Perplexity = 1.0798396
COMPLETED!

1つの構成ファイルに複数のタスクも可(原文にはありません)

'01_OneHidden.cntk'

の例を見るとわかりますが、 1. trainNetworkというactionがtrainのタスク 1. testNetworkというactionがtestのタスク の2つが定義されています。

そしてcommandには trainNetwork:testNetworkとして、 trainNetworkとtestNetworkが順番に指定されています。 原文では何度か 下記のような記述が出てきましたが、Exampleとして用意されている01_OneHidden.cntk を使って実行するとトレーニングとテストのタスクが行われるようになっています。

$ cntk configFile = 01_OneHidden.cntk

CoreOSをディスクにインストールした時のcloud-configはいづこ?

docker coreos cloud-config
/var/lib/coreos-install/user_data

coreos.com

coreosの設定を変えたい時は

# 設定の変更
$ sudo vi /var/lib/coreos-install/user_data
# 適用
$ sudo coreos-cloudinit -from-file=/var/lib/coreos-install/user_data

Docker for macを辞めたら、Docker Clientだけをスマートに入れる方法を見つけた。

docker Mac

Docker for macが出てから、しばらく使っていたけれど、 どうしてもディスクの喰い方がつらくて、Docker for macを卒業。

現在のローカルのDockerの環境は Parallels + CoreOS Stable channel + Docker client という構成に。 というか戻った。

paralllels + CoreOSのところは一旦置いておいて MacにDocker clientだけをスマートに入れる方法はないかと模索したところ toolboxのソースにあるDockerfile.osxにヒントが。

 36 RUN curl -fsSL -o dockerbins.tgz "https://get.docker.com/builds/Darwin/x86_64/docker-${DOCKER_VERSION}.tgz" && \
 37     tar xvf dockerbins.tgz docker/docker --strip-components 1 && \
 38     rm dockerbins.tgz
 39
 40 RUN chmod +x /docker

https://get.docker.com/builds/Darwin/x86_64/docker-${DOCKER_VERSION}.tgz

このURLさえあれば、動いたり動かなかったりするDocker toolboxのインストーラーにやきもきすることもなく、 Docker clientだけをMacにスマートに入れられる。

$ DOCKER_VERSION=1.11.2
$ wget https://get.docker.com/builds/Darwin/x86_64/docker-${DOCKER_VERSION}.tgz
$ tar zxf docker-${DOCKER_VERSION}.tgz
$ mv docker/docker /usr/local/bin/docker-${DOCKER_VERSION}
$ pushd /usr/local/bin/
$ chmod +x docker-${DOCKER_VERSION}
$ ln -s docker-${DOCKER_VERSION} docker

これでclientだけを入れる事ができた。 あとは環境変数のDOCKER_HOSTにtcp://${COREOS_HOST}:2375 とか入れておけばOK

Gourceがなんだかすごそうだから使い始めてみる。(install編)

Gource visualize timeseries

Gourceすごそう

www.youtube.com

Cognitive ToolKitを追いかけていたら、ちょいちょいGourceというなんだかかっちょいいツールを見かける。

http://gource.io

これはよくわからんけど、使ってみたい。 Windows用のバイナリは用意されているみたいだけれども、Mac用のバイナリはないっぽいので自分で作る。

まとめ

$ sudo port install glm boost libsdl glew pcre freetype ftgl libpng libsdl2_image
$ git clone git@github.com:acaudwell/Gource.git
$ cd Gource
$ ./autogen.sh
$ ./configure && make
$ sudo make install

ここ以下は手順をメモっただけなので読み飛ばし可

installの手順

$ git clone git@github.com:acaudwell/Gource.git
$ cd Gource
$ ./autogen.sh

〜略〜

Run './configure && make' to continue.
$ ./configure

〜略〜

checking for GLEW... configure: error: Package requirements (glew) were not met:

No package 'glew' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables GLEW_CFLAGS
and GLEW_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

glewがないよっていう事を言われるので

$ sudo port install glew

そして再び

$ ./configure

〜略〜

configure: WARNING: SDL 2.0 libraries not found. Trying SDL 1.2. Please note SDL 1.2 support is deprecated
checking for SDL... configure: error: Package requirements (sdl >= 1.2.10 SDL_image) were not met:

No package 'sdl' found
No package 'SDL_image' found

今度はsdlがないと

$ sudo port install libsdl
$ ./configure

configure: error: Boost Filesystem >= 1.46 is required. Please see INSTALL

次はBoost Filesystemが必要と言われ、 INSTALLを見てくれという事なので見てみると

f:id:tottokug:20161208085445p:plain

ちゃんと依存が書いてありました

MacPortsには Boost Filesystem >= 1.46 (libboost-filesystem-dev) まんまこれは存在していないようなので、 boostをinstall、そしてconfigure

$ sudo port install boost
$ ./configure

configure: error: GLM headers are required. Please see INSTALL

$ sudo port install glm
$ ./configure

これで無事にconfigureは完了です。

自分の環境には他に依存しているものがたまたま入っていただけなので、INSTALLに書いてある

  • SDL 2.0 (libsdl2-dev)
  • SDL Image 2.0 (libsdl2-image-dev)
  • PCRE (libpcre3-dev)
  • Freetype 2 (libfreetype6-dev)
  • GLEW (libglew-dev)
  • GLM >= 0.9.3 (libglm-dev)
  • Boost Filesystem >= 1.46 (libboost-filesystem-dev)
  • PNG >= 1.2 (libpng12-dev)

を全部入れましょう

$ make && make install 

これで無事にインストールは完了。

Mac上でCNTK改めCognitive ToolKitを使うならDockerが1番楽ちんそう

機械学習 CognitiveTookKit CNTK Microsoft DeepLearning Docker

結論

Mac上でCNTK改めCognitive Toolkitを使おうとコンパイルを試みたけれど、ネイティブでは無理だった。 無理じゃないかもしれないけれど、労力ががが 結局Dockerでやるのが楽ちん。

なぜ??

github.com

ここにも有るようにACMLがLinuxWindowsにしか提供されていないからだと言う。 他のオープンソースのライブラリで代用しないか?という質問に対しても しかも当面はWindowsLinux以外はサポートしないとはっきりと書かれている。

ACMLとは?

AMD Core Math Libraryの事。 developer.amd.com

  • Level 1, 2 and 3 BLAS
  • LAPACK の全ルーチン
  • FFT(単精度、倍精度)
  • 乱数生成(単精度、倍精度) が高速に扱えるライブラリ。

ただ、現在サイトを見てみると終了のお知らせがあり、これからはオープンソースでやっていくから gpuopen.comを見てねと オープンソースになったので、Mac用にビルドするとか出来るようになるでしょう

とりあえず、ACMLはここまでにしてMacでなんとかCNTK

もうMacでもなんでもない。Dockerで

DockerでCNTKを使う方法は公式のWikiにも書いてある。

CNTK Docker Containers · Microsoft/CNTK Wiki · GitHub

ここに書かれている通りに

cd ${REPO_ROOT}/CNTK/Tools/docker
docker build -t cntk CNTK-CPUOnly-Image

こんな感じでbuildすればとりあえず、MacでもなんでもCognitive ToolKitは試せる ただ、buildにMacbook Air 2014 で大体8時間位かかるので、 ビルド中は美術館なんかに行くのが良いと思う。

ちなみに

$ docker search cntk
NAME                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
torumakabe/cntk-cpu       Image built by MS CNTK Dcokerfile (CPU)         1
microsoft/cntk            CNTK                                            1                    [OK]
attz/cntk                                                                 0
xmedicus/cntk             CNTK                                            0
smizy/cntk                Based on torumakabe/cntk-cpu, MNIST data p...   0
xiw9/cntk                 Another CNTK docker image                       0
qianjun22/cntk-gpu        Docker Image built from the official MS CN...   0
alfpark/cntk              Microsoft Cognitive Toolkit (CNTK) with 1-...   0
toyotaka/cntk                                                             0
tottokug/cntk-cpuonly                                                     0
incognition/cntk-devel                                                    0
nefrock/docker-cntk-cpu                                                   0
nefrock/docker-cntk-gpu                                                   0
incognition/cntkcuda8                                                     0
ericebert/cntk_gpu                                                        0

と、野良のcntkのDocker Imageが出て来る。 その中に一つ異彩を放つ一行がこちら microsoft/cntk なんか公式っぽいTagが付いているImageがある、 しかしdocker hubに行ってみると、

https://hub.docker.com/r/microsoft/cntk/tags/

キチンと公式っぽいものが用意されていた。 RepoInfoのショボさはこの際は気にしない。

$ docker run  -it --rm microsoft/cntk:1.7.2-cpu-only /bin/bash
root@de3948185514:/cntk# cntk
-------------------------------------------------------------------
Build info:

        Built time: Oct  1 2016 21:16:06
        Last modified date: Sat Oct  1 21:14:58 2016
        Build type: release
        Build target: CPU-only
        With 1bit-SGD: no
        Math lib: mkl
        Build Branch: HEAD
        Build SHA1: d1ad5fcc9b71c9b6122623a2a0c3d126a64cbe94
        Built by philly on 9b019bb2e014
        Build Path: /home/philly/jenkins/workspace/CNTK-Build-Linux
-------------------------------------------------------------------
No command-line argument given.
-------------------------------------------------------------------
Usage: cntk configFile=yourConfigFile
For detailed information please consult the CNTK book
"An Introduction to Computational Networks and the Computational Network Toolkit"
-------------------------------------------------------------------

とりあえず、これでよいか。

Mac上でcntkを試す程度であれば、これが1番楽ちんそうだなと思いました。