我用张量流训练了一个图像分类器,并将其部署在云中。当我在本地执行预测时,会得到结果,而当我使用已部署的模型执行批量预测时,会得到不同的结果。
要在本地执行预测,我使用此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,因为在执行训练或局部预测时我没有使用与张量流相同的方法。这可能是问题吗?还是我需要担心的其他事情。
答案 0 :(得分:0)
您在本地使用的脚本将像素值归一化为0到255(平均默认为0):
normalized = tf.divide(tf.subtract(resize,[input_mean]),[input_std])
您用于上传到cloudml进行在线预测的代码缺少规范化步骤。添加此内容:
converted_image = converted_image / 255.0