2017-09-22 8 views
0

나는 keras/tensorflow를 사용하여 방위각을 예측하려고합니다. y_true 범위는 0-359이지만, 랩핑하고 그 범위를 벗어나는 예측을 처리하는 손실 함수가 필요합니다. 내가 모듈 부문 tf.mod() 또는 %의 종류를하려고 할 때 불행하게도, 난 ... 360도 예측을위한 케라 손실 함수

LookupError: No gradient defined for operation 'FloorMod' (op type: FloorMod) 

그래서 나는 다음과 같이이 문제를 해결 일 것 같은데 ... 오류가 발생

def mean_squared_error_360(y_true, y_pred): 
    delta = K.minimum(K.minimum(K.abs(y_pred - y_true), 
           K.abs(y_pred - (360+y_true))), 
           K.abs(y_true - (360+y_pred))) 
    return K.mean(K.square(delta), axis=-1) 

def rmse_360(y_true, y_pred): 
    return K.sqrt(mean_squared_error_360(y_true, y_pred)) 


model.compile(loss=mean_squared_error_360, 
       optimizer=rmsprop(lr=0.0001), 
       metrics=[rmse_360]) 

이 다음과 같은 경우를 처리 ... 나는 예측을 가로 질러 오지 않았다 < 0, 그래서 내가 주소 아니에요.

y = 1 y_pred = 361 err = 0 
y = 359 y_pred = 1 err = 2 
y = 359 y_pred = 361 err = 2 

질문

  • 이 투박한 느낌; 똑똑한 해결책이 있습니까?
  • 직관적으로, mean_squared_error와 root_mean_squared_error를 사용하는 것 사이의 결과에는 차이가 없다고 생각합니다 ... 그라디언트는 다를 수 있지만 동일한 최적의 가중치로 둘 다 해결됩니다. 맞습니까? 다른 하나를 선택해야 할 이유가 있습니까? 나는 mse가 rmse보다 약간 간단하다고 생각 하겠지만, 그것은 사소한 것이어야한다. 나는 둘 다 시도해 보았고, rmse를 사용하면 'mse보다 더 질서있는 혈통처럼 느껴진다. ... 더 많은 주위를 뛰어 넘는 제곱 오류의 크기에 대해 뭔가가 있는가?

미리 감사드립니다.

어떤 이유 ... 내 원래의 MSE는 트레이닝 세트를 맞는 것 같았다 편집

하지만, 검증 세트는 몇 신 (新) 시대 이후에 실제 개선하지 않고, 시대에 꽤 시끄러운 시대를 보였다. rmse는 더 질서있는 혈통처럼 보였습니다 ... 손실이 몇 십여 시대 동안 개선 된 후에 inf에 갔을 때까지. 나는 손실 함수보다 더 큰 이슈가있을 수 있습니다.

편집 2 - 내 구현을 추가는 계전기

아 아래 답변 @Patwie! 당연하지!! 불행히도 tf.atan2()가없는 tf v1.0을 사용하고 있습니다. 이상하게도 저는 tf 저장소에서 atan2 구현을 찾을 수 없었습니다. 그러나 문제 6095에서 asos-ben의 제안이 트릭을 수행한다고 생각합니다. 테스트 실행에의 https://github.com/tensorflow/tensorflow/issues/6095

def atan2(x, y, epsilon=1.0e-12): 
    x = tf.where(tf.equal(x, 0.0), x+epsilon, x) 
    y = tf.where(tf.equal(y, 0.0), y+epsilon, y)  
    angle = tf.where(tf.greater(x,0.0), tf.atan(y/x), tf.zeros_like(x)) 
    angle = tf.where(tf.logical_and(tf.less(x,0.0), tf.greater_equal(y,0.0)), tf.atan(y/x) + np.pi, angle) 
    angle = tf.where(tf.logical_and(tf.less(x,0.0), tf.less(y,0.0)), tf.atan(y/x) - np.pi, angle) 
    angle = tf.where(tf.logical_and(tf.equal(x,0.0), tf.greater(y,0.0)), 0.5*np.pi * tf.ones_like(x), angle) 
    angle = tf.where(tf.logical_and(tf.equal(x,0.0), tf.less(y,0.0)), -0.5*np.pi * tf.ones_like(x), angle) 
    angle = tf.where(tf.logical_and(tf.equal(x,0.0), tf.equal(y,0.0)), tf.zeros_like(x), angle) 
    return angle 

# y in radians 
def rmse_360_2(y_true, y_pred): 
    return K.mean(K.abs(atan2(K.sin(y_true - y_pred), K.cos(y_true - y_pred)))) 

만 약 7 시대를하지만, 유망 보인다 여기를 참조하십시오.

+1

가능성이 매우 낮거나 유효하지 않은 특정 각도가 있습니까? 그렇다면이 각도를 0으로 놓을 수 있습니다 .... –

답변

1

내 의견을 대답으로 변환. 만약 정의 tf.atan2으로

tf.atan2(tf.sin(a - b), tf.cos(a - b)) 

하여 각도 차를 얻을라디안으로 두 개의 각도 A (한다), B (예측) 주어진 간격 -45, 45 도의 자동 차이를 제공한다.

따라서, 당신은 내가 Keras이 TensorFlow 코드를 이해하고 생각

tf.reduce_mean(tf.abs(tf.atan2(tf.sin(a - b), tf.cos(a - b)))) 

를 사용할 수 있습니다.