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 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 для добавления префиксов к именам переменных.
Описание
Используется в блокнотах
| Используется в руководстве | Используется в учебных материалах |
|---|---|
Этот менеджер контекста проверяет, что (необязательные) 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