tensorflow/serving — ввод для изменения формы — это тензор со 100 значениями, но запрошенная форма имеет 10000

Когда я обучаю свою модель функционального API tf.keras и обслуживаю ее с изображением докера tensorflow/serving, я получаю ошибку формы при вызове API.

Как я строю свою модель:

from tensorflow.keras.layers import Dense, DenseFeatures, Input
from tensorflow.keras.models import Model
from tensorflow import feature_column, string as tf_string
import os

feature_layer_inputs = {}
feature_columns = []
for header in ['categorical_one', 'categorical_two', 'categorical_three']:
    feature_columns.append(feature_column.indicator_column(
        feature_column.categorical_column_with_hash_bucket(header, hash_bucket_size=100)))
    feature_layer_inputs[header] = Input(shape=(1,), name=header, dtype=tf_string)


fc_layer = DenseFeatures(feature_columns)
fc = fc_layer(feature_layer_inputs)

''' Feature Columns to Dense and merge with attention output '''

fc = Dense(300, activation='relu')(fc)
fc = Dense(324, activation='relu')(fc)

pred = Dense(num_classes, activation='softmax')(fc)

inputs = [v for v in feature_layer_inputs.values()]

model = Model(inputs=inputs, outputs=pred)

model.compile(...)

model.fit(...)

saved_model_path = "C:/Temp/saved_models/{}".format(int(time.time()))
os.mkdir(saved_model_path)

model.save(saved_model_path)

Как выглядит мое определение подписи обслуживания:

The given SavedModel SignatureDef contains the following input(s):
inputs['categorical_one'] tensor_info:
dtype: DT_STRING
shape: (-1, 1)
name: serving_default_categorical_one:0
inputs['categorical_two'] tensor_info:
dtype: DT_STRING
shape: (-1, 1)
name: serving_default_categorical_two:0
inputs['categorical_three'] tensor_info:
dtype: DT_STRING
shape: (-1, 1)
name: serving_default_categorical_three:0
The given SavedModel SignatureDef contains the following output(s):
outputs['dense'] tensor_info:
dtype: DT_FLOAT
shape: (-1, num_classes)
name: StatefulPartitionedCall:0
Method name is: tensorflow/serving/predict

Как я называю Serving API:

curl -d '{"instances": [ {"categorical_one": "ABC", "categorical_two": "DEF", "categorical_three": "GHI"} ] }' -X POST http://localhost:8501/v1/models/my-model-name/versions/1:predict

Сообщение об ошибке, которое я получаю:

{ "error": "Input to reshape is a tensor with 100 values, but the requested shape has 10000\n\t [[{{node StatefulPartitionedCall/StatefulPartitionedCall/model/dense_features/categorical_one_indicator/Reshape}}]]" }

Обратите внимание, что я опубликовал только важные части кода, а не каждую строку.

Любая идея приветствуется!


person Tom    schedule 13.09.2019    source источник


Ответы (2)


Похоже, тензорному потоку не нравятся явно определенные формы во входных слоях для DenseFeatures. Я изменил следующую строку кода, и это сработало.

feature_layer_inputs[header] = Input(shape=(), name=header, dtype=tf_string)

Далее проверю результаты на реальной обученной модели..

person Tom    schedule 16.09.2019

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

Обратите внимание, где именно возникает ошибка. В вашем случае написано:

[[{{node StatefulPartitionedCall/StatefulPartitionedCall/model/dense_features/categorical_one_indicator/Reshape}}]]

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

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

например, в моем случае это было в [[{{node chars/Reshape_1}}]]. Итак, я искал узел chars

введите здесь описание изображения

а затем Reshape_1 внутри узла chars.

введите здесь описание изображения

Теперь вы можете видеть входные и выходные данные и другие полезные атрибуты, такие как форма. Это помогло мне точно понять, в чем была проблема.

person Bal Krishna Jha    schedule 23.04.2020