Зачем нам нужен 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__()