Атрибут losses
Атрибут losses класса Model возвращает список тензоров,
содержащих значения потерь, которые были вычислены для каждого
выхода модели во время последнего прямого прохода. Этот атрибут
доступен только после вызова метода compile с указанной
функцией потерь и выполнения прямого прохода через модель.
Каждый элемент списка соответствует потере для отдельного выхода
или отдельного слоя, если потери заданы на уровне слоев.
Атрибут возвращает список тензоров TensorFlow, а не одно число,
поскольку модель может иметь несколько выходов или несколько
заданных функций потерь.
Синтаксис
model.losses
Пример
Давайте создадим простую модель с одним выходом, скомпилируем
ее и выполним прямой проход, чтобы получить значение атрибута
losses:
import tensorflow as tf
tf.random.set_seed(0)
model = tf.keras.Sequential([
tf.keras.layers.Dense(3, input_shape=(2,)),
tf.keras.layers.Dense(1)
])
model.compile(optimizer='sgd', loss='mse')
t = tf.constant([[1.0, 2.0]])
_ = model(t)
print(model.losses)
Результат выполнения кода:
[]
В данном случае список пуст, так как потери на уровне слоев
не заданы. Атрибут losses хранит только те потери,
которые добавлены самими слоями через метод add_loss.
Пример
Давайте создадим слой с дополнительной потерей регуляризации
через метод add_loss и посмотрим, как это отразится
на атрибуте losses:
import tensorflow as tf
tf.random.set_seed(0)
class CustomLayer(tf.keras.layers.Layer):
def call(self, inputs):
self.add_loss(tf.reduce_mean(tf.square(inputs)))
return inputs
model = tf.keras.Sequential([
tf.keras.layers.Dense(3, input_shape=(2,)),
CustomLayer(),
tf.keras.layers.Dense(1)
])
model.compile(optimizer='sgd', loss='mse')
t = tf.constant([[1.0, 2.0]])
_ = model(t)
print(model.losses)
Результат выполнения кода:
[<tf.Tensor: shape=(), dtype=float32, numpy=6.4466734>]
Теперь атрибут losses содержит один тензор - потерю,
добавленную пользовательским слоем во время прямого прохода.
Пример
Давайте добавим несколько потерь на уровне слоев и посмотрим,
как они все попадут в атрибут losses:
import tensorflow as tf
tf.random.set_seed(0)
class LossLayer(tf.keras.layers.Layer):
def call(self, inputs):
self.add_loss(tf.reduce_sum(inputs))
self.add_loss(tf.reduce_mean(inputs))
return inputs
model = tf.keras.Sequential([
tf.keras.layers.Dense(3, input_shape=(2,)),
LossLayer()
])
model.compile(optimizer='sgd', loss='mse')
t = tf.constant([[1.0, 2.0]])
_ = model(t)
for loss in model.losses:
print(loss.numpy())
Результат выполнения кода:
1.9509828
0.6503276
В списке losses оказалось две потери - по одной
на каждый вызов метода add_loss внутри слоя.