zoukankan      html  css  js  c++  java
  • 通过C#/.NET API使用CNTK

    原文)CNTK v2.2.0提供C#API来建立、训练和评估CNTK模型。 本节概要介绍了CNTK C#API。 在CNTK github respository中可以找到C#训练示例。

    使用C#/ .NET管理API构建深层神经网络

    CNTK C#API 通过CNTKLib命名空间提供基本操作。 CNTK操作需要一个或两个具有必要参数的输入变量,并产生一个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函数。 该代码构建了一个简单的计算网络,其参数在训练阶段进行调整,以创建一个像样的多类分类器(multi-class classifier)。

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

    还提供了构建具有长短时内存(LSTM)的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数据源会以这种方式被创建:

    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公开: 

    有关不同学习优化器的一般概述,请参阅随机梯度下降Stochastic gradient descent.

    CNTK训练器用来进行minibatch训练。以下是minibatch训练的一段C#diamante片段:

    // 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学习器, 学习器用来为模型参数做优化。 训练器与学习器一同创建,一个是loss函数,一个是评估函数。 在每次训练迭代期间,将小批量数据送给训练器以更新模型参数。 训练期间,训练耗损和评估误差由辅助方法显示。
    在代码中,我们生成了两类统计分离的标签和特征数据。 在其他更实际的例子中,公共测试数据加载了CNTK MinibatchSource。

    使用C#/.NET托管API评估深度神经网络

    C# API具有评估API来进行模型评估。多数训练示例在训练之后需要进行模型评估。 

    开始使用C#训练示例

    看完这个概述之后,可以通过两种方法继续C#培训示例:使用GitHub的CNTK源或使用CNTK NuGet for Windows处理CNTK示例。

    通过CNTK源码

    • 在windows下通过此页的步骤来建立CNTK
    • 通过VS编译CNTK.sln
    • 准备示例数据
    • 在CNTKLibraryCSTrainingTest.csproj中运行示例作为端到端测试

    通过CNTK NuGet获取CNTK示例

  • 相关阅读:
    [转载]C# 判断字符是否中文还是英文
    [转载]C#读写配置文件(XML文件)
    [转载]C#多线程学习(一) 多线程的相关概念
    [转载]C# HashTable 遍历与排序
    [转载]C# 多选功能(checkedListBox控件)
    [转载]在C#中使用官方驱动操作MongoDB
    [转载]MongoDB开发学习(2)索引的基本操作
    公钥私钥和RSA算法
    iOS 如何在一个已经存在多个project的workspace中引入cocoapods管理第三方类库
    应用号
  • 原文地址:https://www.cnblogs.com/taoeternal/p/7637578.html
Copyright © 2011-2022 走看看