Как рассчитать показатель PSNR в KERAS - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь вычислить метрику PSNR для моей модели convnet автоэнкодера keras. Однако я сталкиваюсь с ошибкой. Пожалуйста, помогите проверить и устранить проблему. Спасибо

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 (потеря = 'mse', метрика = [PSNR], оптимизатор = adm)

Файл "C: \ Users \ LW \ Anaconda3 \ envs \ tenorflow_demo \ lib \ site-packages \ keras \ engine \ training.py", строка 451, в компиляции handle_metrics (output_metrics)

Файл "C: \ Users \ LW \ Anaconda3 \ envs \ tenorflow_demo \ lib \ site-packages \ keras \ engine \ training.py", строка 420, в handle_metrics маска = маска [I])

Файл "C: \ Users \ LW \ Anaconda3 \ envs \ tenorflow_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

пожалуйста, дайте мне знать, как решить эту проблему

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Для меня ответ Матиаса Вальденегро не сработал.Я потратил почти день, чтобы выяснить, что не так с моей моделью, но в конце концов я обнаружил, что функция, которую Вальденегро написал, неверна.

Вот что я изменил.
Во-первых, не умножайте 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
0 голосов
/ 25 апреля 2019

Нельзя использовать 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))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...