#python #tensorflow #google-cloud-ml
#python #tensorflow #google-cloud-ml
Вопрос:
Я обучил классификатор изображений с помощью tensorflow и развернул его в облаке. Когда я выполняю локальное предсказание, я получаю результат, а когда я выполняю пакетное предсказание с использованием моей развернутой модели, я получаю другой результат.
для выполнения локального предсказания я использую этот скрипт
чтобы выполнить предсказание с облаком, я сначала изменяю размер своего изображения и преобразую его в массив 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, поскольку я не использую те же методы, что и tensorflow, при выполнении обучения или локального прогнозирования. Может ли это быть проблемой? или есть что-то еще, о чем мне нужно беспокоиться.
Ответ №1:
Используемый вами скрипт локально нормализовал значения пикселей в диапазоне от 0 до 255 (среднее значение по умолчанию равно 0):
normalized = tf.divide(tf.subtract(измененный размер, [input_mean]), [input_std])
В коде, который вы использовали для загрузки в cloudml для онлайн-прогнозирования, отсутствует этап нормализации. Добавьте это:
преобразованный образ = преобразованный образ / 255.0