0

mnist_clientPythonコードをc ++に書き直そうとしています。私はテンソルフローとTFサービングが初めてなので、いくつかの問題があります。チュートリアルと C++ クライアントの例を確認しました ( inception_client)。Pythonmnist_clientは問題なく動作しますが、C++ クライアントを実行すると、arg[0] is not a matrix

gRPC call return code: 3: In[0] is not a matrix 
 [[Node: MatMul = MatMul[T=DT_FLOAT, _output_shapes=[[?,10]], transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/cpu:0"](_arg_x_0_0, Variable/read)]]

チュートリアルのようにモデルをトレーニングし、読み取った minst データに問題がないことを確認しました。

これから: tensorflow 無効な引数: In[0] is not a matrixMatMul 、少なくとも 2-dim データが必要であることを理解しています。inception_clientしかし、私はと pythonの c++ コードを調べmnist_client、両方とも画像データを 1-dim char 配列に読み込みました...ここで何が欠けていますか?

のコードinception_client: https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/inception_client.cc

どんな助けでも大歓迎です。:)

class ServingClient{
public:
ServingClient(std::shared_ptr<Channel> channel) : stub_(PredictionService::NewStub(channel)){}

tensorflow::string callPredict( const tensorflow::string &model_name,
                                const tensorflow::string &model_signature,
                                const int num_tests){
PredictRequest request;
PredictResponse response;
ClientContext context;
int image_size;
int image_offset = 16;
int label_offset = 8;

request.mutable_model_spec()->set_name(model_name);
request.mutable_model_spec()->set_signature_name(model_signature);

google::protobuf::Map<tensorflow::string, tensorflow::TensorProto> &inputs = *request.mutable_inputs();

std::fstream imageFile("t10k-images-idx3-ubyte", std::ios::binary | std::ios::in);
std::fstream labelFile("t10k-labels-idx1-ubyte", std::ios::binary | std::ios::in);

labelFile.seekp(0);
imageFile.seekp(0);

uint32_t magic_number_images;
uint32_t nImages;
uint32_t magic_number_labels;
uint32_t rowsI =0;
uint32_t rowsL =0;
uint32_t colsI = 0;
uint32_t colsL = 0;


imageFile.read((char *)&magic_number_images, sizeof(magic_number_images));
imageFile.read((char *)&nImages, sizeof(nImages));
imageFile.read((char *)(&rowsI), sizeof(rowsI));
imageFile.read((char *)&colsI, sizeof(colsI));

image_size = ReverseInt(rowsI) * ReverseInt(colsI);

labelFile.read((char *)&magic_number_labels, sizeof(magic_number_labels));
labelFile.read((char *)&rowsL, sizeof(rowsL));

for(int i=0; i<num_tests; i++){
    tensorflow::TensorProto proto;

    labelFile.seekp(label_offset);
    imageFile.seekp(image_offset);

    //read mnist image
    char *img = new char[image_size]();
    char label = 0;
    imageFile.read((char *)img, image_size);

    image_offset += image_size;
    //read label
    labelFile.read(&label, 1);
    label_offset++;

    //predict
    proto.set_dtype(tensorflow::DataType::DT_STRING);
    proto.add_string_val(img, image_size);
    proto.mutable_tensor_shape()->add_dim()->set_size(1);
    inputs["images"] = proto;

    Status status = stub_->Predict(&context, request, &response);
    delete[] img;

    if(status.ok()){
    std::cout << "status OK." << std::endl;
    OutMap &map_outputs = *response.mutable_outputs();
    OutMap::iterator iter;
    int output_index = 0;

    for(iter = map_outputs.begin(); iter != map_outputs.end(); ++iter){
        tensorflow::TensorProto &result_tensor_proto = iter->second;
        tensorflow::Tensor tensor;
        //check if response converted succesfully 
        bool converted = tensor.FromProto(result_tensor_proto);
        if (converted) {
            std::cout << "the result tensor[" << output_index << "] is:" << std::endl
                        << tensor.SummarizeValue(10) << std::endl;
         } 
         else {
            std::cout << "the result tensor[" << output_index
                        << "] convert failed." << std::endl;
        }
        ++output_index;
                }
        }
    else{
        std::cout << "gRPC call return code: " << status.error_code() << ": "
            << status.error_message() << std::endl;
            }
        }
imageFile.close();
labelFile.close();
}

private:
    std::unique_ptr<PredictionService::Stub> stub_;

};

編集 1:問題は、モデルの作成方法と、クライアントが送信するデータの次元にあるに違いないと思います。ディメンションを設定するモデルをトレーニングおよびエクスポートする、提供された python プログラムを使用しました。

feature_configs = {'x': tf.FixedLenFeature(shape=[784], dtype=tf.float32),}
tf_example = tf.parse_example(serialized_tf_example, feature_configs)
x = tf.identity(tf_example['x'], name='x')  # use tf.identity() to assign name
y_ = tf.placeholder('float', shape=[None, 10])
w = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
4

1 に答える 1