首页 > 解决方案 > 如何在 KERAS 中计算 PSNR 指标

问题描述

我正在尝试为我的 keras autoencoder convnet 模型计算 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 行,编译 handle_metrics(output_metrics)

文件“C:\Users\LW\Anaconda3\envs\tensorflow_demo\lib\site-packages\keras\engine\training.py”,第 420 行,在 handle_metrics mask=masks[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 返回 10.0 * math.log10((max_pixel ** 2) / (K.mean(K.square(y_pred - y_true))))

TypeError:必须是实数,不是 Tensorr

请让我知道如何解决这个问题

标签: pythontensorflowkerasdeep-learning

解决方案


对我来说,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

推荐阅读