Я новичок в TensorFlow. Я запутался в разнице между tf.placeholder
и tf.Variable
. На мой взгляд, tf.placeholder
используется для ввода данных и tf.Variable
используется для хранения состояния данных. Это все, что я знаю.
Может ли кто-нибудь объяснить мне более подробно об их различиях? В частности, когда использовать tf.Variable
и когда использовать tf.placeholder
?
tensorflow
j.doe
источник
источник
Variable
s, но не кplaceholder
s (значения которых всегда должны быть указаны).Ответы:
Короче говоря, вы используете
tf.Variable
для обучаемых переменных, таких как веса (W) и смещения (B) для вашей модели.tf.placeholder
используется для подачи реальных примеров обучения.Вот как вы подаете обучающие примеры во время обучения:
Вы
tf.variables
будете обучены (изменены) в результате этого обучения.Подробнее смотрите на https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html . (Примеры взяты с веб-страницы.)
источник
tensorflow
иdeep learning
иAI
есть.Разница в том, что
tf.Variable
вы должны предоставить начальное значение при его объявлении. При этомtf.placeholder
вам не нужно предоставлять начальное значение, и вы можете указать его во время выполнения сfeed_dict
аргументом внутриSession.run
источник
Так как вычисления Tensor составляют графы , лучше интерпретировать их в терминах графов.
Возьмем для примера простую линейную регрессию
где
W
иB
обозначают веса и смещения, а такжеX
для входов наблюдений иY
наблюдений и выходные данные наблюдений.Очевидно,
X
иY
имеют одинаковую природу (явные переменные), которые отличаются от того, чтоW
иB
(латентные переменные).X
иY
являются значениями выборок (наблюдений) и, следовательно, нуждаются в месте для заполнения , в то время какW
иB
являются весами и смещением, переменными (предыдущие значения влияют на последние) в графе, которые следует обучать, используя разныеX
иY
пары. Мы размещаем различные образцы для заполнителей для обучения переменных .Нам нужно только , чтобы сохранить или восстановить те переменные (на контрольно - пропускных пунктах) , чтобы сохранить или восстановить граф с кодом.
Заполнители в основном являются держателями для различных наборов данных (например, данных обучения или данных испытаний). Тем не менее, переменные обучаются в процессе обучения для конкретных задач, то есть, чтобы предсказать результат ввода или сопоставить входы с желаемыми метками. Они остаются такими же , пока вы не переучивать или тонкую настройку модели с использованием различных или же образцов для заполнения в Указатель место заполнения часто через Dict. Например:
Заполнители также передаются в качестве параметров для установки моделей.
Если вы измените заполнители (добавьте, удалите, измените форму и т. Д.) Модели в середине обучения, вы все равно сможете перезагрузить контрольную точку без каких-либо других модификаций. Но если переменные сохраненной модели изменены, вам следует соответствующим образом настроить контрольную точку, чтобы перезагрузить ее и продолжить обучение (все переменные, определенные на графике, должны быть доступны в контрольной точке).
Подводя итог, если значения взяты из выборок (наблюдения, которые у вас уже есть), вы можете безопасно заполнить их, а если вам нужен параметр для обучения, используйте переменную (проще говоря, установите переменные для значений, которые вы хотите использовать TF автоматически).
В некоторых интересных моделях, таких как модель передачи стиля , входные пиксели будут оптимизированы, и обычно называемые переменные модели фиксированы, тогда мы должны сделать ввод (обычно инициализированный случайным образом) как переменную, как реализовано в этой ссылке.
Для получения дополнительной информации, пожалуйста, сделайте вывод на этот простой и иллюстрирующий документ .
источник
TL; DR
переменные
Заполнители
tf.placeholder_with_default
)источник
Самая очевидная разница между tf.Variable и tf.placeholder заключается в том, что
Инициализация переменных выполняется с помощью
sess.run(tf.global_variables_initializer())
. Также при создании переменной вам нужно передать Tensor в качестве начального значенияVariable()
конструктору, и когда вы создаете переменную, вы всегда знаете ее форму.С другой стороны, вы не можете обновить заполнитель. Они также не должны быть инициализированы, но, поскольку они обещают иметь тензор, вам необходимо ввести значение в них
sess.run(<op>, {a: <some_val>})
. И, наконец, по сравнению с переменной, заполнитель может не знать форму. Вы можете предоставить части размеров или вообще ничего не указывать.Есть и другие отличия:
Интересно, что кормить можно не только заполнителей. Вы можете передать значение переменной и даже константе.
источник
В дополнение к ответам других, они также очень хорошо объясняют это в этом уроке MNIST на веб-сайте Tensoflow:
источник
x
с формой[batch size, features]
, у нас есть веса, идущие от входа к первому слою размера[features, hidden units]
и смещения[hidden units]
. Итак, мой вопрос: как мы умножаем их вместе? Если мы это сделаем,tf.matmul(x, w)
то получим,[batch size, hidden units]
и не сможемb
, потому что он имеет форму[hidden units]
Tensorflow использует три типа контейнеров для хранения / выполнения процесса
Константы: Константы содержат типичные данные.
переменные: значения данных будут изменены с соответствующими функциями, такими как cost_function.
заполнители: данные обучения / тестирования будут переданы на график.
источник
Пример фрагмента:
Как следует из названия, заполнитель - это обещание предоставить значение позже, т.е.
Переменные - это просто параметры обучения (
W
(матрица),b
(смещение), такие же, как обычные переменные, которые вы используете в повседневном программировании, которые тренер обновляет / модифицирует при каждом запуске / шаге.В то время как заполнитель не требует никакого начального значения, то, что когда вы создали
x
иy
TF не выделил какую-либо память, вместо этого позже, когда вы подпишете заполнители вsess.run()
использованииfeed_dict
, TensorFlow выделит для них память соответствующего размера (x
иy
) - это без ограничений - Ness позволяет нам передавать данные любого размера и формы.В двух словах :
Переменная - это параметр, который вы хотите, чтобы тренер (например, GradientDescentOptimizer) обновлял после каждого шага.
Демо- заполнитель -
Исполнение:
в результате на выходе
В первом случае 3 и 4.5 будут переданы в
a
иb
соответственно, а затем в adder_node outputting 7. Во втором случае есть список каналов, будут добавлены первые шаги 1 и 2, следующие 3 и 4 (a
иb
).Актуальные читает:
источник
переменные
Переменная TensorFlow - лучший способ представить общее постоянное состояние, управляемое вашей программой. Переменные обрабатываются с помощью класса tf.Variable. Внутренне переменная tf.Variable хранит постоянный тензор. Конкретные операции позволяют читать и изменять значения этого тензора. Эти изменения видны в нескольких сеансах tf.Session, поэтому несколько рабочих могут видеть одинаковые значения для переменной tf.Variable. Переменные должны быть инициализированы перед использованием.
Пример:
Это создает граф вычислений. Переменные (x и y) могут быть инициализированы, а функция (f) оценена в сеансе тензорного потока следующим образом:
Заполнители
Заполнитель - это узел (такой же, как переменная), значение которого может быть инициализировано в будущем. Эти узлы в основном выводят значение, назначенное им во время выполнения. Узел-заполнитель можно назначить с помощью класса tf.placeholder (), которому вы можете предоставить аргументы, такие как тип переменной и / или ее форма. Заполнители широко используются для представления набора данных обучения в модели машинного обучения, так как набор данных обучения постоянно меняется.
Пример:
Примечание: «Нет» для измерения означает «любой размер».
Ссылки:
источник
Думайте о
Variable
тензорном потоке как о обычных переменных, которые мы используем в языках программирования. Мы инициализируем переменные, мы можем изменить это позже. Принимая во внимание,placeholder
что не требует начальной стоимости. Заполнитель просто выделяет блок памяти для будущего использования. Позже мы можем использоватьfeed_dict
для подачи данных вplaceholder
. По умолчаниюplaceholder
имеет неограниченную форму, что позволяет подавать тензоры разных форм в сеансе. Вы можете создать ограниченную форму, передав необязательный аргумент -shape, как я сделал ниже.При выполнении задачи машинного обучения большую часть времени мы не знаем о количестве строк, но (предположим) мы знаем количество элементов или столбцов. В этом случае мы можем использовать None.
Теперь во время выполнения мы можем кормить любую матрицу 4 столбцами и любым количеством строк.
Кроме того, заполнители используются для входных данных (они являются своего рода переменными, которые мы используем для подачи нашей модели), где в качестве переменных используются такие параметры, как веса, которые мы тренируем с течением времени.
источник
Заполнитель:
Заполнитель - это просто переменная, которой мы назначим данные позже. Это позволяет нам создавать наши операции и строить наш график вычислений, не требуя данных. В терминологии TensorFlow мы затем подаем данные в граф через эти заполнители.
Начальные значения не обязательны, но могут иметь значения по умолчанию с
tf.placeholder_with_default)
Мы должны предоставить значение во время выполнения, как:
Переменная:
Пример :
tf.Variable("Welcome to tensorflow!!!")
источник
Ответ, совместимый с Tensorflow 2.0 : Концепция заполнителей
tf.placeholder
не будет доступнаTensorflow 2.x (>= 2.0)
по умолчанию, поскольку режимом исполнения по умолчанию является «Стремительное выполнение».Тем не менее, мы можем использовать их, если они используются в
Graph Mode
(Disable Eager Execution
).Эквивалентная команда для TF Placeholder в версии 2.x есть
tf.compat.v1.placeholder
.Эквивалентная команда для переменной TF в версии 2.x есть,
tf.Variable
и если вы хотите перенести код с 1.x на 2.x, эквивалентная командаtf.compat.v2.Variable
,Пожалуйста, обратитесь к этой странице Tensorflow для получения дополнительной информации о Tensorflow версии 2.0.
Пожалуйста, обратитесь к Руководству по миграции для получения дополнительной информации о миграции с версий 1.x до 2.x.
источник
Подумайте о графике вычислений . В таком графе нам нужен входной узел для передачи наших данных в граф, эти узлы должны быть определены как Placeholder в тензорном потоке .
Не думайте, что это обычная программа на Python. Вы можете написать программу на Python и делать все те вещи, которые ребята объяснили в других ответах только с помощью переменных, но для вычислительных графов в тензорном потоке, чтобы подать ваши данные в граф, вам нужно определить эти узлы как заполнители.
источник