Hoe kan ik modellen evalueren in Python
- Een opgeslagen convolutionele netwerk evalueren
- Functies uit een specifieke laag extraheren met behulp van een getraind model
Een opgeslagen convolutionele netwerk evalueren
Er zijn enkele dingen om rekening mee te houden met modellen die zijn getraind op afbeeldingen. Op dit moment maken de transformaties geen deel uit van het model, zodat het gemiddelde handmatig moet worden afgetrokken. Een ander probleem is dat PIL afbeeldingen in een andere volgorde laadt dan wat tijdens de training is gebruikt en dat een omzetting vereist is.
Ervan uitgaande dat:
- tijdens de training hebt u 128 afgetrokken van alle kanalen
- de afbeelding waarop u wilt voorspellen is 'foo.jpg'
- u uw model hebt opgeslagen in Python met behulp van
z.save("mycnn.dnn")
vervolgens kunt u het volgende doen:
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)
Als u een oud model laadt dat is getraind door NDL of BrainScript, moet u het uitvoerknooppunt van het model als volgt vinden:
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.
...
We geven alleen om 'z_output' met index 2. Ga als volgt te werk om de uitvoer van het echte model op te halen
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)
De reden hiervoor is dat in het oude model de trainingsgegevens worden opgeslagen naast de werkelijke modelparameters.
Functies uit een specifieke laag extraheren met behulp van een getraind model?
Hier volgt een voorbeeld.