Размер y_true в пользовательской функции потерь Keras - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь написать пользовательскую функцию потерь для U- net в Керасе, и цель этого состоит в том, чтобы вычислить не только среднеквадратичную ошибку (MSE) предсказанного изображения и истинного изображения, но также и MSE их градиентов.

Я не уверен, что это нормально, но форма y_true в моей настраиваемой функции потерь (Нет, Нет, Нет, Нет), хотя из следующей ссылки , Я ожидаю, что размер y_true будет идентичен y_pred, и в моем случае он должен иметь размер: (batch_size, 128, 256, 3).

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

import tensorflow.keras.backend as K
# Encouraging the predicted image to match the label not only in image domain, but also in gradient domain
def keras_customized_loss(batch_size, lambda1 = 1.0, lambda2 = 0.05):
    def grad_x(image):
        out = K.zeros((batch_size,)+image.shape[1:4])
        out = K.abs(image[0:batch_size, 1:, :, :] - image[0:batch_size, :-1, :, :])
        return out

    def grad_y(image):
        out = K.zeros((batch_size,)+image.shape[1:4])
        out = K.abs(image[0:batch_size, :, 1:, :] - image[0:batch_size, :, :-1, :])
        return out

    #OBS: Now y_true has size: (None, None, None, None), figure out how to solve it
    def compute_loss(y_true, y_pred):
        pred_grad_x = grad_x(y_pred)
        pred_grad_y = grad_y(y_pred)
        true_grad_x = grad_x(y_true)
        true_grad_y = grad_y(y_true)
        loss1 = K.mean(K.square(y_pred-y_true)) 
        loss2 = K.mean(K.square(pred_grad_x-true_grad_x))
        loss3 = K.mean(K.square(pred_grad_y-true_grad_y))

        return (lambda1*loss1+lambda2*loss2+lambda2*loss3)

    return compute_loss

model.compile(optimizer='adam', loss = keras_customized_loss(BATCH_SIZE), metrics=['MeanAbsoluteError'])

1 Ответ

0 голосов
/ 09 марта 2020

None означает, что он принимает переменные размеры.
Таким образом, ваши собственные потери могут быть очень гибкими.

Реальным размером, естественно, будет размер пакета данных, который вы передаете fit.
Если ваши данные имеют форму (samples, 128,256,3), вам не о чем беспокоиться.

Но в вашем коде много ненужных вещей, вы можете просто:

def keras_customized_loss(lambda1 = 1.0, lambda2 = 0.05):
    def grad_x(image):
        return K.abs(image[:, 1:] - image[:, :-1])

    def grad_y(image):
        return K.abs(image[:, :, 1:] - image[:, :, :-1])

    def compute_loss(y_true, y_pred):
        pred_grad_x = grad_x(y_pred)
        pred_grad_y = grad_y(y_pred)
        true_grad_x = grad_x(y_true)
        true_grad_y = grad_y(y_true)
        loss1 = K.mean(K.square(y_pred-y_true)) 
        loss2 = K.mean(K.square(pred_grad_x-true_grad_x))
        loss3 = K.mean(K.square(pred_grad_y-true_grad_y))

        return (lambda1*loss1+lambda2*loss2+lambda2*loss3)

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