2017-09-19 4 views
2

케 라스 버전 : 2.0.8Keras 메트릭 함수에서 axis = -1을 사용하는 이유는 무엇입니까?

일부 Keras 미터법 함수 및 손실 함수에서 축 = -1을 매개 변수로 사용하십시오. 예를 들어

:

def binary_accuracy(y_true, y_pred): 
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1) 

내 경우 : y_true의

모양 : y_pred의 (4,256,256,2)

모양 : (4,256,256,2)

그래서, binary_accuracy (y_true, y_pred)는 스칼라 텐서 대신 shape = (4,256,256)의 텐서를 반환해야합니다.

그러나 통계 함수로 사용 binary_accuracy 때 :

model.compile(optimizer=adam, loss=keras.losses.binary_crossentropy, metrics=[binary_accuracy]) 

로그는 여전히 나에게 많은 혼란 스칼라로 binary_accuracy 인쇄합니다.

keras는 binary_accuracy 함수를 반환 할 때 특별한 기능을합니까?

신기원 300분의 11

0 - 손실 : 0.4158 - binary_accuracy : 0.9308 - val_loss : 0.4671 - val_binary_accuracy : 0.7767 여기

+0

왜 바이너리 정확도가 스칼라 대신에 텐서를 반환해야한다고 생각하십니까? –

+1

함수는 텐서를 반환하는 방식으로 구현되기 때문에. 스칼라의 텐서를 transoform하는 단계는 다른 곳에 숨겨져 있습니다. –

+0

@MatiasValdenegro binary_accuracy 함수에 따르면, 쉐이프 = (4,256,256) 인 텐서 (스칼라 텐서가 아닌)를 반환해야합니다. 테스트 해보니 사실입니다. – spider

답변

0

당신이 training.py 내부 찾고있는 내용은 다음과 같습니다

def weighted(y_true, y_pred, weights, mask=None): 
    """Wrapper function. 
    # Arguments 
     y_true: `y_true` argument of `fn`. 
     y_pred: `y_pred` argument of `fn`. 
     weights: Weights tensor. 
     mask: Mask tensor. 
    # Returns 
     Scalar tensor. 
    """ 
    # score_array has ndim >= 2 
    score_array = fn(y_true, y_pred) 
    if mask is not None: 
     # Cast the mask to floatX to avoid float64 upcasting in theano 
     mask = K.cast(mask, K.floatx()) 
     # mask should have the same shape as score_array 
     score_array *= mask 
     # the loss per batch should be proportional 
     # to the number of unmasked samples. 
     score_array /= K.mean(mask) 

    # apply sample weighting 
    if weights is not None: 
     # reduce score_array to same ndim as weight array 
     ndim = K.ndim(score_array) 
     weight_ndim = K.ndim(weights) 
     score_array = K.mean(score_array, axis=list(range(weight_ndim, ndim))) 
     score_array *= weights 
     score_array /= K.mean(K.cast(K.not_equal(weights, 0), K.floatx())) 
    return K.mean(score_array) 

미터법 함수는 score_array = fn(y_true, y_pred)에 의해 호출됩니다 (중첩 함수이고 fn은 외부 함수에 정의 됨). 이 배열은 마지막 행 return K.mean(score_array)에서 평균됩니다. 그렇기 때문에 텐서 대신 스칼라 메트릭을 볼 수 있습니다. 그 사이의 선은 필요한 경우 가면과 가중치를 도입하기위한 것입니다.

+0

이 답장은 왜 평균이 마지막 축에만 찍혔는지 확인하는 이유를 설명합니다.하지만 디자인이 왜 이와 같은지 확실하지 않습니다. 어쨌든 나중에 평균을 취하는 것처럼 들리므로 손실 함수에서 축 = -1로 평균을 취하는 이유는 무엇입니까? 손실 함수 정의에서 아무런 의미가 없다면 더 효율적이지 않습니까? – user121664

관련 문제