Spec-Zone.ru › TensorFlow 2.4

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
)

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

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

Область переменных позволяет создавать новые переменные и использовать уже созданные, обеспечивая проверки, чтобы случайно не создать или не использовать переменную. Для подробностей см. Руководство по областям переменных, здесь мы представим только несколько базовых примеров.

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

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 не влияет на именование других операций, таких как умножение. См. связанное обсуждение в github#6189

Обратите внимание, что до версии 1.0 включительно было разрешено (хотя и явно не поощрялось) передавать False в аргумент reuse, что приводило к недокументированному поведению, слегка отличающемуся от 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, это имя будет сделано уникальным. Если имя_или_область предоставлено, оно не будет использоваться, и поэтому оно не требуется и может быть None.
values Список аргументов Tensor, которые передаются функции операции.
initializer Стандартный инициализатор для переменных в этой области.
regularizer Стандартный регуляризатор для переменных в этой области.
caching_device Стандартный кеширующий девайс для переменных в этой области.
partitioner Стандартный партишннер для переменных в этой области.
custom_getter Стандартный пользовательский getter для переменных в этой области.
reuse True, None или tf.compat.v1.AUTO_REUSE; если True, мы переходим в режим повторного использования для этой области и всех под-областей; если tf.compat.v1.AUTO_REUSE, мы создаём переменные, если они не существуют, и возвращаем их в противном случае; если None, мы наследуем флаг повторного использования родительской области. Когда активировано исполнение Eager, новые переменные всегда создаются, если не активен EagerVariableStore или шаблон.
dtype Тип переменных, созданных в этой области (по умолчанию тип в переданной области, или унаследован от родительской области).
use_resource Если False, все переменные будут обычными переменными. Если True, экспериментальные ResourceVariables с хорошо определёнными семантикой будут использоваться вместо этого. По умолчанию False (позже изменится на True). Когда включено eager-исполнение, этот аргумент всегда принудительно устанавливается в True.
constraint Необязательная проекционная функция, применяемая к переменной после её обновления операцией Optimizer (например, используется для реализации ограничений нормы или ограничений значений для весов слоя). Функция должна принимать в качестве входного значения не-проектированный тензор, представляющий значение переменной, и возвращать тензор для проецируемого значения (которое должно иметь такую же форму). Ограничения небезопасны при использовании в асинхронном распределённом обучении.
auxiliary_name_scope Если True, мы создаём вспомогательную область имён с областью. Если False, мы её не создаём. Обратите внимание, что аргумент не наследуется и действует только один раз при создании. Вы должны использовать его только для повторного входа в предварительно созданную область переменных.
Исключения
ValueError при попытке повторного использования в области создания или создания в области повторного использования.
TypeError если типы некоторых аргументов неподходящие.

Методы

__enter__

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

__enter__()

__exit__

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

__exit__(
    type_arg, value_arg, traceback_arg
)

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

Spec-Zone.ru

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