what protocol protobuf google buffers protocol-buffers tensorflow

protocol-buffers - protocol - google:: protobuf



¿Cómo puedo ejecutar un gráfico de TensorFlow desde un protobuf en C++? (1)

El problema aquí es que está ejecutando el objetivo "train_step" , que realiza mucho más trabajo que solo la inferencia. En particular, intenta actualizar las variables W y b con el resultado del paso de descenso del gradiente. El mensaje de error

Invalid argument: Input 0 of node train_step/update_W/ApplyGradientDescent was passed float from _recv_W_0:0 incompatible with expected float_ref.

... significa que uno de los nodos que intentó ejecutar ( "train_step/update_W/ApplyGradientDescent" ) esperaba una entrada mutable (con tipo float_ref ) pero obtuvo una entrada inmutable (con tipo float ) porque el valor fue introducido.

Hay (al menos) dos soluciones posibles:

  1. Si solo quiere ver predicciones para una entrada dada y pesos dados, "softmax:0" lugar de "train_step" en la llamada a Session::Run() .

  2. Si desea realizar entrenamiento en C ++, no alimente W y b , sino que asigne valores a esas variables, luego continúe ejecutando "train_step" . Puede encontrar más fácil crear un tf.train.Saver cuando construye el gráfico en Python, y luego invocar las operaciones que produce para guardar y restaurar valores desde un punto de control.

Obtuve un tutorial de formulario de código simple y lo envió al archivo .pb como se muestra a continuación:

mnist_softmax_train.py

x = tf.placeholder("float", shape=[None, 784], name=''input_x'') y_ = tf.placeholder("float", shape=[None, 10], name=''input_y'') W = tf.Variable(tf.zeros([784, 10]), name=''W'') b = tf.Variable(tf.zeros([10]), name=''b'') tf.initialize_all_variables().run() y = tf.nn.softmax(tf.matmul(x,W)+b, name=''softmax'') cross_entropy = -tf.reduce_sum(y_*tf.log(y)) train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy, name=''train_step'') train_step.run(feed_dict={x:input_x, y_:input_y})

En C ++, cargo el mismo gráfico y alimento en datos falsos para probar:

Tensor input_x(DT_FLOAT, TensorShape({10,784})); Tensor input_y(DT_FLOAT, TensorShape({10,10})); Tensor W(DT_FLOAT, TensorShape({784,10})); Tensor b(DT_FLOAT, TensorShape({10,10})); Tensor input_test_x(DT_FLOAT, TensorShape({1,784})); for(int i=0;i<10;i++){ for(int j=0;j<10;j++) input_x.matrix<float>()(i,i+j) = 1.0; input_y.matrix<float>()(i,i) = 1.0; input_test_x.matrix<float>()(0,i) = 1.0; } std::vector<std::pair<string, tensorflow::Tensor>> inputs = { { "input_x", input_x }, { "input_y", input_y }, { "W", W }, { "b", b }, { "input_test_x", input_test_x }, }; std::vector<tensorflow::Tensor> outputs; status = session->Run(inputs, {}, {"train_step"}, &outputs); std::cout << outputs[0].DebugString() << "/n";

Sin embargo, esto falla con el error:

Invalid argument: Input 0 of node train_step/update_W/ApplyGradientDescent was passed float from _recv_W_0:0 incompatible with expected float_ref.

El gráfico se ejecuta correctamente en Python. ¿Cómo puedo ejecutarlo correctamente en C ++?