Эффективный TensorFlow Глава 7. Понимание порядка выполнения и зависимостей управления

TensorFlow

Эта статья переведена с:"Понимание порядка выполнения и управления зависимостями", Если есть какое-либо нарушение, пожалуйста, свяжитесь, чтобы удалить его, только для академических обменов, пожалуйста, не используйте его в коммерческих целях. Если есть какие-либо ошибки, пожалуйста, свяжитесь, чтобы указать.

Как мы упоминали в начале, 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]))

Это гарантирует, что операция присваивания вызывается после операции сложения.