2017-02-08 3 views
8

나는 이것이 바보 같은 질문이라고 확신한다. 그러나 나는 다른 곳에서는 그것을 찾을 수 없다. 그래서 나는 여기서 그것을 물어볼 것이다.시맨틱 세분화를위한 크로스 엔트로피 손실 Keras

나는 7 개의 레이블이있는 kern의 cnn (unet)을 사용하여 의미 이미지 분할을하고 있습니다. 따라서 각 이미지의 내 레이블은 theano 백엔드를 사용하여 (7, n_rows, n_cols)입니다. 따라서 각 픽셀의 7 개 레이어에 걸쳐 한 번 핫 인코딩됩니다. 이 경우 카테고리 간 엔트로피를 사용하는 올바른 오류 함수가 있습니까? 저에게 그런 식으로 보이지만 네트워크는 이진 교차 엔트로피 손실로 더 잘 배우는 것처럼 보입니다. 누군가가 왜 그것이 될 것이며, 원칙적인 목적이 무엇인지에 대해 밝힐 수 있습니까?

답변

10

마지막 엔트로피에서 sigmod 활성화와 함께 이진 교차 엔트로피 손실을 사용해야하며 반대 예측을 심각하게 부과합니다. 산출물이 1 핫 코드이고 예상 값의 합이 1이되어야한다는 점을 고려하지 않습니다. 그러나 잘못 예측하면 모델을 심각하게 처벌하는 것이 적절하게 분류되는 것을 배웁니다.

이제는 하나의 핫 코드를 시행하려면 범주 간 교차 엔트로피를 사용하여 softmax 활성화를 사용하십시오. 이것이 당신이 사용해야하는 것입니다.

이제 Keras는 각 픽셀에서 softmax를 지원하지 않으므로 문제는 softmax입니다. 대략가는

가장 쉬운 방법은 (7 n_rows, n_cols) (* n_rows n_cols 7) 층을 사용 Reshape로 바꿀 다음 Permute 층을 사용하고 사이즈의 순열이다. 그런 다음 softmax 활성화 계층을 추가하고 교차 복사 손실을 사용할 수 있습니다. 데이터도 적절하게 재구성해야합니다.

def depth_softmax(matrix): 
    sigmoid = lambda x: 1/(1 + K.exp(-x)) 
    sigmoided_matrix = sigmoid(matrix) 
    softmax_matrix = sigmoided_matrix/K.sum(sigmoided_matrix, axis=0) 
    return softmax_matrix 

및 람다 층으로 사용 : tfimage_dim_ordering 후 사용

model.add(Deconvolution2D(7, 1, 1, border_mode='same', output_shape=(7,n_rows,n_cols))) 
model.add(Permute(2,3,1)) 
model.add(BatchNormalization()) 
model.add(Lambda(depth_softmax)) 

경우이 방법을 수행 할 수 있습니다

그렇게하는 다른 방법은 깊이 softmax를 구현하는 것 Permute 레이어가 있습니다.

자세한 내용은 here을 참조하십시오.

+0

매우 자세히 답변 해 주셔서 감사합니다. 나는 모양을 바꿔서 softmax와 categorical cross-entropy로 갔다. 속도 나 최종 정확도와 관련하여 두 가지 방법간에 상당한 성능 차이가있을 것으로 기대하십니까? 다시 한 번 감사드립니다! – TSW

+0

본인은이 시나리오를 직접 작성하지 않았지만 두 가지를 모두 확인할 수 있습니다. 또한 시도 할 수있는 또 다른 방법은 최종 레이어를 '시그 모이 드'및 이진 크로스 엔트로피 손실로 모델을 생성하고 일단 교육이 완료되면 최상위 레이어와 끝을 'softmax'로 대체하고 카테고리 크로스 엔트로피로 재 훈련합니다. 두 번째 교육은 빠르게 수렴하지만 전체적으로 교육 시간이 단축되고 더 나은 정확성을 보일 것입니다. – indraforyou

+0

안녕하세요 indraforyou, 나는 또한 의미 론적 분할 사례를 연구 중입니다. 마스크 된 이미지는 (1, n_rows, n_cols)로 표현됩니다. 이 경우 Sigmoid 및 Binary Cross-Entrophy를 사용할 수 있습니까? 포함될 특정 절차가 있습니까? – user297850

관련 문제