2017-12-15 2 views
1

케라 모델 (htber) 작성시 huber 손실을 사용하려고하지만 잘못된 결과를 얻고 있습니다. 잘못된 것으로 생각됩니다. 내 코드가 아래 있습니다.Keras의 Tensorflow Huber 손실 사용

model = Sequential() 
model.add(Dense(output_dim=64, activation='relu', input_dim=state_dim)) 
model.add(Dense(output_dim=number_of_actions, activation='linear')) 
loss = tf.losses.huber_loss(delta=1.0) 
model.compile(loss=loss, opt='sgd') 
return model 

답변

1

나는 정확히 같은 질문을했습니다. 허용되는 대답은 유사한 속성을 가질 수있는 logcosh을 사용하지만 정확히 후버 손실은 아닙니다. 다음은 Keras 용 후버 손실을 구현 한 방법입니다 (Tensorflow 1.5의 Keras를 사용하고 있음).

import numpy as np 
import tensorflow as tf 

''' 
' Huber loss. 
' https://jaromiru.com/2017/05/27/on-using-huber-loss-in-deep-q-learning/ 
' https://en.wikipedia.org/wiki/Huber_loss 
''' 
def huber_loss(y_true, y_pred, clip_delta=1.0): 
    error = y_true - y_pred 
    cond = tf.keras.backend.abs(error) < clip_delta 

    squared_loss = 0.5 * tf.keras.backend.square(error) 
    linear_loss = clip_delta * (tf.keras.backend.abs(error) - 0.5 * clip_delta) 

    return tf.where(cond, squared_loss, linear_loss) 

''' 
' Same as above but returns the mean loss. 
''' 
def huber_loss_mean(y_true, y_pred, clip_delta=1.0): 
    return tf.keras.backend.mean(huber_loss(y_true, y_pred, clip_delta)) 

손실 또는 손실의 평균을 줄이려면 위의 해당 기능을 사용하십시오.

+0

안녕하세요 @avejidah. 실제로 그들은 매우 유사합니다. Keras에서 Huber Loss에 대한 홍보가있었습니다. 당신은 그것을 여기에서 볼 수 있습니다. https://github.com/keras-team/keras/pull/6410. – hakaishinbeerus

+0

안녕하세요. 나는 그 (것)들이 유사하다는 것을 동의한다, 그러나 동일하지 않다. the-moliver와 Danielhiversen은 PR 코멘트에서 그 점을 지적하고 Keras가 가지고있는 손실 함수를 정확하게 반영하기 위해'huber'를'logcosh'로 개명했습니다. AFAIK, Keras는 여전히 Huber Loss를 가지고 있지 않으므로, 사용에 관심이있는 분들은 제 기능이 정확해야합니다. – avejidah

1

나는 케라의 손실을보고있었습니다. 분명히 logcosh는 huber 손실과 동일한 속성을 가지고 있습니다. 그들의 유사성에 대한 자세한 내용은 here을 참조하십시오.

관련 문제