Keras backend K.switch для ошибки функции потери - PullRequest
0 голосов
/ 07 января 2020

Я хочу реализовать пользовательскую функцию потерь в keras, используя keras.backend.switch для условного оператора, я получаю эту ошибку и действительно не знаю, как ее решить, '' '

from keras import backend as K 
#q_low and q_high are parameters
def quantile_loss(q_low,q_high, y_p, y):
    e = y_p-y

    loss_low = K.mean(K.maximum(q_low*e, (q_low-1)*e))
    loss_high = K.mean(K.maximum(q_high*e, (q_high-1)*e))

    margin = 45 #constant number
    margin_f = K.cast(margin,'float32')
    cond = K.greater_equal(margin_f,y)
    loss = K.switch(cond,loss_low,loss_high)

    return loss 

'' ', и это ошибка : «Ошибка ValueEr: ранг condition должен быть меньше или равен рангу then_expression и else_expression. ndim (условие) = 2, ndim (then_expression ) = 0 "Я ценю вашу помощь.

1 Ответ

0 голосов
/ 08 января 2020

Глядя на документацию по переключателю , мы видим, что эта ошибка ValueError возникает, когда ранг условия больше, чем ранг выражений. Насколько я знаю, switch работает, проверяя значение условия в каждом измерении, а затем применяет соответствующий вывод.

В вашем случае для cond задан тензор с тем же размером, что и для y, тогда как loss_low и loss_high - это оба значения max, что означает, что они имеют размерность 1, если у вас значение ay с размером больше 1, вы вызовете эту ошибку.

Я не могу точно сказать из вашего кода, что именно вы пытаюсь сделать, но позвольте мне предложить следующий фрагмент кода на основе вашего кода.

from keras import backend as K 
#q_low and q_high are parameters
def quantile_loss(q_low,q_high, y_p, y):
    e = y_p-y

    loss_low = K.repeat(K.mean(K.maximum(q_low*e, (q_low-1)*e)), y.shape[0])
    loss_high = K.repeat(K.mean(K.maximum(q_high*e, (q_high-1)*e)), y.shape[0])

    margin = 45 #constant number
    margin_f = K.cast(margin,'float32')
    cond = K.greater_equal(margin_f,y)
    loss = K.switch(cond,loss_low,loss_high)

    return loss 

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

...