'transpose ожидает вектор размера 5. Но input (1) - это вектор размера 3 \ n \ t "при выполнении запроса POST вывода для модели обслуживания tenorflow - PullRequest
0 голосов
/ 08 февраля 2019

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

Я получаю эту ошибку при выполнении запроса:

<Response [400]>
{'error': 'transpose expects a vector of size 5. But input(1) is a vector of size 3\n\t [[{{node bidirectional_1/transpose}} = Transpose[T=DT_FLOAT, Tperm=DT_INT32, _class=["loc:@bidirectional_1/TensorArrayUnstack/TensorArrayScatter/TensorArrayScatterV3"], _output_shapes=[[50,?,512]], _device="/job:localhost/replica:0/task:0/device:CPU:0"](embedding_1/embedding_lookup, Attention/transpose/perm)]]'}

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

Вот как я тестирую запрос POST к моей модели tf-Обслуживание:

with open("CNN_last_test_set.pkl", "rb") as fp:
    x_arr_test, y_test = pickle.load(fp)

out = x_arr_test[:1, :]
out = out.tolist()
payload = {
    "instances": [{'input': [out]}]
}

r = requests.post('http://localhost:9000/v1/models/prod_mod:predict', json=payload)
pred = json.loads(r.content.decode('utf-8'))

Чтобы создать объект модели тензорного потока для использования с tf-Обслуживание, я использую эту функцию:

def export_model_custom_layer(filename, export_path_base):
    # set the mode to test time.
    K.set_learning_phase(0)
    model = keras.models.load_model(filename, custom_objects={"Attention": Attention})
    sess = K.get_session()

    # set the path to save the model and model version
    export_version = 1

    export_path = os.path.join(
        tf.compat.as_bytes(export_path_base),
        tf.compat.as_bytes(str(export_version)))
    tf.saved_model.simple_save(
        sess,
        export_path,
        inputs={'input': model.input},
        outputs={t.name.split(':')[0]: t for t in model.outputs},
        legacy_init_op=tf.tables_initializer())

Где я определил свой уровень клиента как пользовательский объект, чтобычтобы это работало, я добавил эту функцию на свой уровень клиента:

    def get_config(self):
        config = {
            'name': "Attention"
                  }
        base_config = super(Attention, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))

Когда я прогнозирую, когда модель использует тот же формат данных, который получает модель tf-Обслуживание с использованием стандартного keras model.predict (), он работает как задумано:

class Attention(Layer):...

with open("CNN_last_test_set.pkl", "rb") as fp:
    x_arr_test, y_test = pickle.load(fp)

model = keras.models.load_model(r"Data/modelCNN.model", custom_objects={"Attention": Attention})
out = x_arr_test[:1, :]
test1 = out.shape
out = out.tolist()

test = model.predict([out])

>> print(test)
>> [[0.21351092]]

Это наводит меня на мысль, что проблема возникает либо при экспорте модели из кераса в файл .pb oВ некотором роде модель запускается в контейнере Docker.

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

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

РЕДАКТИРОВАТЬ: я решил проблему, проблема заключалась в том, что мои входные данные имели два дополнительных измерения, чем необходимо.Я понял, что когда я убрал скобки вокруг переменной «out», моя ошибка изменилась с «transpose ожидает вектор размера 5» на «transpose ожидает вектор размера 4».Поэтому я изменил свою переменную out из (1, 50) в (50,) и снял скобки, и проблема решилась сама собой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...