Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Not found: FeedInputs: unable to find feed output TensorFlow

I was trying this example of using Tensorflow saved model in c++ in this website: https://medium.com/jim-fleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f#.ji310n4zo

It works well. But it does not save the values of the variables a and b as it only saves the graph not the variables. I tried to replace the following line:

tf.train.write_graph(sess.graph_def, 'models/', 'graph.pb', as_text=False)

with

saver.save(sess, 'models/graph', global_step=0)

of course after creating the saver object. It does not work and it outputs:

Not found: FeedInputs: unable to find feed output a

I checked the nodes the Nodes that are loaded and they are only:

_SOURCE

_SINK

while in the write_graph function and then load the model in C++, I got the following nodes loaded:

_SOURCE

_SINK

save/restore_slice_1/shape_and_slice

save/restore_slice_1/tensor_name

save/restore_slice/shape_and_slice

save/restore_slice/tensor_name

save/save/shapes_and_slices

save/save/tensor_names

save/Const

save/restore_slice_1

save/restore_slice

b

save/Assign_1

b/read

b/initial_value

b/Assign

a

save/Assign

save/restore_all

save/save

save/control_dependency

a/read

c

a/initial_value

a/Assign

init

Tensor

and even the graph file that is created by saver.save() is much smaller, 165B, compared to the one created by write_graph, 1.9KB.

like image 764
Mostafa Hassan Avatar asked Sep 25 '22 16:09

Mostafa Hassan


2 Answers

I'm not sure if that is the best way of solving the problem but at least it solves it.

As write_graph can also store the values of the constants, I added the following code to the python just before writing the graph with write_graph function:

for v in tf.trainable_variables():
    vc = tf.constant(v.eval())
    tf.assign(v, vc, name="assign_variables")

This creates constants that store variables' values after being trained and then create tensors "assign_variables" to assign them to the variables. Now, when you call write_graph, it will store the variables' values in the file.

The only remaining part is to call these tensors "assign_variables" in the c code to make sure that your variables are assigned with the constants values that are stored in the file. Here is a one way to do it:

      Status status = NewSession(SessionOptions(), &session);
      std::vector<tensorflow::Tensor> outputs;
      for(int i = 0;status.ok(); i++) {
        char name[100];
        if (i==0)
            sprintf(name, "assign_variables");
        else
            sprintf(name, "assign_variables_%d", i);

        status = session->Run({}, {name}, {}, &outputs);
      }
like image 87
Mostafa Hassan Avatar answered Sep 28 '22 06:09

Mostafa Hassan


There is another way of restoring the variables, by calling the save/restore_all operation, that should be present in the graph:

std::vector<tensorflow::Tensor> outputs;
Tensor checkpoint_filepath(DT_STRING, TensorShape());
checkpoint_filepath.scalar<std::string>()() = "path to the checkpoint file";
status = session->Run( {{ "save/Const", checkpoint_filepath },}, 
                       {}, {"save/restore_all"}, &outputs);
like image 44
RaduK Avatar answered Sep 28 '22 06:09

RaduK