Какая разница между tf.placeholder и tf.Variable?
Я новичок в TensorFlow. Я запутался в разнице между tf.placeholder
и tf.Variable
. На мой взгляд, tf.placeholder
используется для входных данных, а tf.Variable
используется для хранения состояния данных. Это все, что я знаю.
Может ли кто-нибудь объяснить мне более подробно об их различиях? В частности, когда использовать tf.Variable
и когда использовать tf.placeholder
?
Ответы
Ответ 1
Короче говоря, вы используете tf.Variable
для обучаемых переменных, таких как весы (W) и предубеждения (B) для вашей модели.
weights = tf.Variable(
tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))), name='weights')
biases = tf.Variable(tf.zeros([hidden1_units]), name='biases')
tf.placeholder
используется для подачи фактических примеров обучения.
images_placeholder = tf.placeholder(tf.float32, shape=(batch_size, IMAGE_PIXELS))
labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))
Вот как вы кормите примеры обучения во время обучения:
for step in xrange(FLAGS.max_steps):
feed_dict = {
images_placeholder: images_feed,
labels_placeholder: labels_feed,
}
_, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)
Ваш tf.variables
будет обучен (изменен) в результате этого обучения.
Подробнее см. https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html. (Примеры взяты с веб-страницы.)
Ответ 2
Разница в том, что при tf.Variable
вы должны указать начальное значение, когда объявляете его. С tf.placeholder
вам не нужно указывать начальное значение, и вы можете указать его во время выполнения с аргументом feed_dict
внутри Session.run
Ответ 3
Так как вычисления Tensor состоят из графов, то лучше интерпретировать их в терминах графов.
Возьмем, к примеру, простую линейную регрессию WX + B = Y (где W и B обозначают веса и смещения, а X - входы наблюдений, а Y - выходы наблюдений). Очевидно, X и Y имеют одинаковую природу (явные переменные), которые отличаются от W и B (скрытые переменные). X и Y являются значениями выборок (наблюдений) и, следовательно, нуждаются в месте для заполнения, в то время как W и B являются весами и смещением, переменные (предыдущее значение влияет на последующие) на графике, который должен обучаться, используя разные пары X и Y. Мы помещаем различные образцы в заполнители для обучения переменных.
Нам можно и нужно только сохранить или восстановить переменные (в контрольных точках), чтобы сохранить или перестроить график с помощью кода. Заполнители в основном являются держателями для различных наборов данных (например, данных обучения или тестовых данных), но переменные обучаются в процессе обучения и остаются неизменными (для прогнозирования результатов ввода или сопоставления входов и выходов [меток] выборок) позже, пока вы не переподготовите или не отрегулируете модель (используя разные или одни и те же образцы для частичного заполнения заполнителей через диктовку, например session.run(a_graph, dict={a_placeholder_name: sample_values})
, заполнители также передаются в качестве параметров для установки моделей).
Если вы меняете заполнители (добавляете, удаляете или меняете форму и т.д.) Модели в середине обучения, вы все равно можете перезагрузить контрольную точку без каких-либо других модификаций. Но если переменные сохраненной модели изменены, вам следует соответствующим образом настроить контрольную точку, чтобы перезагрузить ее и продолжить обучение (все переменные, определенные на графике, должны быть доступны в контрольной точке).
Подводя итог, если значения взяты из выборок (наблюдения, которые у вас уже есть), вы можете безопасно заполнить их, а если вам нужен параметр для обучения, используйте переменную (проще говоря, установите переменные для значений, которые вы хотите использовать TF автоматически).
В некоторых интересных моделях, таких как модель передачи стиля, входные пиксели будут оптимизированы, и обычно называемые переменные модели фиксированы, тогда мы должны сделать ввод (обычно инициализированный случайным образом) как переменную как реализовано в этой ссылке.
Для получения дополнительной информации, пожалуйста, ознакомьтесь с этим простым и иллюстрирующим документом.
Ответ 4
TL; DR
Переменные
- Для получения параметров для изучения
- Значения могут быть получены из обучения
- Требуются начальные значения (часто случайные)
заполнителей
- Выделенное хранилище данных (например, для данных пикселя изображения во время подачи)
- Исходные значения не требуются (но могут быть установлены, см.
tf.placeholder_with_default
)
Ответ 5
Наиболее очевидная разница между tf.Variable и tf.placeholder заключается в том, что
Вы используете переменные для хранения и обновления параметров. Переменные - это буферы в памяти, содержащие тензоры. Они должны быть явно инициализированы и могут быть сохранены на диск во время и после тренировки. Позже вы можете восстановить сохраненные значения для тренировки или анализа модели.
Инициализация переменных выполняется с помощью sess.run(tf.global_variables_initializer())
. Также при создании переменной вам нужно передать Tensor в качестве ее начального значения в конструктор Variable()
и когда вы создаете переменную, вы всегда знаете ее форму.
С другой стороны, вы не можете обновить заполнитель. Их также не следует инициализировать, но, поскольку они обещают иметь тензор, вам необходимо sess.run(<op>, {a: <some_val>})
значение в них sess.run(<op>, {a: <some_val>})
. И, наконец, по сравнению с переменной, заполнитель может не знать форму. Вы можете предоставить части размеров или вообще ничего не указывать.
Есть и другие отличия:
- значения внутри переменной могут быть обновлены во время оптимизации
- переменные могут быть общими, и могут быть необучаемыми
- значения внутри переменной могут быть сохранены после тренировки
- при создании переменной на график добавляются 3 операции (переменная операция, операция инициализации, операция для начального значения)
- заполнитель - это функция, переменная - это класс (отсюда и верхний регистр)
- когда вы используете TF в распределенной среде, переменные хранятся в специальном месте (сервер параметров) и совместно используются рабочими.
Интересно, что кормить можно не только заполнителей. Вы можете передать значение переменной и даже константе.
Ответ 6
Помимо других ответов, они также очень хорошо объясняют это в этом учебнике MNIST на веб-сайте Tensoflow:
Мы описываем эти взаимодействующие операции, манипулируя символическими переменные. Давайте создадим один:
x = tf.placeholder(tf.float32, [None, 784])
,
x
не является конкретным значением. Это заполнитель, значение, которое мы введем, когда попросим TensorFlow запустить вычисление. Мы хотим иметь возможность вводить любое количество MNIST изображения, каждое из которых сплющено в 784-мерный вектор. Были представлены это как двумерный тензор чисел с плавающей точкой, с формой [Нет, 784]. (Здесь "Нет" означает, что измерение может иметь любую длину.)
Нам также нужны веса и уклоны для нашей модели. Мы могли бы представить рассматривая их как дополнительные входы, но TensorFlow имеет четный лучший способ справиться с этим: Variable
. Variable
- модифицируемый тензор который живет в графе взаимодействующих операций TensorFlow. Может быть используется и даже модифицируется вычислением. Для машинного обучения В приложениях параметры модели обычно равны Variable
с.
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
Мы создаем эти Variable
, давая tf.Variable
начальное значение Variable
: в этом случае мы инициализируем как W
, так и b
как заполненные тензоры нулей. Поскольку мы собираемся изучать W
и b
, это не имеет большого значения много, что они изначально.
Ответ 7
Variables(tf.varibales(SomeValue)):
Переменные - это узлы с состоянием, которые выводят свое текущее значение (какое бы значение мы ему ни присвоили) Мы должны присвоить значения переменной в TensorFlow.
Placeholders(tf.placeholders(dtype, shape)):
Заполнитель - это узлы, значения которых вводятся во время выполнения. Например, входы, метки и т.д.
Ответ 8
Пример фрагмента:
import numpy as np
import tensorflow as tf
### Model parameters ###
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
### Model input and output ###
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)
### loss ###
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares
### optimizer ###
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
### training data ###
x_train = [1,2,3,4]
y_train = [0,-1,-2,-3]
### training loop ###
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(1000):
sess.run(train, {x:x_train, y:y_train})
Как следует из названия, заполнитель является обещанием предоставить значение позже, т.е.
Переменные - это просто параметры обучения (W
(матрица), b
(смещение), такие же, как обычные переменные, которые вы используете в повседневном программировании, которые тренер обновляет/модифицирует при каждом запуске/шаге.
Хотя местозаполнитель не требует какого-либо начального значения, при создании x
и y
TF не выделяется память, но позже, когда вы sess.run()
заполнители в sess.run()
с помощью feed_dict
, feed_dict
выделит память соответствующего размера для они (x
и y
) - эта неограниченная возможность позволяет нам передавать данные любого размера и формы.
В двух словах:
Переменная - это параметр, который вы хотите, чтобы тренер (то есть GradientDescentOptimizer) обновлял после каждого шага.
Демо- заполнитель -
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b # + provides a shortcut for tf.add(a, b)
Исполнение:
print(sess.run(adder_node, {a: 3, b:4.5}))
print(sess.run(adder_node, {a: [1,3], b: [2, 4]}))
в результате на выходе
7.5
[ 3. 7.]
В первом случае 3 и 4.5 будут переданы a
и b
соответственно, а затем в adder_node outputting 7. Во втором случае будет добавлен список каналов, первые шаги 1 и 2, следующие 3 и 4 (a
и b
).
Актуальные читает:
Ответ 9
Переменные
Переменная TensorFlow - лучший способ представления общего постоянного состояния, которым манипулирует ваша программа. Переменные обрабатываются с помощью класса tf.Variable. Внутренне переменная tf.Variable хранит постоянный тензор. Конкретные операции позволяют читать и изменять значения этого тензора. Эти изменения видны в нескольких сеансах tf.Session, поэтому несколько рабочих могут видеть одинаковые значения для переменной tf.Variable. Переменные должны быть инициализированы перед использованием.
Пример:
x = tf.Variable(3, name="x")
y = tf.Variable(4, name="y")
f = x*x*y + y + 2
Это создает график вычислений. Переменные (x и y) могут быть инициализированы, а функция (f) оценена в сеансе тензорного потока следующим образом:
with tf.Session() as sess:
x.initializer.run()
y.initializer.run()
result = f.eval()
print(result)
42
заполнителей
Заполнитель - это узел (такой же, как переменная), значение которого может быть инициализировано в будущем. Эти узлы в основном выводят значение, назначенное им во время выполнения. Узел-заполнитель можно назначить с помощью класса tf.placeholder(), которому вы можете предоставить аргументы, такие как тип переменной и/или ее форма. Заполнители широко используются для представления набора данных обучения в модели машинного обучения, так как набор данных обучения постоянно меняется.
Пример:
A = tf.placeholder(tf.float32, shape=(None, 3))
B = A + 5
Примечание. "Нет" для измерения означает "любой размер".
with tf.Session as sess:
B_val_1 = B.eval(feed_dict={A: [[1, 2, 3]]})
B_val_2 = B.eval(feed_dict={A: [[4, 5, 6], [7, 8, 9]]})
print(B_val_1)
[[6. 7. 8.]]
print(B_val_2)
[[9. 10. 11.]
[12. 13. 14.]]
Ссылки:
- https://www.tensorflow.org/guide/variables
- https://www.tensorflow.org/api_docs/python/tf/placeholder
- O'Reilly: практическое машинное обучение с Scikit-Learn & Tensorflow
Ответ 10
Tensorflow использует три типа контейнеров для хранения/выполнения процесса
-
Константы: Константы содержат типичные данные.
-
переменные: значения данных будут изменены с соответствующими функциями, такими как cost_function.
-
заполнители: данные обучения/тестирования будут переданы на график.
Ответ 11
Думайте о Variable
в тензорном потоке как о обычных переменных, которые мы используем в языках программирования. Мы инициализируем переменные, мы можем изменить это позже. В то время как placeholder
не требует начальной стоимости. Заполнитель просто выделяет блок памяти для будущего использования. Позже мы можем использовать feed_dict
для подачи данных в placeholder
. По умолчанию placeholder
имеет неограниченную форму, что позволяет подавать тензоры разных форм в течение сеанса. Вы можете сделать ограниченную форму, передав необязательный аргумент -shape, как я сделал ниже.
x = tf.placeholder(tf.float32,(3,4))
y = x + 2
sess = tf.Session()
print(sess.run(y)) # will cause an error
s = np.random.rand(3,4)
print(sess.run(y, feed_dict={x:s}))
При выполнении задачи машинного обучения большую часть времени мы не знаем о количестве строк, но (допустим, мы знаем количество функций или столбцов). В этом случае мы можем использовать None.
x = tf.placeholder(tf.float32, shape=(None,4))
Теперь во время выполнения мы можем кормить любую матрицу четырьмя столбцами и любым количеством строк.
Кроме того, заполнители используются для входных данных (они являются своего рода переменными, которые мы используем для подачи в нашу модель), где в качестве переменных используются такие параметры, как веса, которые мы тренируем с течением времени.
Ответ 12
Заполнитель:
-
Заполнитель - это просто переменная, которую мы назначим позже. Это позволяет нам создавать наши операции и строить наш график вычислений, не требуя данных. В терминологии TensorFlow мы затем передаем данные в график через эти заполнители.
-
Начальные значения не требуются, но могут иметь значения по умолчанию с tf.placeholder_with_default)
-
Мы должны предоставить значение во время выполнения, например:
a = tf.placeholder(tf.int16) // initialize placeholder value
b = tf.placeholder(tf.int16) // initialize placeholder value
use it using session like :
sess.run(add, feed_dict={a: 2, b: 3}) // this value we have to assign at runtime
Переменная:
- Переменная TensorFlow - лучший способ представления общих,
постоянное состояние, управляемое вашей программой.
- Переменные обрабатываются через класс tf.Variable. A tf.Variable
представляет собой тензор, значение которого можно изменить, выполнив на нем ops.
Пример: tf.Variable("Welcome to tensorflow!!!")
Ответ 13
Подумайте о графике вычислений. В таком графе нам нужен входной узел для передачи наших данных в граф, эти узлы должны быть определены как Placeholder в тензорном потоке.
Не думайте, что это обычная программа на Python. Вы можете написать программу на Python и делать все те вещи, которые ребята объяснили в других ответах только с помощью переменных, но для графов вычислений в тензорном потоке, чтобы подать ваши данные в граф, вам нужно определить эти узлы как заполнители.