Hur gör jag för att utvärdera modeller i Python
- Utvärdera ett sparat convolutional-nätverk
- Extrahera funktioner från ett visst lager med hjälp av en tränad modell
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 av
z.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.