Метод add_loss класса Layer
Метод add_loss класса Layer добавляет
лосс (дополнительную функцию потерь) к слою.
Добавленные лоссы накапливаются в атрибуте
losses слоя и учитываются при обучении
модели. Первым параметром метод принимает
значение лосса в виде тензора или вызываемого
объекта, возвращающего тензор. Вторым
необязательным параметром можно передать
условие, при котором лосс должен применяться.
Синтаксис
layer.add_loss(loss, [conditional])
Пример
Давайте создадим слой и добавим к нему постоянный лосс:
import tensorflow as tf
tf.random.set_seed(0)
layer = tf.keras.layers.Dense(3)
layer.add_loss(tf.reduce_sum(tf.constant([1.0, 2.0, 3.0])))
print(layer.losses)
Результат выполнения кода:
[<tf.Tensor: shape=(), dtype=float32, numpy=6.0>]
Пример
Давайте добавим лосс, зависящий от входных данных слоя:
<+python+>
import tensorflow as tf
tf.random.set_seed(0)
layer = tf.keras.layers.Dense(3)
inputs = tf.constant([[1.0, 2.0, 3.0]])
layer(inputs)
layer.add_loss(tf.reduce_mean(inputs))
print(layer.losses)
<-python+>
Результат выполнения кода:
[<tf.Tensor: shape=(), dtype=float32, numpy=2.0>]
Пример
Давайте создадим собственный слой, который добавляет лосс регуляризации при вызове:
import tensorflow as tf
tf.random.set_seed(0)
class MyLayer(tf.keras.layers.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.kernel = self.add_weight(
shape=(3, 3),
initializer='ones',
trainable=True
)
def call(self, inputs):
self.add_loss(tf.reduce_sum(self.kernel) * 0.01)
return tf.matmul(inputs, self.kernel)
layer = MyLayer()
inputs = tf.constant([[1.0, 2.0, 3.0]])
res = layer(inputs)
print(res)
print(layer.losses)
Результат выполнения кода:
tf.Tensor([[6. 6. 6.]], shape=(1, 3), dtype=float32)
[<tf.Tensor: shape=(), dtype=float32, numpy=0.09>]
Смотрите также
-
класс
Layer,
который является базовым классом для всех слоев -
метод
add_weight,
который добавляет вес к слою -
метод
add_metric,
который добавляет метрику к слою -
атрибут
losses,
который хранит список добавленных лоссов