В чем различия между этими функциями?
tf.variable_op_scope(values, name, default_name, initializer=None)
Возвращает менеджер контекста для определения операции, которая создает переменные. Этот диспетчер контекста проверяет, что заданные значения принадлежат одному и тому же графу, гарантирует, что этот граф является графом по умолчанию, и выдвигает область имен и область переменных.
tf.op_scope(values, name, default_name=None)
Возвращает менеджер контекста для использования при определении Python op. Этот диспетчер контекста проверяет, что заданные значения принадлежат одному и тому же графу, гарантирует, что этот граф является графом по умолчанию, и расширяет область имен.
tf.name_scope(name)
Оболочка для
Graph.name_scope()
использования графика по умолчанию. СмотритеGraph.name_scope()
для более подробной информации.
tf.variable_scope(name_or_scope, reuse=None, initializer=None)
Возвращает контекст для области видимости переменной. Область действия переменных позволяет создавать новые переменные и обмениваться уже созданными, предоставляя проверки, чтобы не создавать или делиться случайно. Для получения дополнительной информации см. Область действия переменной. Здесь мы представляем только несколько основных примеров.
источник
Ответы:
Давайте начнем с краткого введения в разделение переменных. Это механизм
TensorFlow
, позволяющий обмениваться переменными, доступ к которым осуществляется в разных частях кода, без передачи ссылок на переменную.Метод
tf.get_variable
можно использовать с именем переменной в качестве аргумента, чтобы либо создать новую переменную с таким именем, либо получить ту, которая была создана ранее. Это отличается от использованияtf.Variable
конструктора, который будет создавать новую переменную каждый раз, когда она вызывается (и потенциально добавлять суффикс к имени переменной, если переменная с таким именем уже существует).Именно с целью механизма совместного использования переменных был введен отдельный тип области действия (область действия переменной).
В результате мы получаем два разных типа областей действия:
tf.name_scope
tf.variable_scope
Обе области имеют одинаковое влияние на все операции, а также на переменные, созданные с использованием
tf.Variable
, т. Е. Область будет добавлена в качестве префикса к операции или имени переменной.Однако область имен игнорируется
tf.get_variable
. Мы можем видеть это в следующем примере:Единственный способ поместить переменную, к которой осуществляется доступ,
tf.get_variable
в область действия - это использовать область действия переменной, как в следующем примере:Это позволяет нам легко обмениваться переменными в разных частях программы, даже в разных областях имен:
ОБНОВИТЬ
Начиная с версии r0.11,
op_scope
иvariable_op_scope
оба устарели и заменены наname_scope
иvariable_scope
.источник
scope
методом, который эффективно работаетvariable_scope
?»variable_scope
иname_scope
даже необходимо. Если кто-то создает переменную (каким-либо образом с помощьюtf.Variable
илиtf.get_variable
), мне кажется более естественным, что мы всегда сможем получить ее, если укажем область действия или ее полное имя. Я не понимаю, почему один игнорирует предметное имя, а другой нет. Ты понимаешь рациональное для этого странного поведения?И variable_op_scope, и op_scope теперь устарели и не должны использоваться вообще.
Что касается двух других, у меня также были проблемы с пониманием разницы между variable_scope и name_scope (они выглядели почти одинаково), прежде чем я попытался визуализировать все, создав простой пример:
Здесь я создаю функцию, которая создает некоторые переменные и константы и группирует их по областям (в зависимости от предоставленного мной типа). В этой функции я также печатаю имена всех переменных. После этого я выполняю график, чтобы получить значения результирующих значений и сохранить файлы событий, чтобы исследовать их в TensorBoard. Если вы запустите это, вы получите следующее:
Вы увидите похожий шаблон, если откроете TensorBoard (как вы видите
b
за пределамиscope_name
прямоугольника):Это дает вам ответ :
Теперь вы видите, что
tf.variable_scope()
добавляет префикс к именам всех переменных (независимо от того, как вы их создаете), ops, констант. С другой стороны,tf.name_scope()
игнорирует переменные, созданные с помощью,tf.get_variable()
потому что это предполагает, что вы знаете, какую переменную и в какой области вы хотели бы использовать.Хорошая документация по разделению переменных говорит вам, что
В той же документации содержится более подробная информация о том, как работает Variable Scope и когда это полезно.
источник
Пространства имен - это способ организации имен для переменных и операторов в иерархическом порядке (например, "scopeA / scopeB / scopeC / op1")
tf.name_scope
создает пространство имен для операторов в графе по умолчанию.tf.variable_scope
создает пространство имен для переменных и операторов в графе по умолчанию.tf.op_scope
так же, какtf.name_scope
, но для графа, в котором были созданы указанные переменные.tf.variable_op_scope
так же, какtf.variable_scope
, но для графа, в котором были созданы указанные переменные.Ссылки на приведенные выше источники помогают устранить эту проблему с документацией.
Этот пример показывает, что все типы областей определяют пространства имен для переменных и операторов со следующими различиями:
tf.variable_op_scope
илиtf.variable_scope
совместимые сtf.get_variable
(игнорирует две другие области)tf.op_scope
иtf.variable_op_scope
просто выберите график из списка указанных переменных, для которого нужно создать область видимости. Кроме их поведения, равногоtf.name_scope
иtf.variable_scope
соответственноtf.variable_scope
иvariable_op_scope
добавьте указанный или инициализатор по умолчанию.источник
Давайте сделаем это просто: просто используйте
tf.variable_scope
. Цитируя разработчика TF :Помимо того факта, что
variable_scope
функциональность в основном расширяет функциональностьname_scope
, рассмотрим, как они не играют так хорошо вместе:Придерживаясь
variable_scope
только вы избегаете некоторых головных болей из-за такого рода несовместимости.источник
Что касается API r0.11,
op_scope
иvariable_op_scope
оба устарели .name_scope
иvariable_scope
может быть вложенным:источник
Вы можете рассматривать их как две группы:
variable_op_scope
иop_scope
принимать набор переменных в качестве входных данных и предназначены для создания операций. Разница в том, как они влияют на создание переменных с помощьюtf.get_variable
:обратите внимание на имя переменной
v
в двух примерах.то же самое для
tf.name_scope
иtf.variable_scope
:Вы можете прочитать больше о области видимости переменных в руководстве . Подобный вопрос был задан ранее на переполнение стека.
источник
Из последнего раздела этой страницы документации тензорного потока: Имена ops в
tf.variable_scope()
источник
Tensorflow 2.0 Compatible Ответ : объяснения
Andrzej Pronobis
иSalvador Dali
очень подробные сведения о функциях, связанных сScope
.Из рассмотренных выше функций Scope, которые активны на данный момент (17 февраля 2020 г.), являются
variable_scope
иname_scope
.Указание совместимых вызовов 2.0 для этих функций, о которых мы говорили выше, на благо сообщества.
Функция в 1.x :
tf.variable_scope
tf.name_scope
Соответствующая функция в 2.x :
tf.compat.v1.variable_scope
tf.name_scope
(tf.compat.v2.name_scope
если перенесено из1.x to 2.x
)Для получения дополнительной информации о миграции с 1.x на 2.x, пожалуйста, обратитесь к этому Руководству по миграции .
источник