你当前正在访问 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)
上述原因在于,在旧模型中,除实际模型参数外,还会保存训练信息。
使用训练的模型从特定层中提取特征?
此处有一个示例。