tf.compat.v1.make_template
Для произвольной функции создайте обёртку, которая обеспечит совместное использование переменных.
tf.compat.v1.make_template(
name_, func_, create_scope_now_=False, unique_name_=None, custom_getter_=None,
**kwargs
)
Это обёртка 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.
| Args | |
|---|---|
name_ | Имя области, созданной этим шаблоном. При необходимости, имя будет сделано уникальным путём добавления _N к имени. |
func_ | Функция, которая должна быть обернута. |
create_scope_now_ | Логический параметр, управляющий тем, должна ли область создаваться при построении шаблона или при вызове шаблона. По умолчанию False, что означает, что область создаётся при вызове шаблона. |
unique_name_ | При использовании, переопределяет имя name_ и не делает его уникальным. Если шаблон с той же областью/уникальным именем уже существует и повторное использование выключено, то возникает ошибка. По умолчанию None. |
custom_getter_ | Необязательный пользовательский getter для переменных, используемых в func_. См. документацию tf.compat.v1.get_variable custom_getter для получения дополнительной информации. |
**kwargs | Аргументы ключевых слов, которые нужно применить к func_. |
| Returns | |
|---|---|
Функция для инкапсуляции набора переменных, которые должны быть созданы один раз и повторно использованы. Охватывающая область будет создана либо при вызове make_template, либо при вызове результата, в зависимости от значения create_scope_now_. Независимо от значения, при первом вызове шаблона он войдёт в область без повторного использования и вызовет func_ для создания переменных, которые гарантированно будут уникальными. Все последующие вызовы повторно войдут в область и повторно используют эти переменные. |
| Raises | |
|---|---|
ValueError | если name_ равно None. |
© 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/make_template