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.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_имеют конечную нижнюю подчёркивание, чтобы уменьшить вероятность коллизий с аргументами ключевых слов.
| Аргументы | |
|---|---|
name_ | Имя области, создаваемой этим шаблоном. При необходимости имя будет сделано уникальным путём добавления _N к имени. |
func_ | Функция для обертывания. |
create_scope_now_ | Логическое значение, определяющее, должна ли область создаваться при построении шаблона или при его вызове. По умолчанию значение False, означающее, что область создаётся при вызове шаблона. |
unique_name_ | Если указано, переопределяет 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/versions/r2.9/api_docs/python/tf/compat/v1/make_template