Заполнители в Tensorflow
Чтобы быстро резюмировать, как выполняется программа тензорного потока.
- Создание графа (А.К.А. Сборка графа)
- Используйте сеанс для выполнения графика
Допустим, вам нужно построить график для потрясающей концепции, о которой вы придумали, но, к сожалению, вы не знаете, какими значениями должны быть на данный момент, иначе было бы слишком много думать о значениях в этот момент. Что бы вы сделали ? 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