Spec-Zone.ru › TensorFlow

tf.compat.v1.variable_scope

Менеджер контекста для определения операций, создающих переменные (слои).

tf.compat.v1.variable_scope(
    name_or_scope,
    default_name=None,
    values=None,
    initializer=None,
    regularizer=None,
    caching_device=None,
    partitioner=None,
    custom_getter=None,
    reuse=None,
    dtype=None,
    use_resource=None,
    constraint=None,
    auxiliary_name_scope=True
)

Перейти на TF2

Внимание: Этот API разработан для TensorFlow v1. Продолжайте чтение, чтобы узнать, как перейти с этого API на эквивалентный API TensorFlow v2. Инструкции по переносу остального кода см. в руководстве по переходу с TensorFlow v1 на TensorFlow v2.

Несмотря на то, что это устаревший API compat.v1, tf.compat.v1.variable_scope в основном совместим с eager execution и tf.function, если использовать его вместе с декоратором tf.compat.v1.keras.utils.track_tf1_style_variables (однако при этом он будет вести себя так, как если бы reuse всегда имел значение AUTO_REUSE.)

Дополнительные сведения о переносе кода, в котором используется повторное использование переменных на основе variable_scope, см. в руководстве по переносу моделей.

Если использовать tf.compat.v1.variable_scope при включенном eager execution, но без tf.compat.v1.keras.utils.track_tf1_style_variables, он по-прежнему сможет добавлять префиксы к именам переменных, созданных в этой области, но не будет включать повторное использование переменных или проверки с выдачей ошибок, связанные с повторным использованием переменных (вызовы get_variable внутри нее всегда будут создавать новые переменные).

После отказа от механизмов повторного использования переменных на основе get_variable для перехода на API TF2 достаточно использовать tf.name_scope для добавления префиксов к именам переменных.

Описание

Используется в блокнотах

Используется в руководстве Используется в учебных материалах
  • Использование моделей TF1.x в рабочих процессах TF2
  • Перенос контрольных точек модели
  • Линейная регрессия со смешанными эффектами в {TF Probability, R, Stan}
  • Обучение нейронных сетей на основе графов в TFX

Этот менеджер контекста проверяет, что (необязательные) values относятся к одному графу, гарантирует, что этот граф является графом по умолчанию, и создает область имен и область переменных.

Если name_or_scope не равно None, оно используется без изменений. Если name_or_scope равно None, используется default_name. В этом случае, если это имя уже использовалось в той же области, оно становится уникальным благодаря добавлению к нему _N.

Область переменных позволяет создавать новые переменные и совместно использовать уже созданные, предотвращая случайное создание или совместное использование. Подробную информацию см. в руководстве по областям переменных; здесь мы приводим лишь несколько простых примеров.

Области переменных работают ожидаемым образом, когда eager execution отключен.

tf.compat.v1.disable_eager_execution()

Простой пример создания новой переменной:

with tf.compat.v1.variable_scope("foo"):
    with tf.compat.v1.variable_scope("bar"):
        v = tf.compat.v1.get_variable("v", [1])
        assert v.name == "foo/bar/v:0"

Простой пример безопасного повторного входа в заранее созданную область переменных:

with tf.compat.v1.variable_scope("foo") as vs:
  pass

# Re-enter the variable scope.
with tf.compat.v1.variable_scope(vs,
                       auxiliary_name_scope=False) as vs1:
  # Restore the original name_scope.
  with tf.name_scope(vs1.original_name_scope):
      v = tf.compat.v1.get_variable("v", [1])
      assert v.name == "foo/v:0"
      c = tf.constant([1], name="c")
      assert c.name == "foo/c:0"

Обратите внимание, что счетчики для default_name сбрасываются после выхода из родительской области. Поэтому при повторном входе в область (например, после ее сохранения) все вложенные счетчики default_name будут запущены заново.

Например:

with tf.compat.v1.variable_scope("foo") as vs:
  with tf.compat.v1.variable_scope(None, default_name="bar"):
    v = tf.compat.v1.get_variable("a", [1])
    assert v.name == "foo/bar/a:0", v.name
  with tf.compat.v1.variable_scope(None, default_name="bar"):
    v = tf.compat.v1.get_variable("b", [1])
    assert v.name == "foo/bar_1/b:0"

with tf.compat.v1.variable_scope(vs):
  with tf.compat.v1.variable_scope(None, default_name="bar"):
    v = tf.compat.v1.get_variable("c", [1])
    assert v.name == "foo/bar/c:0"   # Uses bar instead of bar_2!

Простой пример совместного использования переменной с AUTO_REUSE:

def foo():
  with tf.compat.v1.variable_scope("foo", reuse=tf.compat.v1.AUTO_REUSE):
    v = tf.compat.v1.get_variable("v", [1])
  return v

v1 = foo()  # Creates v.
v2 = foo()  # Gets the same, existing v.
assert v1 == v2

Простой пример совместного использования переменной с reuse=True:

with tf.compat.v1.variable_scope("foo"):
    v = tf.compat.v1.get_variable("v", [1])
with tf.compat.v1.variable_scope("foo", reuse=True):
    v1 = tf.compat.v1.get_variable("v", [1])
assert v1 == v

Совместное использование переменной путем сохранения области и установки reuse:

with tf.compat.v1.variable_scope("foo") as scope:
    v = tf.compat.v1.get_variable("v", [1])
    scope.reuse_variables()
    v1 = tf.compat.v1.get_variable("v", [1])
assert v1 == v

Чтобы предотвратить случайное совместное использование переменных, при получении существующей переменной в области без повторного использования возникает исключение.

with tf.compat.v1.variable_scope("foo"):
    v = tf.compat.v1.get_variable("v", [1])
    v1 = tf.compat.v1.get_variable("v", [1])
    #  Raises ValueError("... v already exists ...").

Аналогично, при попытке получить несуществующую переменную в режиме повторного использования возникает исключение.

with tf.compat.v1.variable_scope("foo", reuse=True):
    v = tf.compat.v1.get_variable("v", [1])
    #  Raises ValueError("... v does not exists ...").

Обратите внимание, что флаг reuse наследуется: если открыть область с повторным использованием, все ее вложенные области также будут использовать повторное использование.

Примечание об области имен: установка reuse не влияет на именование других операций, таких как mult. См. обсуждение по ссылке github#6189

Обратите внимание, что вплоть до версии 1.0 включительно в аргумент reuse можно было передавать False (хотя это явно не рекомендовалось), что приводило к недокументированному поведению, немного отличавшемуся от None. Начиная с версии 1.1.0 передача None и False в качестве reuse дает совершенно одинаковый результат.

Примечание об использовании областей переменных в многопоточной среде: области переменных привязаны к потоку, поэтому один поток не видит текущую область другого потока. Кроме того, при использовании default_name уникальные имена областей также генерируются отдельно для каждого потока. Если в другом потоке использовалось такое же имя, это не помешает новому потоку создать область с тем же именем. Однако хранилище переменных используется совместно потоками (в рамках одного графа). Поэтому попытка другого потока создать новую переменную с тем же именем, что и переменная, созданная предыдущим потоком, завершится ошибкой, если reuse не равно True.

Кроме того, каждый поток начинает работу с пустой областью переменных. Поэтому, если нужно сохранить префиксы имен области из главного потока, следует сохранить область главного потока и повторно входить в нее в каждом потоке. Например:

main_thread_scope = variable_scope.get_variable_scope()

# Thread's target function:
def thread_target_fn(captured_scope):
  with variable_scope.variable_scope(captured_scope):
    # .... regular code for this thread


thread = threading.Thread(target=thread_target_fn, args=(main_thread_scope,))
Аргументы
name_or_scope string или VariableScope: область, которую нужно открыть.
default_name Имя по умолчанию, используемое, если аргумент name_or_scope равен None; это имя будет сделано уникальным. Если указано name_or_scope, оно не будет использоваться, поэтому в нем нет необходимости и оно может быть равно None.
values Список аргументов Tensor, передаваемых функции операции.
initializer Инициализатор переменных по умолчанию в этой области.
regularizer Регуляризатор переменных по умолчанию в этой области.
caching_device Устройство кэширования переменных по умолчанию в этой области.
partitioner Разделитель переменных по умолчанию в этой области.
custom_getter Пользовательский геттер переменных по умолчанию в этой области.
reuse True, None или tf.compat.v1.AUTO_REUSE; если True, для этой области и всех вложенных областей включается режим повторного использования; если tf.compat.v1.AUTO_REUSE, переменные создаются, если они не существуют, и возвращаются в противном случае; если None, наследуется флаг повторного использования родительской области. Если eager execution включен, новые переменные всегда создаются, кроме случаев, когда активен EagerVariableStore или шаблон.
dtype Тип переменных, создаваемых в этой области (по умолчанию используется тип из переданной области или унаследованный от родительской области).
use_resource Если False, все переменные будут обычными Variables. Если True, вместо них будут использоваться экспериментальные ResourceVariables с четко определенной семантикой. По умолчанию False (позже значение изменится на True). Если eager execution включен, этому аргументу всегда принудительно присваивается True.
constraint Необязательная функция проекции, применяемая к переменной после ее обновления с помощью Optimizer (например, для реализации ограничений нормы или значений весов слоя). Функция должна принимать на вход непроецированный Tensor, представляющий значение переменной, и возвращать Tensor с проецированным значением (который должен иметь ту же форму). Ограничения небезопасно использовать при асинхронном распределенном обучении.
auxiliary_name_scope Если True, вместе с областью создается вспомогательная область имен. Если False, она не создается. Обратите внимание, что этот аргумент не наследуется и действует только один раз при создании. Его следует использовать только для повторного входа в заранее созданную область переменных.
Вызывает исключения
ValueError при попытке повторного использования в области создания или создания в области повторного использования.
TypeError если типы некоторых аргументов не соответствуют требованиям.

Методы

__enter__

Посмотреть исходный код

__enter__()

__exit__

Посмотреть исходный код

__exit__(
    type_arg, value_arg, traceback_arg
)

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/compat/v1/variable_scope

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API