Зачем нам нужен TensorFlow tf.Graph?

В чем заключается цель:

with tf.Graph().as_default()

У меня есть код tensorflow, который использует выше. Однако код имеет только один граф, так зачем нам это нужно?

Ответы

Ответ 1

TL; DR: Это не нужно, но это хорошая практика.

Поскольку граф по умолчанию всегда зарегистрирован, каждый op и переменная помещается в граф по умолчанию. Однако оператор создает новый граф и помещает все (объявленные внутри своей области) в этот граф. Если граф является единственным графиком, он бесполезен. Но это хорошая практика, потому что, если вы начнете работать со многими графиками, вам будет легче понять, где размещены ops и vars. Поскольку это утверждение ничего не стоит, лучше все это написать. Чтобы быть уверенным, что если вы реорганизуете код в будущем, определенные операции будут принадлежать выбранному вами графику.

Ответ 2

Это артефакт того времени, когда вам нужно было явно указать график для каждого созданного вами оператора.

Я не видел каких-либо убедительных случаев, которые нуждались бы в более чем одном графике, поэтому вы обычно можете уйти с неявным графиком и использовать tf.reset_default_graph(), когда вы хотите стереть сланец чистой

Некоторые исправления:

  • Столб графа по умолчанию является потоком локальным, поэтому создание операций в нескольких потоках создает несколько графиков
  • Сессия хранит дескриптор своего графика (sess.graph), поэтому, если вы создаете сеанс перед вызовом tf.reset_default_graph(), ваш график сеанса будет отличаться от графика по умолчанию, что означает, что новые созданные вами ops не будут выполняться в этом sesson

Когда вы нажмете на одну из этих штрихов, вы можете установить конкретный graph (т.е. от tf.get_default_graph() в другом потоке или sess.graph) для графика по умолчанию следующим образом:

self.graph_context = graph.as_default()   # save it to some variable that won't get gc'ed
self.graph_context.enforce_nesting = False
self.graph_context.__enter__()