如何在 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 的损失函数?的主要内容,如果未能解决你的问题,请参考以下文章