tf.compat.v1.make_template
Оборачивает произвольную функцию так, чтобы она совместно использовала переменные.
tf.compat.v1.make_template(
name_,
func_,
create_scope_now_=False,
unique_name_=None,
custom_getter_=None,
**kwargs
)
Переход на TF2
tf.compat.v1.make_template — устаревший API, совместимый только с включённым eager execution и tf.function, если объединить его с tf.compat.v1.keras.utils.track_tf1_style_variables. Подробнее см. раздел руководства по переносу сопоставления моделей, посвящённый make_template:
Даже если вы используете устаревшие API для повторного использования переменных на основе variable_scope, рекомендуем напрямую использовать tf.compat.v1.keras.utils.track_tf1_style_variables, а не tf.compat.v1.make_template, поскольку он проще и предсказуемее взаимодействует с eager execution, чем make_template.
В подходе API TF2 переменные отслеживаются с помощью tf.Modules, слоёв и моделей Keras, а не с опорой на make_template.
Описание
Используется в блокнотах
| Используется в руководстве | Используется в учебных материалах |
|---|---|
Эта функция оборачивает func_ в шаблон и частично вычисляет его. Шаблоны — это функции, которые создают переменные при первом вызове и повторно используют их при последующих вызовах. Чтобы func_ был совместим с Template, он должен удовлетворять следующим условиям:
- Функция должна создавать все обучаемые переменные и любые переменные, которые нужно повторно использовать, вызывая
tf.compat.v1.get_variable. Если обучаемая переменная создаётся с помощьюtf.Variable, будет вызвана ошибка ValueError. Переменные, предназначенные для локального использования, можно создавать, указавtf.Variable(..., trainable=false). - Функция может использовать области видимости переменных и другие шаблоны для внутреннего создания и повторного использования переменных, но не должна использовать
tf.compat.v1.global_variablesдля захвата переменных, определённых вне области видимости функции. - Внутренние области видимости и имена переменных не должны зависеть от аргументов, не переданных в
make_template. Как правило, при ошибке будет вызвана ошибка ValueError с сообщением о попытке повторно использовать несуществующую переменную.
В следующем примере и z, и w будут масштабированы с помощью одного и того же y. Важно отметить: если бы мы не присвоили scalar_name и использовали разные имена для z и w, была бы вызвана ошибка ValueError, поскольку переменную нельзя было бы повторно использовать.
def my_op(x, scalar_name):
var1 = tf.compat.v1.get_variable(scalar_name,
shape=[],
initializer=tf.compat.v1.constant_initializer(1))
return x * var1
scale_by_y = tf.compat.v1.make_template('scale_by_y', my_op, scalar_name='y')
z = scale_by_y(input1)
w = scale_by_y(input2)
В качестве меры предосторожности возвращённая функция после первого вызова вызовет ошибку ValueError, если обучаемые переменные создаются вызовом tf.Variable.
Если все эти условия выполнены, шаблон обеспечивает соблюдение двух свойств:
- При многократном вызове одного и того же шаблона все нелокальные переменные будут совместно использоваться.
- Два разных шаблона гарантированно будут уникальными, если только вы не войдёте повторно в ту же область видимости переменных, что и при первоначальном определении шаблона, и не определите его заново. Пример такого исключения:
def my_op(x, scalar_name):
var1 = tf.compat.v1.get_variable(scalar_name,
shape=[],
initializer=tf.compat.v1.constant_initializer(1))
return x * var1
with tf.compat.v1.variable_scope('scope') as vs:
scale_by_y = tf.compat.v1.make_template('scale_by_y', my_op,
scalar_name='y')
z = scale_by_y(input1)
w = scale_by_y(input2)
# Creates a template that reuses the variables above.
with tf.compat.v1.variable_scope(vs, reuse=True):
scale_by_y2 = tf.compat.v1.make_template('scale_by_y', my_op,
scalar_name='y')
z2 = scale_by_y2(input1)
w2 = scale_by_y2(input2)
В зависимости от значения create_scope_now_ полная область видимости переменных может быть захвачена либо при первом вызове, либо при создании. Если для этого параметра задано значение True, у всех тензоров, созданных повторными вызовами шаблона, в конце имени будет добавлено _N+1, поскольку при первом входе в область видимости в конструкторе Template тензоры не создаются.
Примечание:name_,func_иcreate_scope_now_заканчиваются символом подчёркивания, чтобы снизить вероятность конфликтов с kwargs.
| Аргументы | |
|---|---|
name_ | Имя области видимости, создаваемой этим шаблоном. При необходимости имя будет сделано уникальным путём добавления _N. |
func_ | Функция, которую нужно обернуть. |
create_scope_now_ | Логическое значение, определяющее, следует ли создавать область видимости при создании шаблона или при его вызове. Значение по умолчанию — False: область видимости создаётся при вызове шаблона. |
unique_name_ | Если указано, переопределяет name_ и не становится уникальным. Если шаблон с такой же областью видимости/unique_name уже существует, а reuse имеет значение false, возникает ошибка. По умолчанию — None. |
custom_getter_ | Необязательный пользовательский метод получения переменных, используемых в func_. Дополнительные сведения см. в документации tf.compat.v1.get_variable custom_getter. |
**kwargs | Именованные аргументы, передаваемые в func_. |
| Возвращает | |
|---|---|
Функцию для инкапсуляции набора переменных, которые следует создать один раз и повторно использовать. Внешняя область видимости будет создана либо при вызове make_template, либо при вызове результата — в зависимости от значения create_scope_now_. Независимо от этого значения, при первом вызове шаблона он войдёт в область видимости без повторного использования и вызовет func_ для создания переменных, уникальность которых гарантирована. При всех последующих вызовах он повторно войдёт в область видимости и повторно использует эти переменные. |
| Вызывает исключения | |
|---|---|
ValueError | если name_ равно None. |
© 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/make_template