【问题标题】:How to calculate PSNR metric in KERAS如何在 KERAS 中计算 PSNR 指标
【发布时间】:2019-09-14 14:39:20
【问题描述】:

我正在尝试为我的 keras 自动编码器卷积网络模型计算 PSNR 指标。但是,我遇到了一个错误。请帮助检查和纠正问题。谢谢

import math
from keras import backend as K


def PSNR(y_true, y_pred):
    max_pixel = 1.0
    return 10.0 * math.log10((max_pixel ** 2) / (K.mean(K.square(y_pred - 
y_true)))) 


adam = optimizers.Adam(lr=0.0001)
autoencoder.compile(loss='mse', metrics=[PSNR], optimizer=adam) 

完整的回溯是: Traceback(最近一次调用最后一次):

文件“”,第 1 行,在 autoencoder.compile(loss='mse', metrics=[PSNR], optimizer=adm)

文件“C:\Users\LW\Anaconda3\envs\tensorflow_demo\lib\site-packages\keras\engine\training.py”,第 451 行,编译 处理指标(输出指标)

文件“C:\Users\LW\Anaconda3\envs\tensorflow_demo\lib\site-packages\keras\engine\training.py”,第 420 行,在 handle_metrics 掩码=掩码[i])

文件“C:\Users\LW\Anaconda3\envs\tensorflow_demo\lib\site-packages\keras\engine\training_utils.py”,第 404 行,加权 score_array = fn(y_true, y_pred)

文件“”,第 8 行,在 PSNR 中 return 10.0 * math.log10((max_pixel ** 2) / (K.mean(K.square(y_pred - y_true))))

TypeError: 必须是实数,而不是 Tensorr

请告诉我如何解决这个问题

【问题讨论】:

  • 错误不是来自 PSNR 检查tpcg.io/vebk7D。什么是完整的错误? btw log(1) base 10 总是 0
  • 是的,请添加完整的回溯。
  • @Matias Valdenegro 请检查回溯谢谢
  • @abdul qayyum 谢谢,你能提出一些建议
  • 尝试打印数据,你的数据是什么形状的?

标签: python tensorflow keras deep-learning


【解决方案1】:

您不能在 keras 度量或损失函数中使用math.log,因为它不对符号张量进行操作。请改用(1.0 / math.log(10)) * K.log。应用了转换因子,因为K.log 是自然对数,并且您需要以 10 为底的对数。

import math
def PSNR(y_true, y_pred):
    max_pixel = 1.0
    return 10.0 * (1.0 / math.log(10)) * K.log((max_pixel ** 2) / (K.mean(K.square(y_pred - 
y_true))))

【讨论】:

  • 为什么我的 PSNR 会在 77 左右,您认为这是正确的。我所有的图像都在 1 和 0 之间进行了标准化。
【解决方案2】:

对我来说,Matias Valdenegro 的回答效果不佳。我花了将近一天的时间来找出我的模型出了什么问题,但最后我发现 Valdenegro 写的函数是错误的。

这是我修改的内容。
首先,不要乘以 2.303。相反,分开。因为自然对数大于以 10 为底的对数。
其次,根据keras api,K.mean中应该有一个'axis=-1'参数来计算mse。
所以,函数看起来像

def PSNR(y_true, y_pred):
    max_pixel = 1.0
    return (10.0 * K.log((max_pixel ** 2) / (K.mean(K.square(y_pred - y_true), axis=-1)))) / 2.303

【讨论】:

  • 有时 psnr 可以是 inf,也许是 y_pred == y_true。这不是什么大问题(对我来说),但如果你不想看到它,只需平方(y_pred - y_true + 1e-8)
  • Tensorflow中有一个名为tf.image.psnr的函数。
【解决方案3】:

tf.image.psnr 来自张量流。 https://www.tensorflow.org/api_docs/python/tf/image/psnr 只需根据您的需要更改max_val

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    相关资源
    最近更新 更多