Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sagemaker在本地实例上预测,JSON错误_Python_Mxnet_Amazon Sagemaker - Fatal编程技术网

Python Sagemaker在本地实例上预测,JSON错误

Python Sagemaker在本地实例上预测,JSON错误,python,mxnet,amazon-sagemaker,Python,Mxnet,Amazon Sagemaker,我试图在Sagemaker实例上,在MXNet上制作迁移学习方法。培训和服务从本地开始没有任何问题,我使用python代码预测: def predict_mx(net, fname): with open(fname, 'rb') as f: img = image.imdecode(f.read()) plt.imshow(img.asnumpy()) plt.show() data = transform(img, -1, test_aug

我试图在Sagemaker实例上,在MXNet上制作迁移学习方法。培训和服务从本地开始没有任何问题,我使用python代码预测:

def predict_mx(net, fname):
    with open(fname, 'rb') as f:
      img = image.imdecode(f.read())
      plt.imshow(img.asnumpy())
      plt.show()
    data = transform(img, -1, test_augs)
    plt.imshow(data.transpose((1,2,0)).asnumpy()/255)
    plt.show()
    data = data.expand_dims(axis=0)
    return net.predict(data.asnumpy().tolist())
我检查了data.asnumpy().tolist()是否正常,pyplot绘制图像(第一个是原始图像,第二个是调整大小的图像)。但是
net.predict
引发错误:

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-171-ea0f1f5bdc72> in <module>()
----> 1 predict_mx(predictor.predict, './data2/burgers-imgnet/00103785.jpg')

<ipython-input-170-150a72b14997> in predict_mx(net, fname)
     30     plt.show()
     31     data = data.expand_dims(axis=0)
---> 32     return net(data.asnumpy().tolist())
     33 

~/Projects/Lab/ML/AWS/v/lib64/python3.6/site-packages/sagemaker/predictor.py in predict(self, data)
     89         if self.deserializer is not None:
     90             # It's the deserializer's responsibility to close the stream
---> 91             return self.deserializer(response_body, response['ContentType'])
     92         data = response_body.read()
     93         response_body.close()

~/Projects/Lab/ML/AWS/v/lib64/python3.6/site-packages/sagemaker/predictor.py in __call__(self, stream, content_type)
    290         """
    291         try:
--> 292             return json.load(codecs.getreader('utf-8')(stream))
    293         finally:
    294             stream.close()

/usr/lib64/python3.6/json/__init__.py in load(fp, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    297         cls=cls, object_hook=object_hook,
    298         parse_float=parse_float, parse_int=parse_int,
--> 299         parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
    300 
    301 

/usr/lib64/python3.6/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    352             parse_int is None and parse_float is None and
    353             parse_constant is None and object_pairs_hook is None and not kw):
--> 354         return _default_decoder.decode(s)
    355     if cls is None:
    356         cls = JSONDecoder

/usr/lib64/python3.6/json/decoder.py in decode(self, s, _w)
    337 
    338         """
--> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    340         end = _w(s, end).end()
    341         if end != len(s):

/usr/lib64/python3.6/json/decoder.py in raw_decode(self, s, idx)
    355             obj, end = self.scan_once(s, idx)
    356         except StopIteration as err:
--> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
    358         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)
---------------------------------------------------------------------------
JSONDecodeError回溯(最近一次调用)
在()
---->1 predict_mx(predictor.predict'。/data2/burgers imgnet/00103785.jpg')
在predict_mx中(网络,fname)
30 plt.show()
31数据=数据。展开尺寸(轴=0)
--->32返回网络(data.asnumpy().tolist())
33
预测中的~/Projects/Lab/ML/AWS/v/lib64/python3.6/site-packages/sagemaker/predictor.py(自我,数据)
89如果self.deserializer不是None:
90#关闭流是反序列化程序的责任
--->91返回自.反序列化器(响应\正文,响应['ContentType'])
92数据=响应_body.read()
93响应_body.close()
~/Projects/Lab/ML/AWS/v/lib64/python3.6/site-packages/sagemaker/predictor.py in\uuuuuu调用(自、流、内容类型)
290         """
291试试:
-->292返回json.load(codecs.getreader('utf-8')(流))
293最后:
294 stream.close()
/加载中的usr/lib64/python3.6/json/\uuuuu init\uuuuuuu.py(fp、cls、object\u hook、parse\u float、parse\u int、parse\u constant、object\u pairs\u hook、**kw)
297 cls=cls,object\u hook=object\u hook,
298 parse_float=parse_float,parse_int=parse_int,
-->299 parse_常量=parse_常量,object_pairs_hook=object_pairs_hook,**千瓦)
300
301
/加载中的usr/lib64/python3.6/json/_init_uuuuu.py(s、编码、cls、对象钩子、解析浮点数、解析整型、解析常数、对象对钩子,**kw)
352 parse_int为无,parse_float为无,且
353 parse_常量为None且对象_pairs_hook为None且非kw):
-->354返回\u默认\u解码器。解码
355如果cls为无:
356 cls=JSONDecoder
/解码中的usr/lib64/python3.6/json/decoder.py(self,s,_w)
337
338         """
-->339 obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
340 end=_w(s,end).end()
341如果结束!=(s)
/原始解码中的usr/lib64/python3.6/json/decoder.py(self、s、idx)
355 obj,end=自扫描一次(s,idx)
356除了停止迭代作为错误:
-->357将JSONDecodeError(“预期值”,s,err.value)从None提升
358返回obj,结束
JSONDecodeError:应为值:第1行第1列(字符0)
我试着用json.dump转储我的数据,这没有问题

请注意,我还没有在AWS上部署该服务,我希望能够在制造更大的列车之前在本地测试模型和预测,并在以后提供服务


感谢您的帮助

您对从笔记本传递到预测环境(在docker中)的数据的反序列化有问题,但鉴于提供的代码,我无法重现此问题。使用MXNet估计器时(例如,从sagemaker.MXNet导入MXNet的
),您可以在入口点脚本中实现
转换\u fn
,以反序列化数据并使用模型进行预测。在函数的开头使用
json.loads
,如下例所示

def transform_fn(net, data, input_content_type, output_content_type):
    """
    Transform a request using the Gluon model. Called once per request.
    :param net: The Gluon model.
    :param data: The request payload.
    :param input_content_type: The request content type.
    :param output_content_type: The (desired) response content type.
    :return: response payload and content type.
    """
    # we can use content types to vary input/output handling, but
    # here we just assume json for both
    parsed = json.loads(data)
    nda = mx.nd.array(parsed)
    output = net(nda)
    prediction = mx.nd.argmax(output, axis=1)
    response_body = json.dumps(prediction.asnumpy().tolist()[0])
    return response_body, output_content_type
如果
json.loads
命令仍然存在问题,您应该检查
数据的值,并仔细查找与编码相关的问题(即以
\
开头的字符串无效)


注意:函数和堆栈跟踪中还有不同的代码,因此您可能需要确认您正在运行您认为正在运行的代码。您提到您尚未部署(本地或实例),但这是预测所必需的。

调用net.predict工作正常

您似乎正在使用SageMaker Python SDKpredict\u fn进行托管。调用预测\u fn后,MXNet容器将尝试将预测序列化为JSON,然后再将其发送回客户端。您可以在此处看到这样做的代码:

容器序列化失败,因为net.predict未返回可序列化对象。您可以通过返回列表来解决此问题:

return net.predict(data.asnumpy().tolist()).asnumpy().tolist()

另一种选择是使用变换\u fn而不是预测\u fn,这样您就可以自己处理输出序列化。你可以在这里看到一个变换的例子

我建议你使用这个方法。估计器上可用的
predict
糖很难使用。但是,您可以使用本地predictor SageMaker会话来获取一个运行时客户机,您可以在该客户机上使用invoke。但这并不能解释错误:)不管怎样,你可能是对的。当然,我只是提供了一个解决方法,但是,如果在使用invoke_endpoint时遇到类似的问题,那么代码可能会有问题。你能提供一点关于在这种情况下
net
对象是什么的上下文吗?它是MXNet模块,还是SageMaker定制的模块。你能告诉我数据的类型和形状吗,谢谢!