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
Хотя это устаревший compat.v1 API, tf.compat.v1.variable_scope в основном совместим с немедленным выполнением и tf.function, если вы используете его вместе с декоратором tf.compat.v1.keras.utils.track_tf1_style_variables (хотя он будет вести себя так, как будто reuse всегда установлен на AUTO_REUSE).
См. руководство по миграции моделей для получения дополнительной информации о миграции кода, который полагается на variable_scope-основанное повторное использование переменных.
Когда вы используете его с включенным немедленным выполнением, но без tf.compat.v1.keras.utils.track_tf1_style_variables, tf.compat.v1.variable_scope по-прежнему сможет добавлять префиксы к именам переменных, созданных в пределах области, но не будет включать повторное использование переменных или проверки ошибок вокруг повторного использования переменных (вызовы get_variable внутри него всегда будут создавать новые переменные).
После перехода от get_variable-основанных механизмов повторного использования переменных, чтобы перейти к API TF2, вы можете просто использовать tf.name_scope для добавления префиксов к именам переменных.
Описание
Этот менеджер контекста проверяет, что (необязательные) values взяты из одной и той же графы, гарантирует, что графа является стандартной графой, и устанавливает область имён и область переменных.
Если name_or_scope не равно None, оно используется как есть. Если name_or_scope равно None, то используется default_name. В этом случае, если имя уже использовалось в той же области, оно будет сделано уникальным путём добавления _N к нему.
Область переменных позволяет создавать новые переменные и совместно использовать уже созданные, предоставляя проверки, чтобы случайно не создавать или не совместно использовать их. Для получения подробной информации см. Руководство по областям переменных, здесь мы представим только несколько основных примеров.
Область переменных работает как ожидается, когда немедленное выполнение отключено.
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 не влияет на именование других операций, таких как умножение. См. связанное обсуждение на 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,))
| Args | |
|---|---|
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 | Специальный getter по умолчанию для переменных в этой области. |
reuse | True, None или tf.compat.v1.AUTO_REUSE; если True, мы переходим в режим повторного использования для этой области, а также для всех дочерних областей; если tf.compat.v1.AUTO_REUSE, мы создаём переменные, если они не существуют, и возвращаем их в противном случае; если None, мы наследуем флаг повторного использования родительской области. Когда немедленное выполнение включено, новые переменные всегда создаются, если текущим активен EagerVariableStore или шаблон. |
dtype | Тип переменных, созданных в этой области (по умолчанию соответствует типу в переданной области или унаследован из родительской области). |
use_resource | Если False, все переменные будут обычными переменными. Если True, вместо этого будут использоваться экспериментальные ResourceVariables с хорошо определёнными семантиками. По умолчанию False (позже изменится на True). При включённом немедленном выполнении этот аргумент всегда принудительно устанавливается в True. |
constraint | Необязательная функция проектирования, применяемая к переменной после её обновления операцией Optimizer (например, используется для реализации ограничений норм или ограничений значений для весов слоёв). Функция должна принимать в качестве входного значения не спроектированный Tensor, представляющий значение переменной, и возвращать Tensor для спроектированного значения (которое должно иметь ту же форму). Ограничения небезопасны для использования при асинхронном распределённом обучении. |
auxiliary_name_scope | Если True, мы создаём вспомогательную область имён с областью. Если False, мы её не создаём. Обратите внимание, что этот аргумент не наследуется и действует только один раз при создании. Вы должны использовать его только для повторного входа в предварительно созданную область переменных. |
| Raises | |
|---|---|
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/versions/r2.9/api_docs/python/tf/compat/v1/variable_scope