2017-05-23 6 views
2

시도 맞춤 손실 함수 (부드러운 L1 손실) keras에keras : 스무스 L1 손실

ValueError: Shape must be rank 0 but is rank 5 for 'cond/Switch' (op: 'Switch') with input shapes: [?,24,24,24,?], [?,24,24,24,?].

여기
from keras import backend as K 
import numpy as np 


def smooth_L1_loss(y_true, y_pred): 
    THRESHOLD = K.variable(1.0) 
    mae = K.abs(y_true-y_pred) 
    flag = K.greater(mae, THRESHOLD) 
    loss = K.mean(K.switch(flag, (mae - 0.5), K.pow(mae, 2)), axis=-1) 
    return loss 

답변

3

가 keras.backend 이용한 부드러운 L1 손실의 구현 이하와 같은

HUBER_DELTA = 0.5 
def smoothL1(y_true, y_pred): 
    x = K.abs(y_true - y_pred) 
    x = K.switch(x < HUBER_DELTA, 0.5 * x ** 2, HUBER_DELTA * (x - 0.5 * HUBER_DELTA)) 
    return K.sum(x) 
+0

감사합니다. 그러나 나는 여전히 오류가 있습니다 : ** ValueError : 도형은 계급 0이어야하지만 입력 도형으로 'cond/Switch'(op : 'Switch')에 대해 5 등급이어야합니다 : [?, 24,24,24 ,?], [ ?, 24,24,24,?] ** –

+0

@ yuanzhou 즉, 네트워크 출력 또는 대상이 잘못되었거나 호환되지 않는 모양을 가지고 있음을 의미합니다. –

+0

죄송합니다. 출력 및 타겟의 모양에 문제가 있다고 생각하지 않습니다. 다른 손실 기능을 사용하면 정상적으로 작동합니다. 오류는 사용자 지정된 smoothL1 만 사용하여 발생했습니다. –

1
def smoothL1(y_true, y_pred): 
    x = K.abs(y_true - y_pred) 
    if K._BACKEND == 'tensorflow': 
     import tensorflow as tf 
     x = tf.where(x < HUBER_DELTA, 0.5 * x ** 2, HUBER_DELTA * (x - 0.5 * HUBER_DELTA)) 
     return K.sum(x) 
+0

백엔드가 Tensorflow 인 경우 K.switch 대신 tf.where해야합니다. – jasonYu

관련 문제