Como fazer avaliar modelos no Python
- Avaliar uma rede convolucional salva
- Extrair recursos de uma camada específica usando um modelo treinado
Avaliar uma rede convolucional salva
Há algumas coisas a considerar com modelos treinados em imagens. Neste ponto, as transformações não fazem parte do modelo, portanto, a subtração da média deve ser feita manualmente. Outro problema é que o PIL carrega imagens em uma ordem diferente do que foi usado durante o treinamento e uma transposição é necessária.
Supondo que:
- durante o treinamento, você subtraiu 128 de todos os canais
- a imagem que você deseja prever é "foo.jpg"
- você salvou seu modelo no Python usando
z.save("mycnn.dnn")
em seguida, você 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 você estiver carregando um modelo antigo treinado por NDL ou BrainScript, será necessário encontrar o nó de saída do modelo da seguinte maneira:
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.
...
Nos preocupamos apenas com "z_output" que tem índice 2. Portanto, para obter a saída real do modelo, faça 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)
O motivo do exemplo acima é que, no modelo antigo, as informações de treinamento são salvas além dos parâmetros reais do modelo.
Extrair recursos de uma camada específica usando um modelo treinado?
Há um exemplo aqui.