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 в эквивалент в TensorFlow v2. Обратитесь к руководству по миграции TensorFlow v1 в TensorFlow v2 для получения инструкций по миграции остальной части вашего кода.

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

См. руководство по миграции моделей для получения дополнительной информации о миграции кода, который полагается на variable_scope-based механизм повторного использования переменных.

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

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

Описание

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

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

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

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

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

Область переменных работает как ожидается, когда выполнение Eager отключено.

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

Аналогично, мы генерируем исключение при попытке получить переменную, которая не существует в режиме 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; это имя будет сделано уникальным. Если предоставлено имя_или_область, оно не будет использовано, поэтому оно не обязательно и может быть 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, мы наследуем флаг reuse родительской области. При включённом eager execution новые переменные всегда создаются, если в данный момент не активен EagerVariableStore или шаблон.
dtype Тип переменных, созданных в этой области (по умолчанию — тип в переданной области или унаследованный от родительской области).
use_resource Если False, все переменные будут обычными переменными. Если True, вместо этого будут использоваться экспериментальные ResourceVariables с хорошо определённой семантикой. По умолчанию False (позже будет изменено на True). При включённом eager execution этот аргумент всегда принудительно устанавливается в True.
constraint Необязательная проекционная функция, применяемая к переменной после обновления её операцией Optimizer (например, используется для реализации ограничений по норме или по значениям для весов слоя). Функция должна принимать в качестве входных данных непроектированный тензор, представляющий значение переменной, и возвращать тензор для проектированного значения (которое должно иметь тот же размер). Ограничения не являются безопасными при асинхронном распределённом обучении.
auxiliary_name_scope Если True, мы создаём вспомогательную область имен со scope. Если 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