可以在 keras 损失函数中直接访问中间层吗?

joh*_*891 5 python keras tensorflow loss-function

我很好奇损失函数是否可以在 keras 中实现中间层输出,而无需设计模型以将中间层作为输出提供。我已经看到一个解决方案可以是重新设计架构以在最终预测之外返回中间层并将其用作解决方法,但我不清楚是否可以直接从损失函数访问层输出

Ste*_*t_R 4

我不清楚是否可以直接从损失函数访问层输出

当然可以。

举例来说,考虑使用函数式 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'])
Run Code Online (Sandbox Code Playgroud)

比如说,如果我们想引入一个新的损失函数,它也惩罚我们dense层输出的最大权重,那么我们可以编写一个自定义损失函数,如下所示:

def my_funky_loss_fn(y_true, y_pred):
  return (keras.losses.sparse_categorical_crossentropy(y_true, y_pred) 
        + keras.backend.max(dense))
Run Code Online (Sandbox Code Playgroud)

我们只需将新的损失函数传递给该方法即可在模型中使用它compile()

model.compile(optimizer='adam', 
              loss=my_funky_loss_fn,
              metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)