akaSonny

[Tensorflow/Keras] Custom loss function 만들기 본문

Study (Programming)/Tensorflow-Keras

[Tensorflow/Keras] Custom loss function 만들기

Jihyeoning 2022. 9. 30. 14:34

딥러닝 모델을 만들다 보면 내장되어 있는 함수 말고 내가 원하는 loss function을 만들어야 할 때가 있다.

사실 꼭 필요하진 않지만,, 모델의 목적에 따라 바꿔쓸 때가 생긴다. 뭐 경진대회 용이면 대회에 쓰는 score를 loss function으로 사용해서 그 점수가 좋아지도록 학습 방향을 설정한다던가.. 할때 ?

 

가장 먼저 큰 틀은 다음과 같다.

import tensorflow.keras.backend as K

def custom_loss_function(y_true, y_pred):
    loss =  ...
    return loss

원하는 함수를 위와 같이 만들어준다. 이 때 입력인자는 실제값과 예측값을 순서대로 받기! 변수명은 상관없음

 

그리고 모델을 complie 할 때, loss 부분에 이 함수를 넣어주면 된다!

model.compile(optimizer=optimizer, loss=custom_loss_function)

 

이제 예시를 들어보자!

내장 함수에는 mean square error (MSE) 는 있지만, root mean square error (RMSE) 는 없다. 

우리 분야는 평가지표를 RMSE를 많이 쓰기 때문에, 나는 학습시킬 때 RMSE를 loss function으로 사용하는편 (뭐 물론 mse에 루트 씌운 거랑 같지만 .. 혹시 모르니 ㅎㅎ) 

 

RMSE custom loss function

import tensorflow.keras.backend as K

def rmse(y_true, y_pred):
    loss =  K.sqrt(K.mean(K.square(y_pred - y_true))) 
    return loss

 

그리고 나는 Weighted RMSE (WRMSE) 를 정말 많이 쓴다. 

그냥 RMSE는 평균을 구하는 것이면, WRMSE는 값에 따라, 혹은 예측 시점에 따라 가중치를 달리 해서 RMSE값에 곱해준다.

 

Weighted RMSE loss function

import tensorflow.keras.backend as K

def weighted_rmse(y_true, y_pred):
    weight = ... 
    loss = K.square(y_pred - y_true)  
    loss = loss * weight                   
    loss = K.sqrt(K.sum(loss))
    
    return loss