C#/.NET API での CNTK の使用

CNTK v2.2.0 には、CNTK モデルを構築、トレーニング、評価するための C# API が用意されています。 このセクションでは、CNTK C# API の概要について説明します。 C# のトレーニング例 は、CNTK github リポジトリで入手できます。

C#/.NET マネージ API を使用してディープ ニューラル ネットワークを構築する

CNTK C# API は、CNTKLib 名前空間で基本的な操作を提供します。 CNTK 操作は、必要なパラメーターを持つ 1 つまたは 2 つの入力変数を受け取り、CNTK 関数を生成します。 CNTK 関数は、入力データを出力にマップします。 CNTK 関数は、変数として扱われ、別の CNTK 操作への入力として受け取ることもできます。 このメカニズムを使用すると、チェーンと構成によって、基本的な CNTK 操作を使用してディープ ニューラル ネットワークを構築できます。 例


private static Function CreateLogisticModel(Variable input, int numOutputClasses)
{             
    Parameter bias = new Parameter(new int[]{numOutputClasses}, DataType.Float, 0}
    Parameter weights = new Parameter(new int[]{input.Shape[0], numOutputClasses}, DataType.Float,        
      CNTKLib.GlorotUniformInitializer( 
        CNTKLib.DefaultParamInitScale, 
        CNTKLib.SentinelValueForInferParamInitRank, 
        CNTKLib.SentinelValueForInferParamInitRank, 1));
    var z = CNTKLib.Plus(bias, CNTKLib.Times(weights, input));    
    Function logisticClassifier = CNTKLib.Sigmoid(z, "LogisticClassifier");
    return logisticClassifier;
}

CNTKLib.Plus、CNTKLib.Times、CNTKLib.Sigmoid は基本的な CNTK 操作です。 入力引数には、データ特徴を表す CNTK 変数を指定できます。 また、別のCNTK関数であってもよい。 このコードは、適切な多クラス分類子を作成するためにトレーニング段階で調整されるパラメーターを使用して、単純な計算ネットワークを構築します。

CNTK C# API は、畳み込みニューラル ネットワーク (CNN) と再発ニューラル ネットワーク (RNN) を構築する操作を提供します。 たとえば、2 層 CNN 画像分類子を構築するには、次のようにします。


    var convParams1 = new Parameter(
      new int[] { kernelWidth1, kernelHeight1, numInputChannels, outFeatureMapCount1 }, 
      DataType.Float, CNTKLib.GlorotUniformInitializer(convWScale, -1, 2), device);
    var convFunction1 = CNTKLib.ReLU(CNTKLib.Convolution(
      convParams1, input, 
      new int[] { 1, 1, numInputChannels } ));
    var pooling1 = CNTKLib.Pooling(convFunction1, PoolingType.Max,
        new int[] { poolingWindowWidth1, poolingWindowHeight1 }, new int[] { hStride1, vStride1 }, new bool[] { true });
    
    var convParams2 = new Parameter(
      new int[] { kernelWidth2, kernelHeight2, outFeatureMapCount1, outFeatureMapCount2 }, 
      DataType.Float, CNTKLib.GlorotUniformInitializer(convWScale, -1, 2), device);
    var convFunction2 = CNTKLib.ReLU(CNTKLib.Convolution(
      convParams2, pooling1, 
      new int[] { 1, 1, outFeatureMapCount1 } ));
    var pooling2 = CNTKLib.Pooling(convFunction2, PoolingType.Max,
        new int[] { poolingWindowWidth2, poolingWindowHeight2 }, new int[] { hStride2, vStride2 }, new bool[] { true });

    var imageClassifier = TestHelper.Dense(pooling2, numClasses, device, Activation.None,   "ImageClassifier");        

短期メモリ (LTSM) を使用して RNN を構築する例も示します。

C#/.NET を使用したデータ準備

CNTK には、トレーニング用のデータ準備ユーティリティが用意されています。 CNTK C# API は、これらのユーティリティを公開します。 さまざまな前処理済みフォームからデータを受け取ります。 データの読み込みとバッチ処理は効率的に行われます。 たとえば、"Train.ctf" という名前の次の CNTK テキスト形式のテキストにデータがあるとします。

|features 3.854499 4.163941 |labels 1.000000
|features 1.058121 1.204858 |labels 0.000000
|features 1.870621 1.284107 |labels 0.000000
|features 1.134650 1.651822 |labels 0.000000
|features 5.420541 4.557660 |labels 1.000000
|features 6.042731 3.375708 |labels 1.000000
|features 5.667109 2.811728 |labels 1.000000
|features 0.232070 1.814821 |labels 0.000000

CNTK DataSource は、次の方法で作成されます。


    var minibatchSource = MinibatchSource.TextFormatMinibatchSource(
        Path.Combine(DataFolder, "Train.ctf"), streamConfigurations,
        MinibatchSource.InfinitelyRepeat, true);

バッチ データは、後で取得してトレーニングに使用できます。


    var minibatchData = minibatchSource.GetNextMinibatch(minibatchSize, device);

C#/.NET マネージ API を使用してディープ ニューラル ネットワークをトレーニングする

確率勾配降下法 (SGD) は、ミニバッチ トレーニング データを使用してモデル パラメーターを最適化する方法です。 CNTK は、ディープ ラーニングの文献でよく見られる多くの SGD バリエーションをサポートしています。 これらは CNTK C# API によって公開されます。

  • SGDLearner - CNTK 組み込みの SGD 学習者
  • MomentumSGDLearner - CNTK 組み込みのモメンタム SGD 学習器
  • FSAdaGradLearner - AdaGrad learner のバリエーション
  • AdamLearner - Adam learner
  • AdaGradLearner - アダプティブ 勾配学習器
  • RMSPropLearner - RMSProp learner
  • AdaDeltaLearner - AdaDelta 学習器

さまざまな学習オプティマイザーの一般的な概要については、「 確率的勾配降下法」を参照してください。

CNTKトレーナーはミニバッチトレーニングを行うために使用されます。 ミニバッチ トレーニング用の C# コードの切り取り:


    // build a learning model
    var featureVariable = Variable.InputVariable(new int[] { inputDim }, DataType.Float);
    var labelVariable = Variable.InputVariable(new int[] { numOutputClasses }, DataType.Float);
    var classifierOutput = CreateLinearModel(featureVariable, numOutputClasses, device);
    var loss = CNTKLib.CrossEntropyWithSoftmax(classifierOutput, labelVariable);
    var evalError = CNTKLib.ClassificationError(classifierOutput, labelVariable);

    // prepare for training
    var learningRatePerSample = new CNTK.TrainingParameterScheduleDouble(0.02, 1);
    var parameterLearners =
        new List<Learner>() { Learner.SGDLearner(classifierOutput.Parameters(), learningRatePerSample) };
    var trainer = Trainer.CreateTrainer(classifierOutput, loss, evalError, parameterLearners);

    int minibatchSize = 64;
    int numMinibatchesToTrain = 1000;

    // train the model
    for (int minibatchCount = 0; minibatchCount < numMinibatchesToTrain; minibatchCount++)
    {
        Value features, labels;
        GenerateValueData(minibatchSize, inputDim, numOutputClasses, out features, out labels, device);
        trainer.TrainMinibatch(
            new Dictionary<Variable, Value>() { { featureVariable, features }, { labelVariable, labels } }, device);
        TestHelper.PrintTrainingProgress(trainer, minibatchCount, 50);
    }

このコードの切り取りでは、サンプル学習率 = 0.02 の CNTK 組み込み SGD 学習者が使用されます。 学習器は、モデルのすべてのパラメーターを最適化することです。 トレーナーは、学習器、損失関数、および評価関数を使用して作成されます。 トレーニングイテレーションの各ミニバッチデータがトレーナーに送られ、モデルパラメーターが更新されます。 トレーニング中に、トレーニングの損失と評価エラーがヘルパー メソッドと共に表示されます。
このコードでは、ラベルと特徴の統計的に分離可能なデータの 2 つのクラスを生成します。 他のより現実的な では、パブリック テスト データは CNTK MinibatchSource で読み込まれます。

C#/.NET マネージ API を使用してディープ ニューラル ネットワークを評価する

C# API には、モデルの評価を行う評価 API があります。 ほとんどの C# トレーニング例では、 トレーニング後にモデルの評価が行われます。

CNTK C# API を使用したモデル評価の詳細については、

C# トレーニングの例の概要

この概要を確認したら、GitHub の CNTK ソースを操作するか、CNTK NuGet for Windows を使用して CNTK の例を使用する、2 つの方法で C# のトレーニング例を進めます。

CNTK ソースを操作する

  • この ページ の手順に従って、Windows で CNTK をセットアップします。
  • Visual Studio を使用して CNTK.sln をビルドします。
  • サンプル データを準備します
  • CNTKLibraryCSTrainingTest.csproj でエンド ツー エンド テストとして例を実行する

CNTK NuGet で CNTK の例を操作する