首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Keras中使用SSIM损失函数

在Keras中使用SSIM损失函数
EN

Stack Overflow用户
提问于 2019-08-05 18:54:57
回答 4查看 7.8K关注 0票数 3

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

当我试图编译我的模型时,我得到了错误。我导入函数并编译模型,如下所示:

代码语言:javascript
复制
from sewar.full_ref import ssim
...
model.compile('ssim', optimizer=my_optimizer, metrics=[ssim])

我得到了这个:

代码语言:javascript
复制
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'.

我也可以这样写:

代码语言:javascript
复制
model.compile(ssim(), optimizer=my_optimizer, metrics=[ssim()])

但是我得到了这个错误(很明显):

代码语言:javascript
复制
TypeError: ssim() missing 2 required positional arguments: 'GT' and 'P'

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

代码语言:javascript
复制
model.compile('mean_squared_error', optimizer=my_optimizer, metrics=['mse'])

你知道我应该如何使用这个函数来编译吗?

EN

回答 4

Stack Overflow用户

发布于 2019-08-05 19:35:21

  • 您可以使用tf.image.ssim来计算两个图像之间的SSIM索引。
  • 由于训练是在一批图像上进行的,因此我们将使用该批图像中所有图像的SSIM值的平均值作为损失值
  • 我们的模型将返回一个图像(一定大小基于所使用的CNN层,这也是基于输入和预期输出图像尺寸)。

示例工作代码

代码语言:javascript
复制
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten
import numpy as np
import tensorflow as tf

# Loss functtion
def ssim_loss(y_true, y_pred):
  return tf.reduce_mean(tf.image.ssim(y_true, y_pred, 2.0))

# Model: Input Image size: 32X32X1 output Image size: 28X28X1 
# check model.summary
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=(32,32,1)))
model.add(Conv2D(1, kernel_size=(3, 3),
                 activation='relu'))

model.compile(optimizer='adam', loss=ssim_loss, metrics=[ssim_loss, 'accuracy'])

# Train
model.fit(np.random.randn(10,32,32,1), np.random.randn(10,28,28,1))
票数 6
EN

Stack Overflow用户

发布于 2020-04-18 16:07:03

Keras有一个SSIM的实现。你可以这样使用它:

代码语言:javascript
复制
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)
票数 4
EN

Stack Overflow用户

发布于 2019-08-05 19:08:52

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

我建议你看看如何编写一个自定义损失函数,有很多关于这方面的很好的教程,比如this one

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57357146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档