나는 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 시대를하지만, 유망 보인다 여기를 참조하십시오.
가능성이 매우 낮거나 유효하지 않은 특정 각도가 있습니까? 그렇다면이 각도를 0으로 놓을 수 있습니다 .... –