Python 将SSIM损失函数用于Keras

Python 将SSIM损失函数用于Keras,python,keras,Python,Keras,我需要使用Sewar的SSIM作为损失函数,以便比较我的模型的图像 我试图编译模型时出错。我导入函数并编译模型,如下所示: from sewar.full_ref import ssim ... model.compile('ssim', optimizer=my_optimizer, metrics=[ssim]) model.compile(ssim(), optimizer=my_optimizer, metrics=[ssim()]) def SSIMLoss(y_true, y_p

我需要使用Sewar的SSIM作为损失函数,以便比较我的模型的图像

我试图编译模型时出错。我导入函数并编译模型,如下所示:

from sewar.full_ref import ssim
...
model.compile('ssim', optimizer=my_optimizer, metrics=[ssim])
model.compile(ssim(), optimizer=my_optimizer, metrics=[ssim()])
def SSIMLoss(y_true, y_pred):
  return 1 - tf.reduce_mean(tf.image.ssim(y_true, y_pred, 1.0))

self.model.compile(optimizer=sgd, loss=SSIMLoss)
我明白了:

File "/media/merry/merry32/train.py", line 19, in train
model.compile(loss='ssim', optimizer=opt, metrics=[ssim])
File "/home/merry/anaconda3/envs/merry_env/lib/python3.7/site-packages/keras/engine/training.py", line 451, in compile
handle_metrics(output_metrics)
File "/home/merry/anaconda3/envs/merry_env/lib/python3.7/site-packages/keras/engine/training.py", line 420, in handle_metrics
mask=masks[i])
File "/home/merry/anaconda3/envs/merry_env/lib/python3.7/site-packages/keras/engine/training_utils.py", line 404, in weighted
score_array = fn(y_true, y_pred)
File "/home/merry/anaconda3/envs/merry_env/lib/python3.7/site-packages/sewar/full_ref.py", line 143, in ssim
MAX = np.iinfo(GT.dtype).max
File "/home/merry/anaconda3/envs/merry_env/lib/python3.7/site-packages/numpy/core/getlimits.py", line 506, in __init__
raise ValueError("Invalid integer data type %r." % (self.kind,))
ValueError: Invalid integer data type 'O'.
我也可以这样写:

from sewar.full_ref import ssim
...
model.compile('ssim', optimizer=my_optimizer, metrics=[ssim])
model.compile(ssim(), optimizer=my_optimizer, metrics=[ssim()])
def SSIMLoss(y_true, y_pred):
  return 1 - tf.reduce_mean(tf.image.ssim(y_true, y_pred, 1.0))

self.model.compile(optimizer=sgd, loss=SSIMLoss)
但是我得到了这个错误(很明显):

我只是想用mean_sqeared_error做同样的事情,但是用SSIM,就像这样(它可以完美地工作,不需要向它传递参数):


您知道如何使用此函数进行编译吗?

为了使用外部损耗,您需要创建自己的自定义损耗函数。 然而,这些损失必须调整为使用Tensorflow的张量和而不是数值或矩阵,因此它不是那么简单

我建议您看看如何编写自定义损失函数,关于这方面有很多很好的教程,如。

  • 您可以使用
    tf.image.ssim
    计算两个图像之间的ssim索引
  • 由于训练发生在一批图像上,我们将使用该批中所有图像的SSIM值的平均值作为损失值
  • 我们的模型将返回一个图像(基于所使用的CNN层的大小,该层同样基于输入和预期的输出图像尺寸)
示例工作代码
Keras实现了SSIM。您可以这样使用它:

from sewar.full_ref import ssim
...
model.compile('ssim', optimizer=my_optimizer, metrics=[ssim])
model.compile(ssim(), optimizer=my_optimizer, metrics=[ssim()])
def SSIMLoss(y_true, y_pred):
  return 1 - tf.reduce_mean(tf.image.ssim(y_true, y_pred, 1.0))

self.model.compile(optimizer=sgd, loss=SSIMLoss)

好吧,
ssim
不是在Keras本身中实现的,您能提供
ssim()
函数的源代码吗?它显然有效,但是它给了我NegativeFes值来表示损失和验证损失。你必须在损失函数之前使用负号,因为你想最大化SSIM。我想这只适用于你的输入在0和1之间被标准化的情况,对吗?你的问题有答案吗@shaurov2253@shaurov2253是的,
tf.image.ssim
中的第三个参数是
max_val
(图像的动态范围(即最大允许值和最小允许值之间的差值)。),只要最大和最小允许值的差值为1.0。否则,您可以根据输入修改此参数。