Compartir a través de


Cómo evaluar modelos en Python

Evaluación de una red convolucional guardada

Hay algunas cosas que se deben tener en cuenta con los modelos entrenados en imágenes. En este momento, las transformaciones no forman parte del modelo, por lo que restar la media debe realizarse manualmente. Otro problema es que PIL carga imágenes en un orden diferente al utilizado durante el entrenamiento y se requiere una transposición.

Suponiendo que:

  • durante el entrenamiento restó 128 de todos los canales
  • la imagen en la que desea predecir es "foo.jpg"
  • ha guardado el modelo en Python mediante z.save("mycnn.dnn")

después, puede hacer lo siguiente:

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)

Si va a cargar un modelo antiguo entrenado por NDL o BrainScript, deberá encontrar el nodo de salida del modelo de la siguiente manera:

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

Solo nos importa "z_output" que tiene el índice 2. Por lo tanto, para obtener la salida del modelo real, haga lo siguiente:

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)

La razón de lo anterior es que, en el modelo anterior, la información de entrenamiento se guarda además de los parámetros de modelo reales.

¿Extraer características de una capa específica mediante un modelo entrenado?

Hay un ejemplo aquí.