我在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调用模型。
编辑:我使用的模型是用与此example非常相似的代码创建的。
感谢任何帮助,我将奖励给最有帮助的人,即使他们不能完全解决问题。
发布于 2018-03-11 05:57:42
按照SRC的建议,我能够通过遵循这个question和这个doc中描述如何加载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)然后使用前面链接的文档中略微修改的辅助函数进行预测:
import mxnet as mx
import matplotlib.pyplot as plot
import cv2
import numpy as np
from mxnet.io import DataBatch
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(DataBatch([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 )发布于 2018-03-09 16:47:45
这不是一个完整的答案,因为我没有SageMaker设置(我也不知道MXNet),所以我不能实际测试这个方法(是的,正如已经提到的,我不想把它称为一个完整的答案,而是一个解决这个问题的可能的指针/方法)。
假设-
您提到您的模型与您提供的notebook链接非常相似。如果你仔细阅读笔记本上的文字,你会看到有这样的东西-
在此演示中,我们使用Caltech-256数据集,其中包含256个对象的30608张图像。对于训练和验证数据,我们遵循此MXNet示例中的拆分方案。
看到那里提到的MXNet了吗?让我们假设您没有做太多更改,因此您的模型也是使用MXNet构建的。
方法是-
假设我刚才提到的,如果你去搜索AWS SageMaker Python SDK的文档,你会看到一个关于模块序列化的部分。再一次,从另一个假设开始-
如果训练函数返回Module对象,则除非您已指定自定义保存函数,否则默认的Module序列化系统将序列化该对象。
假设这对于您的情况是真的,在同一文档中进一步阅读告诉我们,"model-shapes.json“是模型的JSON序列化表示,”model-symb.json“是通过调用模块的'symbol‘属性的'save’函数创建的模块符号的序列化,最后"module.params”是模块参数的序列化形式(我不确定它是文本格式还是二进制格式)。
有了这些知识,我们就可以查看MXNet的文档了。瞧!我们看到了如何使用MXNet保存和加载模型。因此,由于您已经有了这些已保存的文件,您只需要将它们加载到MXNet的本地安装中,然后运行它们来预测未知的情况。
我希望这能帮助你找到解决问题的方向。
额外奖励-
我不确定这是否也可以做同样的工作( @Seth Rothschild在评论中也提到了这一点),但是它应该可以,你可以看到AWS SageMaker Python SDK也有一种方法从保存的模型中加载模型。
发布于 2018-03-10 05:43:21
如果您想在本地托管经过训练的模型,并且使用Apache作为模型框架(就像在上面的示例中一样),最简单的方法是使用MXNet model MXNet: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"
https://stackoverflow.com/questions/49103679
复制相似问题