Если у меня есть входные данные в форме (32,256,256,3), и я хочу создать пользовательскую функцию потерь, повторяющую следующее уравнение в Keras - PullRequest
0 голосов
/ 29 мая 2019

Создание пользовательской функции потерь в кератах для y_pred и y_loss формы (32,256,256,3), где 32 - это размер пакета, а 3 - количество каналов изображения размера 256x256 и уравнения потерь:

equation

В данной статье дана функция потерь для нормалей поверхности: https://arxiv.org/pdf/1411.4734.pdf

def normal_loss_1 (y_true, y_pred):    
    y_true_flat = K.flatten(y_true)
    y_pred_flat = K.flatten(y_pred)
    #d = y_pred_flat * y_true_flat
    d = np.dot(y_pred_flat,y_true_flat)
    y_sum = K.sum(d)
    n_pixels = 256 * 256
    normal_output = y_sum/n_pixels
    normal_output = tf.reduce_mean(normal_output)
    return -normal_output

Я не получаю никакой ошибки с этим, но результат не такой, как ожидалось.Есть ли другой и лучший способ написать код?Любая помощь будет оценена.Заранее спасибо!

1 Ответ

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

Вы используете numpy для получения точечного произведения тензоров. Здесь y_true_flat и y_pred_flat являются тензорами. Вы должны либо использовать метод tensorflow.tensordot, либо метод tensorflow.keras.backend.dot, чтобы получить произведение двух тензоров. Поскольку эти тензоры являются векторами, tensorflow.matmul также может работать.

def normal_loss_1 (y_true, y_pred):    
    dim = tf.reduce_prod(tf.shape(y_true)[1:])
    y_true_flatten = tf.reshape(y_true, [-1, dim])
    y_pred_flatten = tf.reshape(y_pred, [-1, dim])
    d = tf.tensordot(y_pred_flatten,y_true_flatten, 1)
    y_sum = tf.reduce_sum(d, 1)
    n_pixels = 256 * 256
    normal_output = y_sum/n_pixels
    normal_output = tf.reduce_mean(normal_output)
    return -normal_output

Редактировать

K.flatten преобразует тензоры (y_true и y_pred) в векторы, и размер пакета исчезнет. Это означает, что вы не можете усреднить потери по партии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...