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 ...").
Аналогично, мы генерируем исключение при попытке получить переменную, которая не существует в режиме 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,))
| Аргументы | |
|---|---|
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, все переменные будут обычными переменными. Если True, вместо этого будут использоваться экспериментальные ResourceVariables с хорошо определённой семантикой. По умолчанию False (впоследствии будет изменено на True). При включённом режиме eager execution этот аргумент всегда принудительно устанавливается в True. |
constraint | Необязательная проекционная функция, применяемая к переменной после обновления её операцией (например, используется для реализации ограничений нормы или ограничений значений для весов слоя). Функция должна принимать на вход непроектированный тензор, представляющий значение переменной, и возвращать тензор для спроектированного значения (которое должно иметь ту же форму). Ограничения не безопасны для использования при асинхронном распределённом обучении. |
auxiliary_name_scope | Если True, мы создаём вспомогательную область имен со scope. Если 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.3/api_docs/python/tf/compat/v1/variable_scope