Python 在Amazon SageMaker内进行预测之前,对输入数据进行预处理

Python 在Amazon SageMaker内进行预测之前,对输入数据进行预处理,python,tensorflow,machine-learning,keras,amazon-sagemaker,Python,Tensorflow,Machine Learning,Keras,Amazon Sagemaker,我有一个Keras/tensorflow模型,我们自己训练过,它可以进行图像相关预测。我遵循这一点在Sagemaker中部署了模型,并可以调用端点进行预测 现在在我的客户端代码中,在调用Sagemaker端点进行预测之前,我需要下载图像并进行一些预处理。我希望在SageMaker中完成整个过程,而不是在客户端完成。我该怎么做 似乎我需要更新入口点python代码train.py,如下所述: sagemaker_model = TensorFlowModel(model_data = 's3://

我有一个Keras/tensorflow模型,我们自己训练过,它可以进行图像相关预测。我遵循这一点在Sagemaker中部署了模型,并可以调用端点进行预测

现在在我的客户端代码中,在调用Sagemaker端点进行预测之前,我需要下载图像并进行一些预处理。我希望在SageMaker中完成整个过程,而不是在客户端完成。我该怎么做

似乎我需要更新入口点python代码
train.py
,如下所述:

sagemaker_model = TensorFlowModel(model_data = 's3://' + sagemaker_session.default_bucket() + '/model/model.tar.gz',
                                  role = role,
                                  entry_point = 'train.py')
其他文章指出,我需要重写
input\u fn
函数来捕获预处理。但这些是指使用MXNet框架时使用的步骤。但我的模型是基于Keras/tensorflow框架的


因此,我不确定如何覆盖
input\u fn
函数。有人能提出建议吗?

我也遇到了同样的问题,最终找到了解决办法

一旦您准备好了
model_数据
,就可以使用以下行部署它

from sagemaker.tensorflow.model import TensorFlowModel
sagemaker_model = TensorFlowModel(
            model_data = 's3://path/to/model/model.tar.gz',
            role = role,
            framework_version = '1.12',
            entry_point = 'train.py',
            source_dir='my_src',
            env={'SAGEMAKER_REQUIREMENTS': 'requirements.txt'}
)

predictor = sagemaker_model.deploy(
    initial_instance_count=1,
    instance_type='ml.m4.xlarge', 
    endpoint_name='resnet-tensorflow-classifier'
)
您的笔记本应该有一个
my_src
目录,其中包含一个文件
train.py
和一个
requirements.txt
文件。
train.py
文件应定义一个功能
input\u fn
。对我来说,该函数处理图像/jpeg内容:

import io
import numpy as np
from PIL import Image
from keras.applications.resnet50 import preprocess_input
from keras.preprocessing import image

JPEG_CONTENT_TYPE = 'image/jpeg'

# Deserialize the Invoke request body into an object we can perform prediction on
def input_fn(request_body, content_type=JPEG_CONTENT_TYPE):
    # process an image uploaded to the endpoint
    if content_type == JPEG_CONTENT_TYPE:
        img = Image.open(io.BytesIO(request_body)).resize((300, 300))
        img_array = np.array(img)
        expanded_img_array = np.expand_dims(img_array, axis=0)
        x = preprocess_input(expanded_img_array)
        return x


    else: 
        raise errors.UnsupportedFormatError(content_type)
处理代码将取决于您使用的模型体系结构。我在用resnet50进行迁移学习,所以我使用了
keras.applications.resnet50
中的
preprocess\u input

请注意,由于我的
train.py
代码导入了一些模块,因此我必须提供定义这些模块的
requirements.txt
(这是我在文档中很难找到的部分)

希望这对将来的人有所帮助

my
requirements.txt

absl-py==0.7.1
astor==0.8.0
backports.weakref==1.0.post1
enum34==1.1.6
funcsigs==1.0.2
futures==3.2.0
gast==0.2.2
grpcio==1.20.1
h5py==2.9.0
Keras==2.2.4
Keras-Applications==1.0.7
Keras-Preprocessing==1.0.9
Markdown==3.1.1
mock==3.0.5
numpy==1.16.3
Pillow==6.0.0
protobuf==3.7.1
PyYAML==5.1
scipy==1.2.1
six==1.12.0
tensorboard==1.13.1
tensorflow==1.13.1
tensorflow-estimator==1.13.0
termcolor==1.1.0
virtualenv==16.5.0
Werkzeug==0.15.4

关于这个链接,这个问题也有一个相关的答案:我想,为了处理输出,我需要实现output_fn()?你有一个例子吗?嘿@Stiefel我没有输出的例子\u fn不幸的是,这似乎是一个很好的猜测!谢谢,output_fn确实是正确的猜测。