tf.make_template
Принимая произвольную функцию, оберните её так, чтобы она делила переменные.
tf.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.
| Аргументы | |
|---|---|
name_ | Имя области, созданной этим шаблоном. При необходимости имя будет сделано уникальным путём добавления _N к имени. |
func_ | Функция для обертывания. |
create_scope_now_ | Булево значение, контролирующее, должна ли область создаваться при построении шаблона или при вызове шаблона. По умолчанию False, что означает, что область создаётся при вызове шаблона. |
unique_name_ | Если используется, переопределяет имя_ и не делается уникальным. Если шаблон с той же областью/уникальным именем уже существует и повторное использование выключено, генерируется ошибка. По умолчанию None. |
custom_getter_ | Дополнительный пользовательский получатель для переменных, используемых в func_. См. документацию tf.compat.v1.get_variable custom_getter для получения дополнительной информации. |
**kwargs | Аргументы ключевых слов для применения к func_. |
| Возвращает | |
|---|---|
Функция для инкапсуляции набора переменных, которые должны быть созданы один раз и повторно использованы. Внешняя область будет создана либо при вызове make_template, либо при вызове результата, в зависимости от значения create_scope_now_. Независимо от значения, при первом вызове шаблона он войдёт в область без повторного использования и вызовет func_ для создания переменных, которые гарантированно будут уникальными. Все последующие вызовы будут повторно входить в область и повторно использовать эти переменные. |
| Возбуждает | |
|---|---|
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/r1.15/api_docs/python/tf/make_template