Partilhar via


Utilização da CNTK com API C#/.NET

CNTK v2.2.0 fornece C# API para construir, treinar e avaliar os modelos CNTK. Esta secção apresenta uma visão geral da CNTK C# API. Os exemplos de formação C# estão disponíveis no repositório CNTK github.

Utilização de API gerida por C#/.NET para construir uma rede neural profunda

A API CNTK C# fornece operações básicas no espaço de nomes CNTKLib. Uma operação CNTK leva uma ou duas variáveis de entrada com parâmetros necessários e produz uma Função CNTK. Uma função CNTK mapeia dados de entrada para a saída. Uma função CNTK também pode ser tratada como uma variável e ser tomada como entrada para outra operação CNTK. Com este mecanismo, uma rede neural profunda pode ser construída com operações básicas da CNTK por acorrentação e composição. Em forma de exemplo:


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 são operações básicas da CNTK. O argumento de entrada pode ser uma Variável CNTK que representa as características de dados. Também pode ser outra função CNTK. Este código constrói uma simples rede de cálculo com parâmetros que são ajustados em fase de treino para fazer um classificador de várias classes decente.

A API CNTK C# fornece operações para a construção de redes neuronais de convolução (CNNs) e redes neuronais recorrentes (RNNs). Por exemplo, para construir um classificador de imagem CNN de duas camadas:


    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");        

É também fornecido um exemplo para a construção de um RNN com memória de longo prazo (LTSM).

Preparação de dados usando C#/.NET

A CNTK fornece serviços de preparação de dados para a formação. A API CNTK C# expõe estes utilitários. Retira dados de vários formulários pré-processados. O carregamento e o lote de dados são feitos de forma eficiente. Por exemplo, assumindo que temos dados em texto no seguinte formato de texto CNTK chamado "Train.ctf":

|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

Um CNTK DataSource é criado desta forma:


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

Os dados do lote podem ser recuperados e utilizados para treino mais tarde:


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

Utilização da API gerida C#/.NET para formar uma rede neural profunda

A descida do gradiente estocástico (SGD) é uma forma de otimizar os parâmetros do modelo com dados de treino de minibatch. A CNTK suporta muitas variações SGD que são comumente vistas na literatura de aprendizagem profunda. São expostos pela CNTK C# API:

  • SGDLearner - um aprendiz de SGD incorporado da CNTK
  • MomentumSGDLearner - um aprendiz de Momentum SGD incorporado da CNTK
  • FSAdaGradLearner - uma variação do aprendiz de AdaGrad
  • AdamLearner - um aprendiz de Adão
  • AdaGradLearner - um aprendiz de gradiente adaptativo
  • RMSPropLearner - um aprendiz de RMSProp
  • AdaDeltaLearner - um aprendiz de AdaDelta

Para uma visão geral dos diferentes otimizadores de aprendizagem, consulte a descida do gradiente estocástico.

Um treinador CNTK é usado para fazer minibatch treino. Um corte de código C# para o treino de minibatch:


    // 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);
    }

Neste corte de código, é utilizado um aprendiz de SGD incorporado em CNTK com uma taxa de aprendizagem por amostra = 0,02. O aprendiz é otimizar todos os parâmetros do modelo. Um formador é criado com o aluno, uma função de perda e uma função de avaliação. Durante cada tratamento, os dados de minibatch são alimentados ao treinador para que os parâmetros do modelo tenham os parâmetros do modelo atualizados. A perda de tremig e o erro de avaliação são apresentados com um método de ajuda durante o treino.
No código geramos duas classes de dados estatisticamente separáveis de rótulos e funcionalidades. Noutros exemplos mais realistas, os dados de teste públicos são carregados com o CNTK MinibatchSource.

Utilização de API gerida por C#/.NET para avaliar uma rede neural profunda

C# API tem avaliação API para fazer avaliação de modelos. A maioria dos exemplos de treino C# fazem avaliação de modelo após o treino.

Mais detalhes de avaliação de modelos usando CNTK C# API pode ser encontrado em

Começar com exemplos de treino C#

Depois de ter passado por este panorama, poderá proceder com exemplos de formação C# de duas formas: trabalhar com a fonte CNTK do GitHub ou trabalhar com exemplos da CNTK utilizando o CNTK NuGet para windows.

trabalhar com a fonte CNTK

  • Siga os passos nesta página para configurar o CNTK nas janelas.
  • Construa a .sln CNTK com o Visual Studio.
  • Prepare os dados da amostra.
  • Executar exemplos como testes de ponta a ponta em CNTKLibraryCSTrainingTest.csproj

trabalhar com exemplos da CNTK com CNTK NuGet