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





5.00/5 (5投票s)
一旦模型构建完成,并且损失函数和验证函数满足我们的期望,我们就需要使用未参与训练的数据(未见过的数据)来验证和测试模型。
…接上一篇博文。
一旦模型构建完成,并且损失函数和验证函数满足我们的期望,我们就需要使用未参与训练的数据(未见过的数据)来验证和测试模型。模型验证非常重要,因为我们想知道我们的模型是否训练良好,以便能够近似地评估未见过的数据,就像评估训练数据一样。否则,无法预测输出的模型被称为过拟合模型。当模型训练时间足够长,在训练数据集上表现出非常高的性能,但在测试数据上评估结果很差时,就会发生过拟合。
我们将继续使用前两篇博文中的实现,并实现模型验证。模型训练完成后,模型和训练器会传递给 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