tf.compat.v1.keras.utils.track_tf1_style_variables
Оборачивайте методы слоя и модуля этим декоратором, чтобы захватить переменные в стиле tf1.
tf.compat.v1.keras.utils.track_tf1_style_variables(
method
)
Декорирование методов tf.keras.Layer или tf.Module этим декоратором заставит слой/модуль отслеживать переменные, созданные/используемые с помощью tf.compat.v1.get_variable (и, как следствие, tf.compat.v1.layers) внутри декорируемого метода.
Помимо отслеживания самих переменных в стандартных свойствах layer.variable/module.variable и т.д., если метод принадлежит tf.keras.Layer, то любые регуляризационные потери, указанные через аргументы get_variable или tf.compat.v1.layers regularizer, будут отслеживаться слоем в стандартном свойстве layer.losses.
Это отслеживание позволяет использовать широкий класс кода прохода модели в стиле TF1 внутри слоев Keras или tf.Modules в TF2 с включенными поведением TF2.
Пример захвата кода моделирования на основе tf.compat.v1.layer в качестве слоя Keras:
class WrappedDoubleDenseLayer(tf.keras.layers.Layer):
def __init__(self, units, *args, **kwargs):
super().__init__(*args, **kwargs)
self.units = units
@tf.compat.v1.keras.utils.track_tf1_style_variables
def call(self, inputs):
with tf.compat.v1.variable_scope("double_dense_layer"):
out = tf.compat.v1.layers.dense(
inputs, self.units, name="dense_one",
kernel_initializer=tf.compat.v1.random_normal_initializer,
kernel_regularizer="l2")
out = tf.compat.v1.layers.dense(
out, self.units, name="dense_two",
kernel_initializer=tf.compat.v1.random_normal_initializer(),
kernel_regularizer="l2")
return out
# Create a layer that can be used as a standard keras layer
layer = WrappedDoubleDenseLayer(10)
# call the layer on inputs
layer(...)
# Variables created/used within the scope will be tracked by the layer
layer.weights
layer.trainable_variables
# Regularization losses will be captured in layer.losses after a call,
# just like any other Keras layer
reg_losses = layer.losses
Пример захвата кода моделирования на основе tf.compat.v1.get_variable в качестве слоя Keras:
class WrappedDoubleDenseLayer(tf.keras.layers.Layer):
def __init__(self, units, *args, **kwargs):
super().__init__(*args, **kwargs)
self.units = units
@tf.compat.v1.keras.utils.track_tf1_style_variables
def call(self, inputs):
out = inputs
with tf.compat.v1.variable_scope("double_dense_layer"):
with tf.compat.v1.variable_scope("dense_one"):
# The weights are created with a `regularizer`,
# so the layer should track their regularization losses
kernel = tf.compat.v1.get_variable(
shape=[out.shape[-1], self.units],
regularizer=regularizers.L2(),
initializer=init_ops.ones_initializer(),
name="kernel")
bias = tf.compat.v1.get_variable(
shape=[self.units,],
initializer=init_ops.zeros_initializer(),
name="bias")
out = tf.compat.v1.math.matmul(out, kernel)
out = tf.compat.v1.nn.bias_add(out, bias)
with tf.compat.v1.variable_scope("dense_two"):
kernel = tf.compat.v1.get_variable(
shape=[out.shape[-1], self.units],
regularizer=regularizers.L2(),
initializer=init_ops.ones_initializer(),
name="kernel")
bias = tf.compat.v1.get_variable(
shape=[self.units,],
initializer=init_ops.zeros_initializer(),
name="bias")
out = tf.compat.v1.math.matmul(out, kernel)
out = tf.compat.v1.nn.bias_add(out, bias)
return out
# Create a layer that can be used as a standard keras layer
layer = WrappedDoubleDenseLayer(10)
# call the layer on inputs
layer(...)
# Variables created/used within the scope will be tracked by the layer
layer.weights
layer.trainable_variables
# Regularization losses will be captured in layer.losses after a call,
# just like any other Keras layer
reg_losses = layer.losses
Регуляризационные потери:
Любые регуляризаторы, указанные в вызовах get_variable или созданиях compat.v1.layer, будут захвачены, если они встречаются в вашем декорированном методе, и метод принадлежит tf.keras.Layer/tf.keras.Module. Регуляризационные потери доступны в layer.losses после вызова, как и в стандартном слое Keras, и будут захвачены любой моделью, которая включает этот слой. Регуляризационные потери, прикрепленные к слоям/моделям Keras, установленным как атрибуты вашего слоя, также будут захвачены в стандартном отслеживании регуляризационных потерь Keras.
(Хотя у модулей нет свойства losses, вызываемые без аргументов функции для вычисления регуляризационных потерь могут отслеживаться как значения словаря в закрытом свойстве module._tf1_style_var_store._regularizers, но только для весов tf.compat.v1.layers и get_variable, а не для других вложенных слоев Keras/tf.Modules)
Область переменных/переиспользование переменных: переиспользование на основе области переменных в вашем декорированном методе будет соблюдаться и работать как переиспользование на основе области переменных в TF1.
Имена переменных/загрузка предварительно обученного контрольного пункта: Имена переменных из get_variable и слоев compat.v1.layer будут соответствовать именам TF1, поэтому вы должны иметь возможность повторно использовать старые контрольные пункты на основе имен. Имена переменных для слоев/моделей Keras или для переменных, созданных с помощью tf.Variable, могут измениться при переходе к выполнению eager.
Аргумент обучения, если вы декорируете layer.call: Keras передаст аргумент training этому слою, если call содержит аргумент training или аргумент **kwargs varargs в его сигнатуре вызова, аналогично тому, как keras передает training другим слоям в TF2, у которых есть аналогичные сигнатуры в их реализации call. Более подробные сведения см. в документации по tf.keras.layers.Layer, чтобы понять, что будет передано и когда. Примечание: tf.compat.v1.layers обычно не вызываются с training=None, поэтому аргумент обучения для forward_pass может не передаваться им, если вы его не передадите явно в их вызовы.
Ограничения:
- TF2 не будет обрезать неиспользуемые обновления переменных (или неиспользуемые выводы). Возможно, вам потребуется внести изменения в код прохода вперед, чтобы избежать вычислений или обновлений переменных, которые вы не хотите использовать.
- Избегайте вложенного создания переменных в tf.function внутри методов, декорированных с помощью
track_tf1_style_variables. Хотя метод может безопасно использоваться внутриtf.function, использование функции внутри декорированного метода может нарушить область видимости переменных. - Этот декоратор добавляет только неявное отслеживание для использования get_variable/compat.v1.layers в стиле старого TF1. Если вы хотите использовать вложенные слои/модели Keras внутри декорированного метода, вам нужно назначить их как атрибуты вашего слоя, чтобы стандартные объектно-ориентированные веса Keras/Module (и отслеживание потерь для слоев) заработали. Более подробная информация доступна в руководстве по модулям, слоям и моделям guide. В качестве резервного варианта метод
compat.v1.keras.utils.get_or_create_layerупростит отслеживание вложенных весов и потерь моделей Keras для существующего кода TF1, но новый код должен использовать явное отслеживание.
| Args | |
|---|---|
method | Метод для декорирования. Он должен принадлежать пользовательскому tf.Module, tf.keras.layers.Layer или tf.keras.Model. |
| Returns | |
|---|---|
| Декорированный метод. |
© 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/keras/utils/track_tf1_style_variables