облачное предсказание и локальное предсказание не возвращают одинаковый результат

#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