前回はCNTK付属のサンプルを使って、テストをしてみました。今回は、CNTKを自分で使うための説明です。基本公式ページの訳ですが、日本語に直したほうがわかりやすいので。

概要

前書き

このページは CNTK usage overview を訳しただけのページです。
ですので、訳がおかしかったり間違いがあるかもしれません。
それによって生じた損害は私は負えません。あしからず。

CNTK usage overview (CNTK 使い方 概要)

To use CNTK you need to either download the executable binaries or download the source code and compile it on your machine (details). There are three main tasks (or actions) that are supported by CNTK:

  • Train - Define a network and train it to produce a trained model using training data
  • Evaluate - Test a trained model to assess its performance using test data
  • Deploy - Use a trained model, e.g. in your own solution, to classify new instances

A brief overview for each of these tasks is given below and pointers to a more detailed description are provided. In addition there are other tasks that CNTK supports such as edit existing models and write node outputs to a file. A description of these is provided in the Advanced Topics section on the Top-level commands page.

訳:

CNTKを使うためには、実行可能バイナリのダウンロードまたはソースコードのダウンロードとマシン上でのコンパイルが必要である。CNTKは3つの主要なタスク (またはアクション) をサポートしている。

  • 学習 - ネットワークの定義、そして教師データを用いて学習済みモデルを生成するための学習
  • 評価 - テストデータ用いて性能を査定するために学習済みモデルをテストすること
  • デプロイ - 学習済みモデルを使用すること。例えば、自身のソリューションにおいて、新しいインスタンスを分類すること

各タスクの詳しい概要については下記に示してあり、より詳細な説明がポインタ (訳注:おそらくリンク) で提供している。それに加えて、CNTKは既存のモデルの編集とノードをファイルへ出力する書き出しをサポートしている。これらの詳細はトップレベルコマンドページの高度なトピックスで提供している。

Training a model using CNTK (CNTKでモデルの学習)

In the following we use the CNTK configuration and results from the MNIST example, in particular the configuration ‘01_OneHidden.cntk’ (see Image/MNIST and 01_OneHidden.cntk for full details). To train a model using CNTK you need to provide a configuration file as the first argument when calling the CNTK executable, cntk configFile=01_OneHidden.cntk in our example (see also Config file overview for more details on config files). The following snippet provides an overview of the config file contents that are relevant for training.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ModelDir = "$OutputDir$/Models"
deviceId = 0
command = MNISTtrain

modelPath = "$ModelDir$/01_OneHidden"

MNISTtrain = [
action = "train"

NDLNetworkBuilder = [
networkDescription = "$ConfigDir$/01_OneHidden.ndl"
]

SGD = [
...
]

reader = [
readerType = "UCIFastReader"
file = "$DataDir$/Train-28x28.txt"
...
]
]

The above code snippet defines a command called MNISTtrain with action = “train”. Other supported actions are for example test or write. The deviceId parameter specifies whether to use CPU or GPU. When set to auto CNTK picks the best available device. Set it to -1 to use the CPU or to a value >=0 to use a specific GPU. The modelPath defines where to store the intermediate and final trained models. In this example it uses the ModelDir variable defined at the beginning of the configuration file. The three main configuration blocks for training define the network itself and the parameters for the training algorithm and the data reader.

  • Network builder - here you define the topology and the details of the network such as the size and number of layers and the type of nodes. You can use the Simple Network Builder or the NDL Network Builder. Please refer to the corresponding Wiki pages for details.
  • SGD - this block lets you parameterize the training algorithm (stochastic gradient descent). Options include using momentum, adaptive learning rate, adaptive minibatch size or parallel training. See SGD block for more details.
  • reader - the reader block defines which reader to use and where the corresponding input files are. CNTK provides several data readers for different formats and tasks (see Reader block).

Finally, the line command = “MNISTtrain” specifies which of the defined tasks to execute. To execute several tasks consecutively, e.g. training and evaluation, simply add more tasks to the command separated by a colon: command = “MNISTtrain:MNISTtest”

訳:

下記に、CNTKで使用する設定とMNIST (訳注:Mixed National Institute of Standards and Technology、つまりアメリカ国立標準技術研究所がミックスしたもの) のサンプルの結果、特に 01_OneHidden.cntk (詳細はImage/MNIST01_OneHidden.cntk を) を示す。
CNTKでモデルを学習するために、CNTK実行ファイルを呼び出すとき;cntk configFile=01_OneHidden.cntk に渡した第一引数である設定ファイルを渡す必要がある。下記のスニペットで、トレーニングための正しい設定ファイルの内容の概要を示す。

(訳注:ここのコードは原文にあるので省略)

上のコードスニペットは action = “train” を備えた MNISTTrain と呼ばれるコマンドを定義している。ほかのコマンド、例えば test または write もサポートしています。
deviceId パラメータはCPUまたはGPUを使うかどうかを指定します。auto をセットした時は CNTK が利用可能な最適なデバイスを採用します。-1 をセットすると、CPU を使用し、0 以上の値を設定することで GPU を使います。modelPath は中間、最終学習済みモデルの保存先を定義します。サンプルでは、設定ファイルの先頭で定義されている ModelDir 変数を使っています。
学習のための主な3つの設定ブロックは、ネットワークの定義、学習アルゴリズムのためのパラメータとデータリーダーを定義します。

  • ネットワークビルダー - ここは、トポロジーと、サイズやレイヤーの枚数のようなネットワークの詳細と、ノードの種別を定義します。Simple Network Builder または NDL Network Builder を使うことができます。詳細は対応する Wiki ページを。
  • SGD - このブロックは学習アルゴリズム (stochastic gradient descent : 確率的勾配降下法) をパラメータ化させます。オプションはモメンタム、適応的学習率、適応的ミニバッチサイズ、または並列学習です。詳細は SGD bock を。
  • リーダー - リーダーブロックは、どのリーダーを使用するか、対応する入力ファイルがどこにあるかを定義します。CNTKは、異なるフォーマットとタスクのために、いくつかのデータリーダーを提供しています。(詳細は Reader block).

最後に、command = “MNISTtrain” 行は、実行する定義済みのタスクを指定します。連続していくつかのテスクを実行するためには、例えば、学習と評価の場合、単純に以降のタスクを “;” で区切って、コマンドに追加します。command = “MNISTtrain:MNISTtest”。

Evaluating a trained model (学習済みモデルの評価)

To evaluate a trained model you can use the eval or test command (see also Train, Test, Eval for full details). The corresponding configuration in the MNIST 01_OneHidden.cntk example looks as follows.

1
2
3
4
5
6
7
8
9
10
MNISTtest = [
action = "test"
minibatchSize = 16

reader = [
readerType = "UCIFastReader"
file = "$DataDir$/Test-28x28.txt"
...
]
]

The MNISTtest block uses action = “test”. For the test action you need to define a model that should be used for testing using the modelPath parameter. In this example the modelPath is not defined inside the MNISTtest block but on the top level (see training part above) and is used by both the train and test actions. Inside the reader block you specify the data file that should be used for testing, Test-28x28.txt in the example. Finally, you have to set command = MNISTtest and run cntk configFile=01_OneHidden.cntk to execute the testing. The result on the command line is:

1
2
Final Results: Minibatch[1-625]: Samples Seen = 10000    err: ErrorPrediction/Sample = 0.0239    ce: CrossEntropyWithSoftmax/Sample = 0.076812531    Perplexity = 1.0798396
COMPLETED

訳:

学習済みモデルを評価するために、evalまたはtestコマンドを使うことができます。(詳細は Train, Test, Eval)。下記のMNIST 01_OneHidden.cntk サンプル内の対応する設定を見ます。

(訳注:ここのコードは原文にあるので省略)

MNISTtest ブロックでは、action = “test” を使います。test アクションでは、modelPath パラメータを使ってテストのために使用するモデルを定義する必要があります。このサンプルで、modelPath はMNISTTest ブロック内ではなくトップレベルで定義され (Training a model using CNTK を見てください)、trainとtestコマンドの両方が使用されています。readerブロック内では、テストに使用されるデータファイル;サンプルではTest-28x28.txt、を指定します。最後に、command = MNISTtestの設定と、テストを実行するために cntk configFile=01_OneHidden.cntk を走らせなくてはなりません。コマンドラインの結果は (訳注:ここのコードは原文にあるので省略)

Using a trained model in your own solution (学習済みモデルの評価)

To use a trained CNTK model in your own solution you can either use the EvalDll from C++ or wrap the EvalDll to call it from other languages. An example for a .NET wrapper and a C# client is provided in Source/Extensibility/CSEvalClient. The example shows how to use the trained MNIST 01_OneHidden model to classify an image. The following code snippet is taken from Program.cs in Source/Extensibility/CSEvalClient.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
...
Dictionary<string, List<float>> outputs;

using (var model = new IEvaluateModelManagedF())
{
// Initialize model evaluator
string config = GetConfig();
model.Init(config);

// Load model
string modelFilePath = Path.Combine(Environment.CurrentDirectory, @"..\Output\Models\01_OneHidden");
model.LoadModel(modelFilePath);

// Generate random input values in the appropriate structure and size
var inputs = GetDictionary("features", 28*28, 255);

// We can call the evaluate method and get back the results (single layer)...
// List<float> outputList = model.Evaluate(inputs, "ol.z", 10);

// ... or we can preallocate the structure and pass it in (multiple output layers)
outputs = GetDictionary("ol.z", 10, 1);
model.Evaluate(inputs, outputs);
}
...

See Program.cs for full details. If you get an exception Cannot move externally owned matrices to the preferred device. please specify deviceId=-1 in the config file.

訳:

学習済みのCNTKモデルをソリューションで使用するために、C++から EvalDll、または 他の言語から呼び出すためにEvalDll をラップしたものを使うことができます。サンプルのために、.NETラッパーとC#クライアントが Source/Extensibility/CSEvalClient で提供されています。サンプルでは、学習済みのMNIST 01_OneHidden モデルを画像の分類のためにどのように使うかを示してします。下記のコードスニペットは Source/Extensibility/CSEvalClient 内の、Program.cs です。

(訳注:ここのコードは原文にあるので省略)

詳細は、Program.cs を。もし、Cannot move externally owned matrices to the preferred device (訳注 : 訳は「優先デバイスに所有権のある行列を外部に移動することはできません」ですが、CNTKの内部例外は日本語にならないので、このままにしました) という例外を受け取った場合は、deviceID=-1 を設定ファイルで指定してください。

Conclusion

訳のレベルが低すぎるのはご愛嬌。
.NETのラッパーがサンプルで提供されていることが発覚しました。
これは面白くなってきました。