>

맞춤 가중치 MSE 손실 기능이 필요합니다. keras.backend에서 정의했습니다

from keras import backend as K
def weighted_loss(y_true, y_pred):
    return K.mean( K.square(y_pred - y_true) *
    K.exp(-K.log(1.7) * (K.log(1. + K.exp((y_true - 3)/5 ))))      
    ,axis=-1  )

그러나 테스트 실행은 리턴합니다

   weighted_loss(1,2)
ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("Exp_37:0", shape=(), dtype=float32)' 

또는

   weighted_loss(1.,2.)
ZeroDivisionError: integer division or modulo by zero  

여기서 내가 저지른 실수가 궁금합니다.

  • 답변 # 1

    Tensorflow를 사용하든 Theano가 질문과 관련이 없는지 여부. 용어가 당신을 혼동하는 경우 구글은 '텐서'의 의미.

    Keras 자체 손실 함수 테스트가 어떻게 구현되었는지 살펴보십시오 :

    def test_metrics():
        y_a = K.variable(np.random.random((6, 7)))
        y_b = K.variable(np.random.random((6, 7)))
        for metric in all_metrics:
            output = metric(y_a, y_b)
            print(metric.__name__)
            assert K.eval(output).shape == (6,)
    
    

    float 또는 int를 텐서 계산에 공급할 수는 없습니다. K.eval을 사용하여 원하는 결과를 얻을 수도 있습니다.

    따라서 함수와 비슷한 것을 시도해보십시오 :

    from keras import backend as K
    import numpy as np
    y_a = K.variable(np.random.random((6, 7)))
    y_b = K.variable(np.random.random((6, 7)))
    output = weighted_loss(y_a,y_b)
    result = K.eval(output)
    
    

    keras.backend에서 커스텀 함수를 정의 할 필요가 없습니다. 나중에 Keras를 업데이트하기로 결정하면 어떻게 되나요?

    대신 자신의 코드에서 다음을 수행 할 수 있습니다 : 손실 함수를 반환하는 함수 정의

    def weighted_loss(y_true, y_pred):
            return K.mean( K.square(y_pred - y_true) * K.exp(-K.log(1.7) * (K.log(1. + K.exp((y_true - 3)/5 )))),axis=-1  )
    
    

    손실 함수를 사용하여 모델을 컴파일하려면 다음을 수행하십시오.

    model.compile(loss = weighted_loss)
    
    

    가중치가 일부 입력에 의존하는보다 일반적인 손실 함수를 정의하려는 경우 함수를 래핑해야합니다. 예를 들면 다음과 같습니다.

    def get_weighted_loss(my_input):
        def weighted_loss(y_true, y_pred):
            return K.mean( K.square(y_pred - y_true) * K.exp(-K.log(1.7) * (K.log(1. + K.exp((y_true - 3)/my_input )))),axis=-1  )
        return weighted_loss
    
    

    손실 함수를 사용하여 모델을 컴파일하려면 다음을 수행하십시오.

    model.compile(loss = get_weighted_loss(5))
    
    

관련 자료

  • 이전 python - 특정 규칙으로 배열의 요소를 인쇄
  • 다음 logging - API 호출을 사용하여 gcloud 빌드 로그를 얻을 수 있습니까?