Ошибки при создании пользовательской функции потери - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь создать свою собственную функцию потерь следующим образом

    import numpy as np
    from keras import backend as K

    def MyLoss(self, x_input, x_reconstruct):

        a = np.copy(x_reconstruct)
        a = np.asarray(a, dtype='float16')       
        a = np.floor(4*a)/4
        return K.mean(K.square(a - x_input), axis=-1)`

В компиляции написано ValueError: установка элемента массива с последовательностью

И x_input, и x_reconstruct являются [m, n, 1] np массивами. Последняя строка кода фактически копируется непосредственно из встроенной в Keras функции потери MSE.

Кроме того, я предполагаю, что потери рассчитываются для каждого образца. Если размеры входного и восстановленного входных данных равны [m, n, 1], результатом встроенных потерь Keras также будет размер матрицы [m, n]. Так почему же он работает правильно?

Затем я попытался использовать функции np напрямую

    def MyLoss(self, x_input, x_reconstruct):        
        a = np.copy(x_reconstruct)
        a = np.asarray(a, dtype=self.precision)       
        a = np.floor(4*a)/4
        Diff = a - x_input
        xx = np.mean(np.square(Diff), axis=-1)
        yy = np.sum(xx)
        return yy

пока ошибка не устранена. Какую ошибку я сделал? Как написать код?

Заимствовав предложение у Подробно описать функцию пользовательского убытка в Керасе , я попытался выполнить

    def MyLoss(self, x_input, x_reconstruct):    
        if self.precision == 'float16':
            K.set_floatx('float16')
            K.set_epsilon(1e-4)
        a = K.cast_to_floatx(x_input)
        a = K.round(a*4.-0.5)/4.0
        return K.sum(K.mean(K.square(x_input-a), axis=-1))

Но такая же ошибка происходит

Ответы [ 2 ]

3 голосов
/ 14 июня 2019

Вы не можете использовать numpy массивы в вашей потере.Вы должны использовать TensorFlow из Kers внутренних операций.Попробуйте это возможно:

import tensorflow as tf
import keras.backend as K

def MyLoss(x_input, x_reconstruct):
    a = tf.cast(x_input, dtype='tf.float16')       
    a = tf.floor(4*a)/4
    return K.mean(K.square(a - x_input), axis=-1)
1 голос
/ 14 июня 2019

Я нашел ответ сам, и позвольте мне поделиться им здесь

Если я напишу код, подобный этому

    def MyLoss(self, y_true, y_pred):    
        if self.precision == 'float16':
            K.set_floatx('float16')
            K.set_epsilon(1e-4)
        return K.mean(K.square(y_true-K.round(y_pred*4.-0.5)/4.0), axis=-1)

Это работает.Я думаю, что хитрость заключается в том, что я не могу использовать 'K.cast_to_floatx (y_true)'.Вместо этого просто используйте y_true напрямую.Я до сих пор не понимаю, почему ...

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