Keras 손실 및 메트릭 값이 각각 동일한 기능과 일치하지 않습니다.
다음과 같은 사용자 지정 손실 기능과 함께 keras를 사용하고 있습니다.
def custom_fn(y_true, y_pred):
# changing y_true, y_pred values systematically
return mean_absolute_percentage_error(y_true, y_pred)
그런 다음 나는 전화 model.compile(loss=custom_fn)
하고model.fit(X, y,..validation_data=(X_val, y_val)..)
Keras는 모델 내역 을 저장 loss
하고 val_loss
있습니다. 온 전성 검사로 모델이 학습을 마치면 사용하고 model.predict(X_val)
있으므로 학습 custom_fn
된 모델을 사용하여 수동으로 유효성 검사 손실을 계산할 수 있습니다 .
이 콜백을 사용하여 최고의 시대로 모델을 저장하고 있습니다.
callbacks.append(ModelCheckpoint(path, save_best_only=True, monitor='val_loss', mode='min'))
따라서 이것을 계산 한 후 검증 손실은 val_loss
최고의 에포크의 keras 값 과 일치해야합니다 . 그러나 이것은 일어나지 않습니다.
이 문제를 파악하기위한 또 다른 시도로 다음과 같이합니다.
model.compile(loss=custom_fn, metrics=[custom_fn])
그리고 놀랍게도, val_loss
및 val_custom_fn
(도 일치하지 않는 loss
또는 loss_custom_fn
그 문제에 대해)입니다.
이건 내, 정말 이상하다 custom_fn
내장 본질적으로 keras '이다 mape
로 y_true
하고 y_pred
약간 조작. 여기서 무슨 일이 일어나고 있습니까?
추신 : 내가 사용하는 LSTM
레이어 는 레이어와 최종 Dense
레이어입니다. 하지만이 정보는 문제와 관련이 없다고 생각합니다. 또한 정규화를 하이퍼 파라미터로 사용하고 있지만 드롭 아웃은 사용하지 않습니다.
최신 정보
손실 함수 및 메트릭으로 custom_fn
내장 된 keras를 제거 하고 사용 하는 것도 다음 과 mape
같습니다.
model.compile(loss='mape', metrics=['mape'])
단순성을 위해 ModelCheckpoint
콜백을 제거하는 것은 동일한 효과를 갖습니다. val_loss
그리고 val_mape
각 시대에 대해 동일하지 않습니다 . 이것은 나에게 매우 이상합니다. 뭔가 빠졌거나 Keras 코드에 버그가 있습니다. 전자가 더 현실적 일 수 있습니다.
답변
이 블로그 게시물 은 keras가 유효성 검사 손실을 계산할 때 훈련에 사용 된 모든 정규화를 추가한다고 제안합니다. 그리고 분명히 선택한 메트릭을 계산할 때 정규화가 적용되지 않습니다. 이것이 질문에 명시된 바와 같이 선택한 손실 함수로 발생하는 이유입니다.
이것은 Keras에서 문서를 찾을 수없는 것입니다. 그러나 모든 정규화 하이퍼 파라미터를 제거 할 때 마다 val_loss
및 val_custom_fn
각 시대에서 정확히 일치 하기 때문에 유지되는 것 같습니다 .
쉬운 해결 방법은을 custom_fn
메트릭으로 사용 하고 .NET Framework val_custom_fn
보다 메트릭 ( )을 기반으로 최상의 모델을 저장하는 것입니다 val_loss
. 또는 각 에포크를 수동으로 반복하고 각 에포크 val_loss
를 훈련 한 후 수동으로 올바른 값을 계산합니다 . 후자 custom_fn
는 메트릭과 손실 함수로 둘 다 포함 할 이유가 없기 때문에 더 의미가있는 것 같습니다 .
누군가가 도움이 될 Keras 문서에서 이에 대한 증거를 찾을 수 있다면.