2017-05-23 5 views
2

versuchen, wie Verlustfunktion (glatter L1 Verlust) in keras anpassen unterkeras: Glatt L1 Verlust

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 

Antwort

3

Hier ist eine Implementierung des Glatter L1 Verlustes mit keras.backend:

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

Vielen Dank. Aber ich habe immer noch den Fehler: ** ValueError: Shape muss Rang 0 sein, ist aber Rang 5 für 'cond/Switch' (op: 'Switch') mit Eingabeformen: [?, 24,24,24,?], [ ?, 24,24,24,?]. ** –

+0

@yuanzhou Das bedeutet, dass die Netzwerkausgabe oder Ihre Ziele falsche/inkompatible Formen haben. –

+0

Sorry, ich denke nicht, dass es das Problem mit der Form der Ausgabe und Ziele ist, wenn ich andere Verlustfunktion verwende, funktioniert es gut. Der Fehler trat nur unter Verwendung der angepassten smoothL1 auf. –

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

Wenn das Backend Tensorflow ist, sollten Sie tf.where statt K.switch – jasonYu