如何在KERAS中计算PSNR度量

时间:2019-04-25 08:07:39

标签: python tensorflow keras deep-learning

我正在尝试为我的keras自动编码器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) 

完整的回溯是: 追溯(最近一次通话):

文件“”,第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)

handle_metrics中的第420行“ C:\ Users \ LW \ Anaconda3 \ envs \ tensorflow_demo \ lib \ site-packages \ keras \ engine \ training.py”     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)

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

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

请让我知道如何解决此问题

2 个答案:

答案 0 :(得分:0)

您不能在keras度量或损失函数内使用math.log,因为它不适用于符号张量。请改用2.303 * K.log。由于K.log是自然对数,而您想以10为底的对数,因此可以应用转换因子。

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

答案 1 :(得分:0)

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