Dela via


Hur gör jag för att utvärdera modeller i Python

Utvärdera ett sparat convolutional-nätverk

Det finns några saker att tänka på med modeller som tränats på bilder. Nu är transformeringar inte en del av modellen, så subtrahering av medelvärdet måste göras manuellt. Ett annat problem är att PIL läser in bilder i en annan ordning än vad som användes under träningen och att en transposition krävs.

Förutsatt att:

  • under träningen subtraherade du 128 från alla kanaler
  • bilden som du vill förutsäga på är "foo.jpg"
  • du sparade din modell i Python med hjälp avz.save("mycnn.dnn")

kan du göra följande:

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)

Om du läser in en gammal modell som tränats av NDL eller BrainScript måste du hitta modellutdatanoden på följande sätt:

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

Vi bryr oss bara om "z_output" som har index 2. Så för att få utdata från den verkliga modellen gör du följande

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)

Orsaken till ovanstående är att träningsinformationen i den gamla modellen sparas utöver de faktiska modellparametrarna.

Extrahera funktioner från ett visst lager med hjälp av en tränad modell?

Det finns ett exempel här.