Заполнители в Tensorflow

Чтобы быстро резюмировать, как выполняется программа тензорного потока.

  1. Создание графа (А.К.А. Сборка графа)
  2. Используйте сеанс для выполнения графика

Допустим, вам нужно построить график для потрясающей концепции, о которой вы придумали, но, к сожалению, вы не знаете, какими значениями должны быть на данный момент, иначе было бы слишком много думать о значениях в этот момент. Что бы вы сделали ? Well tensorflow предоставляет «заполнители» именно для этого сценария.

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

Заполнители

Синтаксис: tf.placeholder(dtype, shape=None, name=None)

Несколько примеров:

a = tf.placeholder(tf.float32, shape=[3]) # Placeholder vector of 3 elements with dtype float 32
b = tf.constant([1, 2, 3], tf.float32) # Constant vector of 3 elements with dtype float 32
c = tf.add(a,b)
with tf.Session() as sess:
    sess.run(c) # Throws and error because a does not have actual values assigned

Как присвоить значения заполнителям?

Один из способов присвоить значение заполнителю - использовать словарь.

sess.run(c, {a:[1,2,4]}) Изменение строки в приведенном выше коде приведет к выводу >>>[2,4,7].

shape = None в синтаксисе означает, что заполнитель может принимать тензор любой формы в качестве заполнителя. Это простой способ использовать заполнители, но это не рекомендуется, так как сложно отлаживать код с shape = None.

Заполнители - это допустимые операции, поэтому мы можем использовать их в таких операциях, как добавление, подпрограмма и т. Д.

Ленивая загрузка переменных в Tensorflow

Tensorflow использует технику для отсрочки инициализации переменной до тех пор, пока она не понадобится для вычислений, которую я здесь называю ленивой загрузкой, не путайте с какой-либо другой концепцией. Это помогает снизить объем памяти, а также повысить эффективность загрузки переменных.

Нормальная загрузка переменных в примере

x = tf.Variable(10, name='x')
y = tf.Variable(20, name='y')
z = tf.add(x, y) # you create the node for add node before executing the graph 
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    writer = tf.summary.FileWriter('./my_graph/l2', sess.graph)
    for _ in range(10):
        sess.run(z)
    print sess.run(z)
    writer.close()
# Output
30

Отложенная (Lazy) загрузка переменных в примере

x = tf.Variable(10, name='x')
y = tf.Variable(20, name='y')
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    writer = tf.summary.FileWriter('./my_graph/l2', sess.graph)
    for _ in range(10):
        sess.run(tf.add(x, y)) # Trying to save a line of code
    print sess.run(tf.add(x,y))
    writer.close()
# Output
30

В обоих случаях на выходе получается 30, но способ инициализации переменных сильно различается.

В случае отложенной загрузки узел Add добавляется к графу несколько раз, и это может быть проблемой при чтении графа. Представьте, что если вы хотите построить граф с тысячами операций, это может сильно запутать ваш граф. Уловка состоит в том, чтобы отделить операции от данных.

Я обещал, что мои сообщения будут краткими и приятными. Так что я остановлюсь на этом.

Чтобы связаться, напишите мне в Твиттере @kaustubhn