Я пытался этот пример использования сохраненной модели 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.
Я не уверен, что это лучший способ решения проблемы, но, по крайней мере, он решает ее.
Поскольку 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);
}
Существует еще один способ восстановления переменных, вызывая 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);