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

Posted

技术标签:

【中文标题】可以在 keras 损失函数中直接访问中间层吗?【英文标题】:Can intermediate layers be accessed directly within keras loss function? 【发布时间】:2019-10-16 16:02:29 【问题描述】:

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

【问题讨论】:

这里有一个简单的解决方案:***.com/questions/62454500/… 【参考方案1】:

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

当然可以。

举个例子,考虑一下这个使用函数式 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'])

【讨论】:

是否也可以在该密集层的输出中添加标签? 使用最新的 tensorflow 我得到:“TypeError:无法将符号 Keras 输入/输出转换为 numpy 数组”当我尝试访问这样的中间张量时。

以上是关于可以在 keras 损失函数中直接访问中间层吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在生成器提供的 Keras 自定义损失函数中访问样本权重?

如何为 keras 模型使用 tensorflow 自定义损失?

Keras 在自定义损失函数中访问单个值

Keras中验证集的不同损失函数

使用 Keras 在 R Studio 中编写损失函数

Keras 自定义损失(chi2)线性回归