【问题标题】:DSSIM loss function in KerasKeras 中的 DSSIM 损失函数
【发布时间】:2018-04-03 11:29:03
【问题描述】:

我在 keras 中定义了一个 DSSIM 损失函数。这是我的功能:

 import keras.backend as K

 def DSSIM_coef(y_true,y_pred, c1, c2):




     u_true=K.mean(y_true, axis=-1)
     u_pred=K.mean(y_pred, axis=-1)

     var_true=K.var(y_true, axis=-1)
     var_pred=K.var(y_pred, axis=-1)


     std_true=K.sqrt(var_true)
     std_pred=K.sqrt(var_pred)


     ssim=(2*u_true*u_pred+c1)*(2*std_pred*std_true+c2)
     denom=(u_true**2+u_pred**2+c1)*(var_pred+var_true+c2)

     ssim/=K.clip(denom, K.epsilon(),np.inf)

     return K.mean((1.0-ssim)/2.0)


 def DSSIM_Loss(c1,c2):
    def DSSIM(y_true,y_pred):
      return DSSIM_coef(y_true,y_pred, c1, c2)
    return DSSIM

我使用此损失函数来惩罚 CNN 的地面实况输出与预测输出之间的差异。我还使用 RMSPROP 作为 lr=0.001 的优化器。在编译模型并对其进行训练后,我看到损失值在所有时期都保持不变(0.321)。如果您给我一些积分,我将不胜感激?

【问题讨论】:

    标签: keras keras-layer


    【解决方案1】:

    在您的代码中(2*std_pred*std_true+c2) 2*std_pred*std_true这不是x和y的协方差;

    我认为您可以使用两种方法:

    1. SSIMLoss = 1 - tf.reduce_mean(tf.image.ssim(y_true,y_pred)) 这会给你在 [0, 2] 范围内的损失

    2. DSSIM = tf.reduce_mean((1 - tf.image.ssim(y_true,y_pred)) / 2) 这会给你在 [0, 1] 范围内的损失

    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 2018-10-10
    • 2018-10-21
    • 2020-08-18
    • 2017-10-06
    • 2017-12-21
    • 2019-04-11
    • 1970-01-01
    相关资源
    最近更新 更多