Jak mogę ocenianie modeli w języku Python
- Ocena zapisanej sieci splotowej
- Wyodrębnianie cech z określonej warstwy przy użyciu wytrenowanego modelu
Ocena zapisanej sieci splotowej
Istnieje kilka kwestii, które należy wziąć pod uwagę w przypadku modeli wytrenowanych na obrazach. W tym momencie przekształcenia nie są częścią modelu, dlatego odejmowanie średniej należy wykonać ręcznie. Innym problemem jest to, że pil ładuje obrazy w innej kolejności niż to, co zostało użyte podczas trenowania, a transpozycja jest wymagana.
Zakładając, że:
- podczas trenowania odejmowane 128 ze wszystkich kanałów
- obraz, na którym chcesz przewidzieć, to "foo.jpg"
- model został zapisany w języku Python przy użyciu polecenia
z.save("mycnn.dnn")
następnie możesz wykonać następujące czynności:
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)
Jeśli ładujesz stary model wytrenowany przez język NDL lub BrainScript, musisz znaleźć węzeł danych wyjściowych modelu w następujący sposób:
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.
...
Zależy nam tylko na "z_output", który ma indeks 2. Aby uzyskać rzeczywiste dane wyjściowe modelu, wykonaj następujące czynności
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)
Przyczyną powyższego jest to, że w starym modelu informacje treningowe są zapisywane oprócz rzeczywistych parametrów modelu.
Wyodrębnianie funkcji z określonej warstwy przy użyciu wytrenowanego modelu?
Oto przykład.