我正在尝试为我的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
请让我知道如何解决此问题
答案 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