我不清楚层输出是否可以直接从损失函数访问
当然可以。
举个例子,考虑一下这个使用函数式 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'])