在为自己的模型提供服务时,我发现了一条有线错误消息,我已经用saved_model.load测试了.pb文件,这一切都很好,但是当我通过客户端发送请求时,会报告以下错误:
<_终止于的RPC的集合: 状态= StatusCode.INVALID_ARGUMENT details =“在图中未找到在feed_devices或fetch_devices中指定的张量:0: debug_error_string =“ {”创建“:” @ 1537040456.210975912“,”描述“:”从同级收到错误“,”文件“:” src / core / lib / surface / call.cc“,” file_line“:1099,” grpc_message在图表中找不到“:”在feed_devices或fetch_devices中指定的 Tensor:0 “”,“ grpc_status”:3}“ >
接线部分是报告的未找到张量的Tensor没有名称,我猜这是由于客户端要求输入此空张量而引起的。但我只是不知道此操作可能来自哪里。
我基于mnist客户端和Inception客户端示例代码构建服务,通过tf.saved_model.loader.load重新加载已成功测试了导出的.pb模型,所以我认为问题是由请求引起的。 / p>
这是客户端代码的一部分:
channel = grpc.insecure_channel(FLAGS.server)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = predict_pb2.PredictRequest()
request.model_spec.name = 'chiron'
request.model_spec.signature_name = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
collector = _Result_Collection()
for batch_x,seq_len,i,f,N,reads_n in data_iterator(FLAGS.raw_dir):
request.inputs['signals'].CopyFrom(
tf.contrib.util.make_tensor_proto(batch_x, shape=[FLAGS.batch_size, CONF.SEGMENT_LEN]))
request.inputs['seq_length'].CopyFrom(
tf.contrib.util.make_tensor_proto(seq_len, shape=[FLAGS.batch_size]))
result_future = stub.Predict.future(request, 5.0) # 5 seconds
result_future.add_done_callback(_post_process(collector,i,f))
答案 0 :(得分:0)
我找到了原因,这是因为在创建SparseTensor的TensorProto时,没有分配名称。 也请参见此处: https://github.com/tensorflow/serving/issues/1100 因此,一种解决方案是分别为稀疏Tensor构建TensorProto:
import tensorflow as tf
signal = tf.constant([[[1]]])
sequence_length = tf.constant([1])
output,log_prob = tf.nn.ctc_beam_search_decoder(signal,sequence_length)
indices = output[0].indices
values = output[0].values
dense_shape = output[0].dense_shape
indices_tensor_proto = tf.saved_model.utils.build_tensor_info(indices)
values_tensor_proto = tf.saved_model.utils.build_tensor_info(values)
dense_shape_tensor_proto = tf.saved_model.utils.build_tensor_info(dense_shape)