Я обучил линейный классификатор, используя консервированный оценщик .Он принимает 6 входных функций (tf.feature_column.numeric_column
) и выполняет двоичную классификацию.
Я экспортировал модель, используя estimator.export_savedmodel
, но все еще не понимаю, как правильно установить функцию serving_input_receiver_fn
для запроса прогноза на новом примере, скажем, массив 6x1.
Пока что я определил следующую функцию:
def serving_input_receiver_fn():
serialized_tf_example = tf.placeholder(dtype=tf.string,
shape=6)
receiver_tensors = {'input_feature': serialized_tf_example}
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
features = tf.parse_example(serialized_tf_example, feature_spec)
return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)
Кажется, что выполнение функции export_savedmodel
прошло успешно, я получаю вывод:
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Signatures INCLUDED in export for Classify: ['classification', 'serving_default']
INFO:tensorflow:Signatures INCLUDED in export for Predict: ['predict']
INFO:tensorflow:Signatures INCLUDED in export for Regress: ['regression']
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Eval: None
INFO:tensorflow:Restoring parameters from graphs/linear\model.ckpt-3000
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: export/linear_trial\temp-b'1536667847'\saved_model.pb
Проблема возникает, когдаЯ запрашиваю прогноз для нового примера с использованием протокола gRPC, скажем data= [1,0,0.5,1,0.5,1]
.Я создал канал, заглушку и учетные данные довольно просто, но мне не удалось это сделать с помощью запроса , здесь код:
data_str = [str(i) for i in data]
request = predict_pb2.PredictRequest()
request.model_spec.name = MODEL_NAME
request.model_spec.signature_name = 'predict'
request.inputs['input_feature'].CopyFrom( tf.contrib.util.make_tensor_proto(data_str, shape=[6]))
stub.Predict(request, 120)
и вывод:
File "[...]\client_app\venv_trial\lib\site-packages\grpc\_channel.py", line 448, in _end_unary_response_blocking"
raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
status = StatusCode.INTERNAL
details = "invalid header field value "Could not parse example input, value:
'1'\n\t [[Node: ParseExample/ParseExample = ParseExample[Ndense=6,
Nsparse=0, Tdense=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT,
DT_FLOAT, DT_FLOAT], _output_shapes=[[6,1], [6,1], [6,1],
[6,1], [6,1], [6,1]]
dense_shapes=[[1], [1], [1], [1], [1],
[1]], sparse_types=[],
_device=\"/job:localhost/replica:0/task:0/cpu:0\"](_arg_Placeholder_0_0,
ParseExample/ParseExample/names, ParseExample/ParseExample/dense_keys_0, ParseExample/ParseExample/dense_keys_1, ParseExample/ParseExample/dense_keys_2, ParseExample/ParseExample/dense_keys_3, ParseExample/ParseExample/dense_keys_4,
ParseExample/ParseExample/dense_keys_5,
ParseExample/Const,
ParseExample/Const_1, ParseExample/Const_2, ParseExample/Const_3, ParseExample/Const_4,
ParseExample/Const_5)]]""
Исходя из того, что я понимаю из вывода, кажется, что tenor_proto отформатирован неправильно, поэтому синтаксический анализ функций модели просто не удался.Я любезно приветствую любую помощь.