Мне неясно, можно ли получить доступ к выходу слоя напрямую из функции потерь
Это, безусловно, возможно.
В качестве примера рассмотрим эту модельиспользуя функциональный API:
inp = keras.layers.Input(shape=(28, 28))
flat = keras.layers.Flatten()(inp)
dense = keras.layers.Dense(128, activation=tf.nn.relu)(flat)
out = keras.layers.Dense(10, activation=tf.nn.softmax)(dense)
model = keras.models.Model(inputs=inp, outputs=out )
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
Если, скажем, мы хотим ввести новую функцию потерь, которая также оштрафует наибольший вес выходов нашего слоя dense
, то мы могли бы написать что-то специальную функцию потерьнапример:
def my_funky_loss_fn(y_true, y_pred):
return (keras.losses.sparse_categorical_crossentropy(y_true, y_pred)
+ keras.backend.max(dense))
, который мы можем использовать в нашей модели, просто передав нашу новую функцию потерь методу compile()
:
model.compile(optimizer='adam',
loss=my_funky_loss_fn,
metrics=['accuracy'])