Как реализовать пользовательскую функцию стоимости в керасе? - PullRequest
1 голос
/ 04 апреля 2020

У меня есть следующая функция стоимости = argmin L1 + L2, где L1 - средняя квадратическая ошибка, а L2 - -λ Суммирование (Квадрат ((y) x (z))), где y - это прогнозируемое выходное изображение, а z - это заданное входное изображение для модели. Поэлементное умножение y и z, а затем взять его квадрат. λ - это компромиссный параметр между L1 и L2. Я не уверен, как реализовать в, я сделал это следующим образом

def custom_loss(i):

        def loss(y_true, y_pred):

            y_true=K.cast(y_true, dtype='float32')
            y_pred=K.cast(y_pred, dtype='float32')
            input_image=K.cast(i, dtype='float32')

            mul=tf.math.multiply(input_image,y_pred)
            L1=K.mean(K.square(mul),axis=1)
            L2=K.mean(K.square(y_pred - y_true), axis=-1)
            closs=L1-L2
            return closs

        return loss

1 Ответ

0 голосов
/ 07 мая 2020

Чтобы разбить ваш вопрос по частям

, где L1 - средняя квадратическая ошибка

Таким образом, L1 = np.square(np.subtract(y_true,y_pred)).mean()

L2 - это -λ Суммирование (Квадрат ((y) x (z))), где y - прогнозируемое выходное изображение, а z - заданное входное изображение для модели. Поэлементное умножение y и z с последующим взятием его квадрата

Таким образом, L2 = np.sum(np.concatenate(np.square(np.multiply(y_true,y_pred)))). Вы понимаете, что L2 будет очень большим числом для потери.

Подводя итог, вот как выглядит ваша функция потери -

def custom_loss(y_true,y_pred):
    def loss(y_true, y_pred):
        y_true = img_to_array(y_true)
        y_pred = img_to_array(y_pred)
        L1 = np.square(np.subtract(y_true,y_pred)).mean()
        L2 = np.sum(np.concatenate(np.square(np.multiply(y_true,y_pred))))
        loss=L1-L2
        return loss

Я написал здесь простой код, чтобы загрузить изображение в виде y_true и обрезать центральную часть для y_pred и выполнить упомянутую вами потерю (не имеет большого значения, поскольку значение слишком большое) .

Код -

import tensorflow as tf
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array, array_to_img
from matplotlib import pyplot

# Load the image
y_true = load_img('/content/bird.jpg', target_size=(224, 224))

# Convert Image to array
image = img_to_array(y_true)

# Central crop image
image = tf.image.central_crop(image, np.random.uniform(0.50, 1.00))

# Resize to original size of image
image = tf.image.resize(image, (224, 224))

# convert the image to an array
y_pred = array_to_img(image)

# def custom_loss():
#     def loss(y_true, y_pred):
#         y_true = img_to_array(y_true)
#         y_pred = img_to_array(y_pred)
#         L1 = np.square(np.subtract(y_true,y_pred)).mean()
#         L2 = np.sum(np.concatenate(np.square(np.multiply(y_true,y_pred))))
#         loss=L1-L2
#         return loss

def loss(y_true, y_pred):
    y_true = img_to_array(y_true)
    y_pred = img_to_array(y_pred)
    L1 = np.square(np.subtract(y_true,y_pred)).mean()
    L2 = np.sum(np.concatenate(np.square(np.multiply(y_true,y_pred))))
    loss=L1-L2
    return loss

x = loss(y_true,y_pred)
print(x)

Выход -

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