Я обучил модель и развернул ее на службе обработки тензорного потока для вывода.
Я получаю эту ошибку при выполнении запроса:
<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,) и снял скобки, и проблема решилась сама собой.