Эта статья переведена с:"Понимание порядка выполнения и управления зависимостями", Если есть какое-либо нарушение, пожалуйста, свяжитесь, чтобы удалить его, только для академических обменов, пожалуйста, не используйте его в коммерческих целях. Если есть какие-либо ошибки, пожалуйста, свяжитесь, чтобы указать.
Как мы упоминали в начале, TensorFlow не сразу запускает определенные операции, а создает связанный узел в графе вычислений, который можно использовать сSession.run()
выполнить. Это позволяет TensorFlow выполнять оптимизацию во время выполнения, чтобы определить наилучший порядок выполнения и отсеять ненужные узлы из операций. Если вы просто используете в вычислительном графеtf.Tensors
, вам не нужно беспокоиться о зависимостях, но вы, скорее всего, будете использоватьtf.Variable()
, эта операция усложняет задачу. Мое предложение: если тензоров недостаточно для этой работы, просто используйтеVariables
Будет достаточно. Это может быть не интуитивно понятно, давайте сначала рассмотрим пример:
import tensorflow as tf
a = tf.constant(1)
b = tf.constant(2)
a = a + b
tf.Session().run(a)
Как мы и ожидали, "a" оценивается как 3. Обратите внимание, что мы создали 3 тензора, в том числе два постоянных тензора и тензор, хранящий результат сложения. Важно отметить, что мы не можем перезаписать значение тензора, если мы хотим изменить значение тензора, мы должны создать новый тензор, как мы только что сделали.
**Советы:**Если вы не определите новый вычислительный график, TF автоматически создаст для вас вычислительный график по умолчанию. ты можешь использовать
tf.get_default_graph()
Чтобы получить доступ к вычислительному графу, вы можете просмотреть вычислительный граф. Например, чтобы напечатать все тензоры этого вычислительного графа:
print(tf.contrib.graph_editor.get_tensors(tf.get_default_graph()))
В отличие от тензоров, переменные можно обновлять, поэтому давайте использовать переменные для достижения того, что нам нужно:
a = tf.Variable(1)
b = tf.constant(2)
assign = tf.assign(a, a + b)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(assign))
Опять же, как и ожидалось, мы снова получаем 3. уведомлениеtf.assign()
Возвращаемый тензор, представляющий эту операцию присваивания. До сих пор все работало нормально, но давайте рассмотрим немного более сложный пример:
a = tf.Variable(1)
b = tf.constant(2)
c = a + b
assign = tf.assign(a, 5)
sess = tf.Session()
for i in range(10):
sess.run(tf.global_variables_initializer())
print(sess.run([assign, c]))
Обратите внимание, что тензорc
Детерминированного значения нет. Это значение может быть 3 или 7, в зависимости от того, какие операции сложения и присваивания выполняются первыми.
Следует отметить, что порядок операций, определенный в коде, не зависит от среды выполнения TensorFlow. Единственное, что повлияет на порядок выполнения, этоуправляющие зависимости. Управлять зависимостями для тензоров просто. Каждый раз, когда вы используете тензор в операции, операция определяет неявную зависимость от этого тензора. Но если вы также используете переменные, все становится еще хуже, потому что переменные могут принимать много значений.
При работе с этими переменными вам может потребоваться явно использоватьtf.control_dependencies()
Для управления зависимостями, такими как:
a = tf.Variable(1)
b = tf.constant(2)
c = a + b
with tf.control_dependencies([c]):
assign = tf.assign(a, 5)
sess = tf.Session()
for i in range(10):
sess.run(tf.global_variables_initializer())
print(sess.run([assign, c]))
Это гарантирует, что операция присваивания вызывается после операции сложения.