Я обучил свою модель в Amazon-SageMaker и загрузил ее на свой локальный компьютер. К сожалению, я понятия не имею, как запустить модель локально.

Модель находится в каталоге с файлами, такими как:

image-classification-0001.params
image-classification-0002.params
image-classification-0003.params
image-classification-0004.params
image-classification-0005.params
image-classification-symbol.json
model-shapes.json

Кто-нибудь знает, как запустить это локально с Python, или сможет указать мне ресурс, который может помочь? Я пытаюсь избежать вызова модели с помощью Amazon API.

Изменить: модель, которую я использовал, была создана с кодом, очень похожим на этот пример.

Буду признателен за любую помощь, я буду награждать награду тем, кто будет наиболее полезным, даже если они не решат полностью вопрос.

3
walker_4 5 Мар 2018 в 07:53

3 ответа

Лучший ответ

Следуя совету SRC, я смог заставить его работать, следуя инструкциям в этом вопрос и этот документ, в котором описано, как загрузить Модель MXnet.

Я загрузил модель так:

lenet_model = mx.mod.Module.load('model_directory/image-classification',5)
image_l = 64
image_w = 64
lenet_model.bind(for_training=False, data_shapes=[('data',(1,3,image_l,image_w))],label_shapes=lenet_model._label_shapes)

Затем прогнозируется использование слегка измененных вспомогательных функций в ранее связанной документации:

def get_image(url, show=False):
    # download and show the image
    fname = mx.test_utils.download(url)
    img = cv2.cvtColor(cv2.imread(fname), cv2.COLOR_BGR2RGB)
    if img is None:
         return None
    if show:
         plt.imshow(img)
         plt.axis('off')
    # convert into format (batch, RGB, width, height)
    img = cv2.resize(img, (64, 64))
    img = np.swapaxes(img, 0, 2)
    img = np.swapaxes(img, 1, 2)
    img = img[np.newaxis, :]
    return img

def predict(url, labels):
    img = get_image(url, show=True)
    # compute the predict probabilities
    lenet_model.forward(Batch([mx.nd.array(img)]))
    prob = lenet_model.get_outputs()[0].asnumpy()

    # print the top-5
    prob = np.squeeze(prob)
    a = np.argsort(prob)[::-1]

    for i in a[0:5]:
       print('probability=%f, class=%s' %(prob[i], labels[i]))

Наконец я назвал прогноз с этим кодом:

labels = ['a','b','c', 'd','e', 'f']
predict('https://eximagesite/img_tst_a.jpg', labels )
1
walker_4 10 Мар 2018 в 21:57

Если вы хотите разместить свою обученную модель локально, и вы используете Apache MXNet в качестве каркаса модели (как у вас в примере выше), самый простой способ - использовать MXNet Model Server: https://github.com/awslabs/mxnet-model-server

После того, как вы установили его локально, вы можете начать обслуживание с помощью:

mxnet-model-server \ --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model

А затем вызвать локальную конечную точку с изображением

curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg curl -X POST http://127.0.0.1:8080/squeezenet/predict -F "data=@kitten.jpg"

0
Guy 9 Мар 2018 в 21:43

Это не полный ответ, так как у меня нет настройки SageMaker (и я не знаю MXNet), и поэтому я практически не могу проверить этот подход (да, как уже упоминалось, я не хочу называть этот полный ответ скорее вероятным указатель / подход для решения этой проблемы).

Предположение -

Вы упомянули, что ваша модель очень похожа на указанную вами ссылку для ноутбука. Если вы внимательно прочитаете текст в блокноте, то увидите, что в какой-то момент происходит нечто подобное -

«В этой демонстрации мы используем набор данных Caltech-256, который содержит 30608 изображений 256 объектов. Для данных обучения и проверки мы следуем схеме разделения в этом примере MXNet».

Видите упоминание о MXNet там? Давайте предположим, что вы не сильно изменились, и, следовательно, ваша модель построена с использованием MXNet.

Подход -

Предполагая, что я только что упомянул, если вы идете и ищите в документации AWS SageMaker Python SDK Вы увидите раздел о сериализации модулей. Что опять-таки само по себе начинается с другого предположения -

«Если вы тренируете функцию, возвращающую объект Module, он будет сериализован системой сериализации Module по умолчанию, если вы не указали пользовательскую функцию сохранения».

Предполагая, что это верно для вашего случая, дальнейшее чтение в том же документе говорит нам, что «model-shape.json» представляет собой сериализованное представление JSON ваших моделей, «model-symbol.json» представляет собой сериализацию символов модуля, созданных вызов функции 'save' для свойства 'symbol' модуля, и, наконец, "module.params" является сериализованной (я не уверен, текст это или двоичный формат) формой параметров модуля.

С этими знаниями мы идем и изучаем документацию MXNet. И вуаля! здесь мы видим, как мы можем сохранить и загрузить модели с MXNet. Так как у вас уже есть эти сохраненные файлы, вам просто нужно загрузить их в локальной установке MXNet, а затем запустить их, чтобы предсказать неизвестное.

Я надеюсь, что это поможет вам найти направление для решения вашей проблемы.

Бонус -

Я не уверен, что это также может выполнять ту же работу (об этом также упоминает @Seth Rothschild в комментариях), но вы должны видеть, что AWS SageMaker Python SDK также позволяет загружать модели из сохраненных.

1
SRC 9 Мар 2018 в 08:52