我正在尝试为我的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=‘mse’,metrics=PSNR,optimizer=adm)
在编译handle_metrics(output_metrics)中,文件"C:\Users\LW\Anaconda3\envs\tensorflow_demo\lib\site-packages\keras\engine\training.py",第451行
handle_metrics mask=masksi中的File "C:\Users\LW\Anaconda3\envs\tensorflow_demo\lib\site-packages\keras\engine\training.py",第420行)
文件"C:\Users\LW\Anaconda3\envs\tensorflow_demo\lib\site-packages\keras\engine\training_utils.py",行404,加权score_array = fn(y_true,y_pred)
文件"",第8行,峰值信噪比返回10.0 * math.log10((max_pixel ** 2) / (K.mean(K.square(y_pred -y_true)
TypeError:必须是实数,而不是Tensorr
请告诉我如何解决这个问题
发布于 2019-05-19 21:00:27
对我来说,马蒂亚斯·瓦尔登格罗的回答并不奏效。我花了几乎一天的时间来找出我的模型的错误之处,但最终我发现Valdenegro写的函数是错误的。
这是我修改的内容。
首先,不要乘以2.303。取而代之的是划分。因为自然对数大于以10为底的对数。
其次,根据keras api,在K.mean中应该有一个'axis=-1‘参数来计算均方误差。
因此,函数看起来像
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
发布于 2019-04-25 21:30:20
您不能在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))))
发布于 2021-12-17 17:57:45
来自tensorflow的tf.image.psnr
。https://www.tensorflow.org/api_docs/python/tf/image/psnr只需根据您的需要更改max_val
即可。
https://stackoverflow.com/questions/55844618
复制相似问题