如何在 keras 中实现 ssim 的损失函数?

Posted

技术标签:

【中文标题】如何在 keras 中实现 ssim 的损失函数?【英文标题】:how do I implement ssim for loss function in keras? 【发布时间】:2019-08-31 04:15:48 【问题描述】:

我需要 SSIM 作为网络中的损失函数,但我的网络有 2 个输出。我需要将 SSIM 用于第一个输出,然后将 cross-entropy 用于下一个。损失函数是它们的组合。但是,我需要更高的 SSIM 和更低的cross-entropy,所以我认为它们的组合是不正确的。另一个问题是我在 keras 中找不到 SSIM 的实现。

Tensorflow 有tf.image.ssim,但它接受图像,我认为我不能在损失函数中使用它,对吧?你能告诉我我该怎么做吗?我是 keras 和深度学习的初学者,我不知道如何将 SSIM 作为 keras 中的自定义损失函数。

【问题讨论】:

【参考方案1】:

看看here Keras 中的 SSIM 丢失。 您可以编写自定义损失函数并为一个预测创建 SSIM 损失,为另一个预测创建交叉熵。您可以返回两个损失的加权总和作为最终损失。

【讨论】:

这意味着如果我想最小化损失函数我应该使用 1-SSIM 并且我不能使用带有交叉熵的 SSIM 来最小化我的损失函数,对吧? 你的工作是计算损失,你的优化器试图最小化它。我不确定你在问什么。 我的意思是图像处理中更好的 SSIM 越高,它应该接近 1,但 mse 应该接近于零,以获得更好的算法。所以我认为如果我使用 SSIM 作为损失函数,优化器应该最大化它而不是最小化。所以这意味着我应该最小化 1 - SSIM,对吧? 您可以使用最小化mse - ssim(适当加权)。所以,当你最小化这个数量时,mse 被最小化,ssim 被最大化。【参考方案2】:

其他选择是 ssim_loss = 1 - tf.reduce_mean(tf.image.ssim(target, output, max_val=self.max_val))

那么 combine_loss = mae (or mse) + ssim_loss 通过这种方式,您可以将它们都最小化。

【讨论】:

以上是关于如何在 keras 中实现 ssim 的损失函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 keras 中实现三元组损失的准确性

如何在 keras 模型中实现汉明损失作为自定义指标

用条件在keras中实现自定义丢失函数

Keras:如何在损失函数中使用层的权重?

在 Keras 中实现批次相关的损失

在 Keras 中实现 word2vec