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

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

【问题讨论】:

标签: python tensorflow keras loss-function


【解决方案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 数组”当我尝试访问这样的中间张量时。
猜你喜欢
  • 1970-01-01
  • 2018-11-12
  • 2018-07-22
  • 2019-01-15
  • 2021-02-19
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2020-11-01
相关资源
最近更新 更多