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

在 Python 中如何实现评估模型

评估已保存的卷积网络

对于在图像上训练的模型,需要考虑一些事项。 此时,转换不是模型的一部分,因此必须手动减去平均值。 另一个问题是,PIL 按不同的顺序加载图像,而不是训练期间使用的图像,并且需要换行。

假设:

  • 在训练期间,从所有频道中减去 128
  • 要预测的图像为“foo.jpg”
  • 使用 在 Python 中保存模型 z.save("mycnn.dnn")

然后,可以执行以下操作:

from cntk.ops.functions import load_model
from PIL import Image 
import numpy as np

z = load_model("mycnn.dnn")
rgb_image = np.asarray(Image.open("foo.jpg"), dtype=np.float32) - 128
bgr_image = rgb_image[..., [2, 1, 0]]
pic = np.ascontiguousarray(np.rollaxis(bgr_image, 2))

predictions = np.squeeze(z.eval({z.arguments[0]:[pic]}))
top_class = np.argmax(predictions)

如果要加载由 NDL 或 BrainScript 训练的旧模型,则需要查找模型输出节点,如下所示:

for index in range(len(z.outputs)):
   print("Index {} for output: {}.".format(index, z.outputs[index].name))

...
Index 0 for output: CE_output.
Index 1 for output: Err_output.
Index 2 for output: OutputNodes.z_output.
...

我们只关心索引为 2 的“z_output”。 因此,若要获取实际模型输出,请执行以下操作

import cntk

z_out = cntk.combine([z.outputs[2].owner])
predictions = np.squeeze(z_out.eval({z_out.arguments[0]:[pic]}))
top_class = np.argmax(predictions)

上述原因在于,在旧模型中,除实际模型参数外,还会保存训练信息。

使用训练的模型从特定层中提取特征?

此处有一个示例。