云预测和局部预测不会返回相同的结果

时间:2019-03-04 13:52:49

标签: python tensorflow google-cloud-ml

我用张量流训练了一个图像分类器,并将其部署在云中。当我在本地执行预测时,会得到结果,而当我使用已部署的模型执行批量预测时,会得到不同的结果。

要在本地执行预测,我使用此script

要在云中执行预测,我首先调整图像大小并将其转换为float32数组(使用该类型训练模型),然后使用以下命令将其另存为JSON文件:

import skimage, json
from PIL import Image
from resizeimage import resizeimage


with open('xxx.jpg', 'r+b') as f:
    with Image.open(f) as image:
        resized_image = resizeimage.resize_cover(image, [299,299])



converted_image = skimage.img_as_float32(resized_image).tolist()

with open('request.json','w') as jsonfile:
    json.dump({"image": converted_image}, jsonfile)

然后将请求上传到我的云存储桶中,并为预测创建作业,如下所示:

gcloud ml-engine jobs submit prediction "test_batch_prediction" \
                       --model "xxx" \
                       --input-paths "gs://path/to/my/request/request.json" \
                       --output-path "gs://path/to/where/prediction/will/be/saved/prediction_results/" \
                       --region "europe-west1" \
                       --data-format "text"

我认为问题在于调整图像大小并将其转换为float32,因为在执行训练或局部预测时我没有使用与张量流相同的方法。这可能是问题吗?还是我需要担心的其他事情。

1 个答案:

答案 0 :(得分:0)

您在本地使用的脚本将像素值归一化为0到255(平均默认为0):

normalized = tf.divide(tf.subtract(resize,[input_mean]),[input_std])

您用于上传到cloudml进行在线预测的代码缺少规范化步骤。添加此内容:

converted_image = converted_image / 255.0