Я работаю над базовым примером обслуживания Tensorflow. Я следую примеру MNIST, за исключением того, что вместо классификации я хочу использовать массив NumPy в прогнозировать другой массив NumPy.
Для этого я сначала обучил свою нейронную сеть
x = tf.placeholder("float", [None, n_input],name ="input_values")
weights = {
'encoder_h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'encoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'encoder_h3': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_3])),
'decoder_h1': tf.Variable(tf.random_normal([n_hidden_3, n_hidden_2])),
'decoder_h2': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),
'decoder_h3': tf.Variable(tf.random_normal([n_hidden_1, n_input])),
}
biases = {
'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
'encoder_b3': tf.Variable(tf.random_normal([n_hidden_3])),
'decoder_b1': tf.Variable(tf.random_normal([n_hidden_2])),
'decoder_b2': tf.Variable(tf.random_normal([n_hidden_1])),
'decoder_b3': tf.Variable(tf.random_normal([n_input])),
}
# Building the encoder
def encoder(x):
# Encoder Hidden layer with sigmoid activation #1
layer_1 = tf.nn.tanh(tf.matmul(x, weights['encoder_h1'])+biases['encoder_b1'])
print(layer_1.shape)
# Decoder Hidden layer with sigmoid activation #2
layer_2 = tf.nn.tanh(tf.matmul(layer_1, weights['encoder_h2'])+biases['encoder_b2'])
print(layer_2.shape)
# Layer 3
layer_3 = tf.nn.tanh(tf.matmul(layer_2, weights['encoder_h3'])+biases['encoder_b3'])
print(layer_3.shape)
return layer_3# Building the decoder
def decoder(x):
# Encoder Hidden layer with sigmoid activation #1
layer_1 = tf.nn.tanh(tf.matmul(x, weights['decoder_h1'])+biases['decoder_b1'])
print(layer_1.shape)
# Decoder Hidden layer with sigmoid activation #2
layer_2 = tf.nn.tanh(tf.matmul(layer_1, weights['decoder_h2'])+biases['decoder_b2'])
# Layer 3
layer_3 = tf.nn.tanh(tf.matmul(layer_2, weights['decoder_h3'])+biases['decoder_b3'])
return layer_3
# Construct model
encoder_op = encoder(x)
decoder_op = decoder(encoder_op)
# Prediction
y = decoder_op# Objective functions
y_ = tf.placeholder("float", [None,n_input],name="predict")
Затем, как кто-то предложил здесь, я сохранил мою сеть, как это ..
import os
import sys
from tensorflow.python.saved_model import builder as saved_model_builder
from tensorflow.python.saved_model import utils
from tensorflow.python.saved_model import tag_constants, signature_constants
from tensorflow.python.saved_model.signature_def_utils_impl import build_signature_def, predict_signature_def
from tensorflow.contrib.session_bundle import exporter
with tf.Session() as sess:
# Initialize variables
sess.run(init)
# Restore model weights from previously saved model
saver.restore(sess, model_path)
print("Model restored from file: %s" % save_path)
export_path = '/tmp/AE_model/6'
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)signature = predict_signature_def(inputs={'inputs': x},
outputs={'outputs': y})
builder.add_meta_graph_and_variables(sess=sess,
tags=[tag_constants.SERVING],
signature_def_map={'predict': signature})
builder.save()print 'Done exporting!'
Далее я следую инструкциям для запуска моего сервера на локальном хосте: 9000
bazel build //tensorflow_serving/model_servers:tensorflow_model_server
Я настроил сервер
bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_base_path=/tmp/AE_model/
Теперь я хочу написать программу, чтобы я мог передавать векторы Mat из программы на C ++ в Eclipse (я использую множество библиотек) на мой сервер, чтобы я мог делать какие-то прогнозы.
Сначала я подумал об использовании inception_client.cc в качестве ссылки. Тем не менее, мне кажется, что мне нужен Bazel для его компиляции, потому что я нигде не могу найтиgnation_service.grpc.pb.h 🙁
так что, похоже, что мой единственный вариант — вызвать скрипт с использованием python, я получаю следующий вывод:
<grpc.beta._client_adaptations._Rendezvous object at 0x7f9bcf8cb850>
Любая помощь с этой проблемой будет оценена.
Спасибо.
Я переустановил protobuf и grpc и запустил команды, как было предложено:
Моя команда была немного другой, и мне приходилось использовать ее вне моей папки с серверами (в Ubuntu 14.04).
sudo protoc -I=serving -I serving/tensorflow --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` serving/tensorflow_serving/apis/*.proto
Это сгенерировало файлы .gprc.pb.h, и я перетащил их в папку / apis /, и ошибки исчезли. Теперь я получаю ошибку
/tensorflow/third_party/eigen3/unsupported/Eigen/CXX11/Tensor:1:42: fatal error: unsupported/Eigen/CXX11/Tensor: No such file or directory
Хотя этот файл существует. Любые предложения приветствуются.
Спасибо @subzero!
Мне удалось решить проблему с Eigen путем обновления до последней версии Eigen и сборки из исходного кода. Далее я указал на / usr / local / include / eigen3 /
После этого у меня были проблемы с библиотеками tenorflow. Я решил их, сгенерировав библиотеку libtensorflow_cc.so по предложению lababidi.
https://github.com/tensorflow/tensorflow/issues/2412
У меня есть последний вопрос. Кажется, все в порядке, за исключением того, что я получаю ошибку:
неопределенная ссылка на `tensorflow :: serve :: PredictRequest :: ~ PredictRequest () ‘
Кажется, мне не хватает ни компоновщика, ни библиотеки. Кто-нибудь знает, чего мне не хватает ???
Пример пользовательского клиента и сервера:
Код сервера для добавления в модель тензорного потока:
import grpc
from concurrent import futures
import python_pb2
import python_pb2_grpc
class PythonServicer(python_pb2_grpc.PythonServicer):def makePredictions(self, request, context):items = eval(str(request.items)) #Receives the input values for the model as a string and evaluates them into an array to be passed to tensorflow
x_feed = items
targetEval_out = sess.run(confidences, feed_dict={x:x_feed}) #"confidences" is the output of my model, replace it for the appropriate function from your modelout = str(targetEval_out.tolist()) #The model output is then put into string format to be passed back to the client. It has to be reformatted on the other end, but this method was easier to implement
return python_pb2.value(name=out)print("server online")
MAX_MESSAGE_LENGTH = 4 * 1024 * 1024 #can be edited to allow for larger amount of data to be transmitted per message. This can be helpful for making large numbers of predictions at once.
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10),
options=[('grpc.max_send_message_length', MAX_MESSAGE_LENGTH), (
'grpc.max_receive_message_length', MAX_MESSAGE_LENGTH)])
python_pb2_grpc.add_PythonServicer_to_server(
PythonServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
Код клиента C ++:
#include <grpc/grpc.h>
#include <grpc++/channel.h>
#include <grpc++/client_context.h>
#include <grpc++/create_channel.h>
#include <grpc++/security/credentials.h>
#include "python.grpc.pb.h"
using grpc::Channel;
using grpc::ClientContext;
using grpc::ClientReader;
using grpc::ClientReaderWriter;
using grpc::ClientWriter;
using grpc::Status;
using python::request;
using python::value;
using python::Python;
using namespace std;unsigned MAX_MESSAGE_LENGTH = 4 * 1024 * 1024; //can be edited to allow for larger amount of data to be transmitted per message. This can be helpful for making large numbers of predictions at once.
grpc::ChannelArguments channel_args;
channel_args.SetMaxReceiveMessageSize(MAX_MESSAGE_LENGTH);
channel_args.SetMaxSendMessageSize(MAX_MESSAGE_LENGTH);
shared_ptr<Channel> channel = CreateCustomChannel("localhost:50051", grpc::InsecureChannelCredentials(),channel_args);
unique_ptr<python::Python::Stub>stub = python::Python::NewStub(channel);
request r;
r.set_items(dataInputString); //The input data should be a string that can be parsed to a python array, for example "[[1.0,2.0,3.0],[4.0,5.0,6.0]]"//The server code was made to be able to make multiple predictions at once, hence the multiple data arrays
value val;
ClientContext context;
Status status = stub->makePredictions(&context, r, &val);
cout << val.name() << "\n"; //This prints the returned model prediction
Код python.proto:
syntax = "proto3";package python;
service Python {
rpc makePredictions(request) returns (value) {}}
message request {
string items = 1;
}message value {
string name = 1;
}
Я не уверен, что эти фрагменты кода работают сами по себе, так как я просто скопировал соответствующий код из моего текущего проекта. Но, надеюсь, это послужит хорошей отправной точкой для тех, кто нуждается в клиенте и сервере tenorflow.
pb.h
файл, который вы ищете, создается при запуске protc
на этот файл.
Вы можете следовать инструкциям, описанным Вот создать файл заголовка и использовать его самостоятельно. В любом случае, когда вы запустили сборку Basel, этот файл должен был быть сгенерирован в вашем каталоге сборки, вы можете настроить свой проект eclipse, чтобы использовать эти пути для компиляции вашего C-клиента.
Это не C ++, и это не совсем то, что вы ищете, но у нас есть клиент для прогнозирования, который вы можете использовать, если хотите.
https://github.com/epigramai/tfserving_predict_client/
Это основано на коде здесь, https://github.com/tobegit3hub/tensorflow_template_application, и я думаю, что мог бы быть клиент C ++, готовый использовать там.