Partilhar via


Como devo proceder para avaliar modelos em Python

Avaliar uma rede convolucional salva

Há algumas coisas a considerar com modelos treinados em imagens. Neste momento, as transformações não fazem parte do modelo, pelo que subtrair a média tem de ser feita manualmente. Outra questão é que o PIL carrega imagens numa ordem diferente da utilizada durante o treino e é necessária uma transposição.

Assumindo que:

  • durante o treino subtraíste 128 de todos os canais
  • a imagem que quer prever é "foo.jpg"
  • guardou o seu modelo em Python usandoz.save("mycnn.dnn")

então pode fazer o seguinte:

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)

Se estiver a carregar um modelo antigo treinado por NDL ou BrainScript, então terá de encontrar o nó de saída modelo da seguinte forma:

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

Preocupamo-nos apenas com o "z_output" que tem o índice 2. Então, a fim de obter a verdadeira modelo saída, fazer o seguinte

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)

A razão para o que precede é que, em modelo antigamente, a informação de treino é guardada para além dos parâmetros reais de modelo.

Características de extrato de uma camada específica usando um modelo treinado?

Há um exemplo aqui.