Sdílet prostřednictvím


Návody vyhodnocení modelů v Pythonu

Vyhodnocení uložené konvoluční sítě

U modelů natrénovaných na obrázcích je potřeba zvážit několik věcí. V tomto okamžiku transformace nejsou součástí modelu, takže odečtení průměru musí být provedeno ručně. Dalším problémem je, že PIL načítá obrázky v jiném pořadí, než se použilo při trénování a vyžaduje se provedení.

Za předpokladu, že:

  • během trénování odečítáte 128 ze všech kanálů.
  • obrázek, na který chcete předpovědět, je "foo.jpg".
  • uložili jste model v Pythonu pomocí z.save("mycnn.dnn")

pak můžete provést následující akce:

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)

Pokud načítáte starý model trénovaný pomocí NDL nebo BrainScriptu, budete muset najít výstupní uzel modelu následujícím způsobem:

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.
...

Záleží jen na tom, z_output, který má index 2. Pokud tedy chcete získat výstup skutečného modelu, postupujte následovně:

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)

Důvodem výše uvedeného je, že ve starém modelu se informace o trénování ukládají kromě skutečných parametrů modelu.

Extrahujte funkce z konkrétní vrstvy pomocí natrénovaného modelu?

Tady je příklad.