Не найдено: FeedInputs: невозможно найти выходной канал TensorFlow

Я пытался этот пример использования сохраненной модели Tensorflow в C ++ на этом сайте:
https://medium.com/jim-fleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f#.ji310n4zo

Это работает хорошо. Но это не сохраняет значения переменных а также б так как он сохраняет только график, а не переменные. Я попытался заменить следующую строку:

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

с

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

конечно после создания объекта заставки. Это не работает, и это выводит:

Не найдено: FeedInputs: невозможно найти выходной канал a

Я проверил узлы загруженные узлы, и они только:

_ИСТОЧНИК

_SINK

находясь в функции write_graph и затем загружая модель в C ++, я загрузил следующие узлы:

_ИСТОЧНИК

_SINK

сохранение / restore_slice_1 / shape_and_slice

сохранение / restore_slice_1 / tensor_name

сохранение / restore_slice / shape_and_slice

сохранение / restore_slice / tensor_name

сохранения / сохранения / shapes_and_slices

сохранения / сохранения / tensor_names

сохранить / Const

сохранение / restore_slice_1

сохранение / restore_slice

б

сохранения / Assign_1

хлеб

б / initial_value

б / Присвоить

сохранения / Присвоить

сохранения / restore_all

сохранить / сохранить

сохранение / control_dependency

а / чтения

с

а / initial_value

а / Присвоить

в этом

Тензор

и даже файл графа, созданный saver.save (), намного меньше, 165B, по сравнению с файлом, созданным write_graph, 1.9KB.

5

Решение

Я не уверен, что это лучший способ решения проблемы, но, по крайней мере, он решает ее.

Поскольку write_graph также может хранить значения констант, я добавил следующий код в python непосредственно перед написанием графика с помощью функции write_graph:

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

Это создает константы, которые сохраняют значения переменных после обучения, а затем создают тензоры »assign_variables«присвоить их переменным. Теперь, когда вы вызываете write_graph, он будет хранить значения переменных в файле.

Осталось только назвать эти тензорыassign_variables«в коде c, чтобы убедиться, что вашим переменным присвоены значения констант, которые хранятся в файле. Вот один из способов сделать это:

      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);
}
3

Другие решения

Существует еще один способ восстановления переменных, вызывая save/restore_all операция, которая должна присутствовать на графике:

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);
1

По вопросам рекламы [email protected]