Ошибка создания версии.Проверка модели не удалась: внешнее измерение для выходов должно быть неизвестно, внешнее измерение 'Const_1: 0' равно 5 - PullRequest
0 голосов
/ 19 марта 2019

Я обучил классификатор изображений с помощью tf.keras и экспортировал модель после завершения обучения, чтобы обслуживать ее в облаке и делать онлайн-прогнозы.

Я обслуживал свою модель на локальном хосте, используя:

tensorflow_model_server --model_base $PATH_TO_SAVEDMODEL --rest_api_port=9000 --model_name=saved_model

Мне удалось делать прогнозы и получать результаты. Когда я попытался развернуть модель в облаке, я получил ошибку в названии.

Дело в том, что я хочу сопоставить имена классов с результатами прогнозирования, и я смог добиться этого, выполнив следующие действия:

# after i got the label names i convert the variable to a tensor
label_names_tensor = tf.convert_to_tensor(label_names) # shape (5,)

для экспорта модели я использую это:

tf.saved_model.simple_save(
    sess,
    "./saved_models/v1",
    inputs={'image': model.input},
    outputs={'label' : label_names_tensor,'prediction': model.output[0]})

ПРИМЕЧАНИЕ:

  • model.output имеет форму (?, 5)
  • model.output [0] имеет форму (5,)

это работает локально, и я получаю имена классов, сопоставленные с результатами прогнозирования.

Очевидно, в чем проблема ... как я могу заставить это работать и правильно сопоставить имена классов с результатом предсказания?

Я пытался использовать функцию изменения формы, но не смог заставить ее работать. Я думаю, что мне нужно иметь это в конце:

  • форма label_names_tensor -> (?, 5)

так что я могу сделать это:

  • - output = {'label': label_names_tensor, 'Forecast': model.output}

любая помощь очень ценится

1 Ответ

0 голосов
/ 11 апреля 2019

Несколько вступительных замечаний. Во-первых, причина требования, согласно которому внешний размер входных данных должен быть None, заключается в том, чтобы обеспечить оптимизацию, включающую пакетирование входных данных. Входные данные основаны на строках: одна строка на вектор / матрицу / тензор входных объектов. Другое предположение состоит в том, что каждая входная строка создает ровно одну выходную строку. Поскольку число входных строк является переменным, количество выходных строк также будет.

Одним из следствий этого является то, что нет способа вывести «статическую» информацию, не повторяя ее в каждой из строк. Тем не менее, если вы обычно будете передавать только один вход за раз, повторений не будет, но у вас есть дополнительные издержки на обработку случая , как если бы их было больше одного строка ввода / вывода . Вы можете повторить помеченные строки следующим образом:

batch_size = tf.expand_dims(tf.shape(model.output)[0], [-1])
new_shape = tf.stack([batch_size[0], -1])
label_names_tensor = tf.reshape(tf.expand_dims(tf.tile(label_names, batch_size), [-1]), new_shape)
# ...
tf.saved_model.simple_save(
    sess,
    "./saved_models/v1",
    inputs={'image': model.input},
    outputs={'label' : label_names_tensor,'prediction': model.output})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...