Разделы справки оценить модели в Python
- Оценка сохраненной сверточных сетей
- Извлечение признаков из определенного слоя с помощью обученной модели
Оценка сохраненной сверточных сетей
Существует несколько аспектов, которые следует учитывать с помощью моделей, обученных на изображениях. На этом этапе преобразования не являются частью модели, поэтому вычитание среднего значения должно выполняться вручную. Другая проблема заключается в том, что PIL загружает изображения в другом порядке, чем то, что использовалось во время обучения, и требуется транспозиция.
Предположим, что:
- во время обучения вычитали 128 из всех каналов
- Изображение, на которое вы хотите спрогнозировать, — "foo.jpg"
- вы сохранили модель в Python с помощью
z.save("mycnn.dnn")
затем можно сделать следующее:
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)
Если вы загружаете старую модель, обученную NDL или BrainScript, необходимо найти узел вывода модели следующим образом:
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.
...
Мы заботимся только о "z_output", который имеет индекс 2. Поэтому, чтобы получить реальные выходные данные модели, сделайте следующее:
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)
Причина выше заключается в том, что в старой модели сведения о обучении сохраняются в дополнение к фактическим параметрам модели.
Извлечение признаков из определенного слоя с помощью обученной модели?
Ниже приведен пример.