2017-05-23 20 views
2

ここ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に損失関数(平滑L1損失)をカスタマイズしてみ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

関連する問題