Когда global_variables_initializer() действительно требуется
import tensorflow as tf
x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')
# model = tf.global_variables_initializer()
with tf.Session() as session:
print("x = ", session.run(x))
# session.run(model)
print("y = ", session.run(y))
Я не мог понять, когда на самом деле требуется global_variables_initializer()
. В приведенном выше коде, если мы раскомментируем строки 4 и 7, я могу выполнить код и увидеть значения. Если я буду работать как есть, я вижу крах.
Мой вопрос в том, какие переменные он инициализирует. x
- константа, которая не нуждается в инициализации, а y
является переменной, которая не инициализируется, а используется как арифметическая операция.
Ответы
Ответ 1
tf.global_variables_initializer
- это ярлык для инициализации всех глобальных переменных. Это не требуется, и вы можете использовать другие способы инициализации своих переменных или, в случае простых сценариев, иногда вам не нужно их инициализировать вообще.
Все, кроме переменных, не требует инициализации (константы и заполнители). Но каждая используемая переменная (даже если она является константой) должна быть инициализирована. Это даст вам ошибку, хотя z
- всего лишь 0-й тензор с одним числом.
import tensorflow as tf
z = tf.Variable(4)
with tf.Session() as session:
print(session.run(z))
Я выделил используемое слово, потому что, если у вас просто есть переменные, которые не выполняются (или не зависит от них), вам не нужно их инициализировать.
Например, этот код будет выполняться без каких-либо проблем, тем не менее он имеет 2 переменные и одну операцию, которая зависит от них. Но бег не требует их.
import tensorflow as tf
x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')
z = tf.Variable(4)
a = y + z
with tf.Session() as session:
print("x = ", session.run(x))
Ответ 2
Из документов (акцент мой):
Вызов tf.Variable() добавляет несколько операций на график:
- Переменная op, которая содержит значение переменной.
- Инициализатор op, который устанавливает переменную в ее начальное значение. Это фактически tf.assign op.
- Опции для начального значения, такие как нули op для переменной смещений в примере, также добавляются в график.
Потом,
Инициализаторы переменных должны запускаться явно до того, как другие операционные системы в вашей модели могут быть запущены. Самый простой способ сделать это - добавить op, который запускает все инициализаторы переменных, и запустить этот op перед использованием модели.
Короче говоря, global_variables_initializer
никогда не требуется, Variable
инициализация. Всякий раз, когда у вас есть Variables
в коде, вы должны сначала их инициализировать. global_variables_initializer
инициализирует все Variables
, которые были ранее объявлены, и, следовательно, просто очень удобный способ сделать это.
Ответ 3
Это никогда не требуется, если вы не используете объявленный tf.Variable
или tf.placeholder
из своего сеанса сеанса tensorflow. Лично у меня всегда есть привычка запускать tf.global_variables_initializer()
. Он почти становится частью кода плиты котла при работе моделей тензорного потока:
with tf.Session(graph=graph) as sess:
sess.run(tf.global_variables_initializer())
# run model etc...
Ответ 4
tf.global_variables_initializer
просто инициализирует все переменные, которые будут перечислены tf.global_variables()
. Это действительно имеет смысл в распределенной среде, где граф может находиться в разных вычислительных узлах кластера.
В таком случае tf.global_variables_initializer()
который является просто псевдонимом для tf.variables_initializer(tf.global_variables())
, инициализирует все переменные во всех вычислительных узлах, где размещается граф.