你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

CNTK评估隐藏层

本页介绍如何公开已训练模型的隐藏层值。

概述

CNTK模型基于互连层构建。 可以使用其中一些层进行评估, EvalDll 因为它们被标记为“输出”层。 为了通过 EvalDll这些层公开其他层,必须将这些层标记为输出层,方法是将其添加到 outputNodes 属性。

例如, 01_OneHidden_ndl_deprecated.cntk 配置文件引用 01_OneHidden.ndl 网络定义的文件。 在此网络说明文件中,我们定义了两个层:

h1 = DNNSigmoidLayer (featDim, hiddenDim, featScaled, 1)  
ol = DNNLayer (hiddenDim, labelDim, h1, 1)  

但只有一个层标记为输出:

outputNodes = (ol)

因此, EvalDll 将只返回与评估期间层相关的 ol 值。

为了能够评估 h1 隐藏层,我们需要先将其公开为输出节点。 有三种可能的方法:

1. 公开隐藏层的训练模型

若要输出 h1 层,只需将其添加为网络说明中的输出 (文件) 01_OneHidden.bs 训练时,该层就可以在评估期间进行读取:

outputNodes = (h1:ol)

但是,这意味着需要 (重新) 使用此配置训练模型。

2. 修改已训练的模型

使用 BrainScript 表达式加载时,可以动态修改模型。 本文档的未来更新中将对此文档进行记录。

3. 在加载模型以使用 EvalDll/EvalDllWrapper 模块进行评估时更改已训练模型的输出节点集

如果使用模块评估 EvalDll/EvalDllWrapper 已训练的属性,可以将带冒号分隔节点列表的属性添加到 outputNodeNames 网络定义中:

outputNodeNames = "h1.z:ol.z"

加载网络时,Eval 引擎将识别该 outputNodeNames 属性,并将模型的输出节点替换为属性中指定的 outputNodeNames 节点列表。

查看示例项目中的代码 CPPEvalClient ,显示 (未注释) 行,指定 outputNodeNames 属性:

networkConfiguration += "outputNodeNames=\"h1.z:ol.z\"\n";
networkConfiguration += "modelPath=\"" + modelFilePath + "\"";
model->CreateNetwork(networkConfiguration);

运行程序会显示层的 h1.z 相应输出。