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 и 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-выполнением проще и предсказуемее, чем make_template.
Подход API TF2 заключался бы в отслеживании ваших переменных с помощью tf.Module или слоёв и моделей 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.
Если всё это верно, то шаблон навязывает 2 свойства:
- Вызов одного и того же шаблона несколько раз будет совместно использовать все нелокальные переменные.
- Гарантируется, что два разных шаблона будут уникальными, если вы не вернётесь в ту же область переменных, что и при первоначальном определении шаблона, и не переопределите его. Пример такого исключения:
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 к своему имени, поскольку при первом входе в область в конструкторе шаблона тензоры не создаются.
Примечание:name_,func_иcreate_scope_now_имеют заключительный символ подчёркивания, чтобы уменьшить вероятность столкновений с kwargs.
| Аргументы | |
|---|---|
name_ | Имя области, созданной этим шаблоном. При необходимости имя будет сделано уникальным путём добавления _N к имени. |
func_ | Функция, которую нужно обернуть. |
create_scope_now_ | Логическое значение, определяющее, должна ли область создаваться при построении шаблона или при вызове шаблона. По умолчанию значение False, что означает, что область создаётся при вызове шаблона. |
unique_name_ | При использовании переопределяет name_ и не делает его уникальным. Если шаблон с той же областью/уникальным именем уже существует и повторное использование выключено, возникает ошибка. По умолчанию 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