Compartir a través de


Uso de CNTK con la API de C#/.NET

CNTK v2.2.0 proporciona api de C# para compilar, entrenar y evaluar modelos de CNTK. En esta sección se proporciona información general sobre la API de CNTK para C#. Los ejemplos de entrenamiento de C# están disponibles en el repositorio de GitHub de CNTK.

Uso de la API administrada de C#/.NET para crear una red neuronal profunda

CNTK C# API proporciona operaciones básicas en el espacio de nombres CNTKLib. Una operación de CNTK toma una o dos variables de entrada con los parámetros necesarios y genera una función CNTK. Una función CNTK asigna los datos de entrada a la salida. Una función CNTK también se puede tratar como una variable y tomarse como entrada para otra operación de CNTK. Con este mecanismo, se puede crear una red neuronal profunda con operaciones básicas de CNTK mediante el encadenamiento y la composición. Por ejemplo:


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 son operaciones básicas de CNTK. El argumento de entrada puede ser una variable de CNTK que representa características de datos. También puede ser otra función CNTK. Este código crea una red de cálculo simple con parámetros que se ajustan en la fase de entrenamiento para hacer que un clasificador multiclase decente.

CNTK C# API proporciona operaciones para crear redes neuronales convolucionales (CNN) y redes neuronales recurrentes (RNN). Por ejemplo, para crear un clasificador de imágenes cnn de dos capas:


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

También se proporciona un ejemplo para compilar un RNN con memoria a corto plazo (LTSM).

Preparación de datos mediante C#/.NET

CNTK proporciona utilidades de preparación de datos para el entrenamiento. CNTK C# API expone estas utilidades. Toma datos de varios formularios preprocesados. La carga de datos y el procesamiento por lotes se realizan de forma eficaz. Por ejemplo, suponiendo que tenemos datos en texto en el siguiente formato de texto de CNTK denominado "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

Un origen de datos CNTK se crea de esta manera:


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

Los datos por lotes se pueden recuperar y usar para el entrenamiento más adelante:


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

Uso de la API administrada de C#/.NET para entrenar una red neuronal profunda

El descenso de degradado estocástico (SGD) es una manera de optimizar los parámetros del modelo con datos de entrenamiento de minibatch. CNTK admite muchas variaciones de SGD que se suelen ver en la literatura de aprendizaje profundo. Se exponen mediante la API de CNTK para C#:

Para obtener información general sobre diferentes optimizadores de aprendizaje, consulte Descenso de degradado estocástico.

Un entrenador CNTK se usa para realizar el entrenamiento de minibatch. Un código de C# snip para el entrenamiento 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);
    }

En este código snip, se usa un aprendiz de SGD integrado de CNTK con velocidad de aprendizaje por muestra = 0,02. El aprendiz es optimizar todos los parámetros del modelo. Se crea un instructor con el aprendiz, una función de pérdida y una función de evaluación. Durante cada minibatch de iteración de entrenamiento se alimenta al instructor para que se actualicen los parámetros del modelo. La pérdida de entrenamiento y el error de evaluación se muestran con un método auxiliar durante el entrenamiento.
En el código se generan dos clases de datos estadísticamente separables de etiquetas y características. En otros ejemplos más realistas, los datos de prueba públicos se cargan con CNTK MinibatchSource.

Uso de la API administrada de C#/.NET para evaluar una red neuronal profunda

La API de C# tiene la API de evaluación para realizar la evaluación del modelo. La mayoría de los ejemplos de entrenamiento de C# realizan la evaluación del modelo después del entrenamiento.

Puede encontrar más detalles de evaluación de modelos mediante la API de CNTK para C# en .

Introducción a los ejemplos de entrenamiento de C#

Una vez que haya pasado por esta introducción, puede continuar con ejemplos de entrenamiento de C# de dos maneras: para trabajar con el origen de CNTK desde GitHub o para trabajar con ejemplos de CNTK mediante NuGet de CNTK para Windows.

trabajar con el origen de CNTK

  • Siga los pasos de esta página para configurar CNTK en windows.
  • Compile CNTK.sln con Visual Studio.
  • Preparar los datos de ejemplo.
  • Ejecutar ejemplos como pruebas de un extremo a otro en CNTKLibraryCSTrainingTest.csproj

trabajar con ejemplos de CNTK con NuGet de CNTK