Spec-Zone.ru › TensorFlow 1.15

tf.variable_scope

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

Просмотр псевдонимов

Псевдонимы совместимости для миграции

См. Руководство по миграции для получения дополнительных сведений.

tf.compat.v1.variable_scope

tf.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"

Базовый пример использования переменной 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 ...").

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

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, все её под-области также становятся областями с reuse.

Замечание по областям имён: Установка reuse не влияет на именование других операций, таких как mult. См. связанное обсуждение на 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, это имя будет уникализировано. Если name_or_scope предоставлено, оно не будет использовано, а значит оно не обязательно и может быть None.
values Список аргументов Tensor передаваемых функции op.
initializer Инициализатор по умолчанию для переменных в этой области.
regularizer Регуляризатор по умолчанию для переменных в этой области.
caching_device Устройство кэширования по умолчанию для переменных в этой области.
partitioner Разделитель по умолчанию для переменных в этой области.
custom_getter Пользовательский обработчик по умолчанию для переменных в этой области.
reuse True, None или tf.compat.v1.AUTO_REUSE; если True, мы переходим в режим reuse для этой области, а также для всех под-областей; если tf.compat.v1.AUTO_REUSE, мы создаём переменные, если они не существуют, и возвращаем их в противном случае; если None, мы наследуем флаг reuse родительской области. При включённом выполнении 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/r1.15/api_docs/python/tf/variable_scope

Spec-Zone.ru

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