65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 测试和验证 CNTK 模型

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2017年11月15日

CPOL

1分钟阅读

viewsIcon

16558

一旦模型构建完成,并且损失函数和验证函数满足我们的期望,我们就需要使用未参与训练的数据(未见过的数据)来验证和测试模型。

…接上一篇博文。

一旦模型构建完成,并且损失函数和验证函数满足我们的期望,我们就需要使用未参与训练的数据(未见过的数据)来验证和测试模型。模型验证非常重要,因为我们想知道我们的模型是否训练良好,以便能够近似地评估未见过的数据,就像评估训练数据一样。否则,无法预测输出的模型被称为过拟合模型。当模型训练时间足够长,在训练数据集上表现出非常高的性能,但在测试数据上评估结果很差时,就会发生过拟合。

我们将继续使用前两篇博文中的实现,并实现模型验证。模型训练完成后,模型和训练器会传递给 Evaluation 方法。Evaluation 方法加载测试数据并使用传递的模型计算输出。然后,它将计算出的(预测的)值与测试数据集的输出进行比较,并计算准确率。以下源代码显示了评估实现。

private static void EvaluateIrisModel(Function ffnn_model, Trainer trainer, DeviceDescriptor device)
{
    var dataFolder = "Data";//files must be on the same folder as program
    var trainPath = Path.Combine(dataFolder, "testIris_cntk.txt");
    var featureStreamName = "features";
    var labelsStreamName = "label";

    //extract features and label from the model
    var feature = ffnn_model.Arguments[0];
    var label = ffnn_model.Output;

    //stream configuration to distinct features and labels in the file
    var streamConfig = new StreamConfiguration[]
        {
            new StreamConfiguration(featureStreamName, feature.Shape[0]),
            new StreamConfiguration(labelsStreamName, label.Shape[0])
        };

    // prepare testing data
    var testMinibatchSource = MinibatchSource.TextFormatMinibatchSource(
        trainPath, streamConfig, MinibatchSource.InfinitelyRepeat, true);
    var featureStreamInfo = testMinibatchSource.StreamInfo(featureStreamName);
    var labelStreamInfo = testMinibatchSource.StreamInfo(labelsStreamName);

    int batchSize = 20;
    int miscountTotal = 0, totalCount = 20;
    while (true)
    {
        var minibatchData = testMinibatchSource.GetNextMinibatch((uint)batchSize, device);
        if (minibatchData == null || minibatchData.Count == 0)
            break;
        totalCount += (int)minibatchData[featureStreamInfo].numberOfSamples;

        // expected labels are in the mini batch data.
        var labelData = minibatchData[labelStreamInfo].data.GetDenseData<float>(label);
        var expectedLabels = labelData.Select(l => l.IndexOf(l.Max())).ToList();

        var inputDataMap = new Dictionary<Variable, Value>() {
            { feature, minibatchData[featureStreamInfo].data }
        };

        var outputDataMap = new Dictionary<Variable, Value>() {
            { label, null }
        };

        ffnn_model.Evaluate(inputDataMap, outputDataMap, device);
        var outputData = outputDataMap[label].GetDenseData<float>(label);
        var actualLabels = outputData.Select(l => l.IndexOf(l.Max())).ToList();

        int misMatches = actualLabels.Zip(expectedLabels, (a, b) => a.Equals(b) ? 0 : 1).Sum();

        miscountTotal += misMatches;
        Console.WriteLine($"Validating Model: Total Samples = {totalCount}, 
                                              Mis-classify Count = {miscountTotal}");

        if (totalCount >= 20)
            break;
    }
    Console.WriteLine($"---------------");
    Console.WriteLine($"------TESTING SUMMARY--------");
    float accuracy = (1.0F - miscountTotal / totalCount);
    Console.WriteLine($"Model Accuracy = {accuracy}");
    return;
}

实现的这个方法在之前的 Training 方法中调用。

 EvaluateIrisModel(ffnn_model, trainer, device);

如您所见,模型验证表明该模型可以高精度地预测数据,如图所示

这是关于使用前馈神经网络使用 CNTK 和 C# 训练 Iris 数据的博客系列中的最新文章。

所有三个示例的完整源代码可以在 这里 找到。

分类于:.NET, C#, CNTK, CodeProject
标签:.NET, C#, CNTK, Code Project, CodeProject, Machine Learning

© . All rights reserved.