2017-01-11 10 views
4

예를 들어 CNIST는 MNIST 데이터 세트 (Keras를 사용하여 작성된 코드)에서 숫자를 예측하려고합니다. 그것에는 softmax 층을 형성하는 10 개의 산출이있다. 출력 중 하나만 참일 수 있습니다 (0에서 9 사이의 각 숫자와 독립적으로).두 개 이상의 출력을 활성화 할 수있는 경우 softmax 레이어 대체는 무엇입니까?

Real: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 
Predicted: [0.02, 0.9, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01] 

softmax의 정의로 인해 예상 값의 합이 1.0입니다.

내가 여러 범주에 빠질 수있는 객체를 분류해야 할 곳의 내가 작업을 있다고 가정 해 봅시다 :
Real: [0, 1, 0, 1, 0, 1, 0, 0, 0, 1] 

그래서 내가 다른 방법으로 정상화 할 필요가있다.

Predicted: [0.1, 0.9, 0.05, 0.9, 0.01, 0.8, 0.1, 0.01, 0.2, 0.9] 

각 숫자는 해당 오브젝트가 특정의 카테고리에 떨어지는 확률이고 : I는 범위의 값을 부여 기능해야 [0, 1] 어느 합 I 그런 것이 필요 큰 1

초과 할 수있다. 그런 다음 주어진 객체가 속하는 범주를 구별하기 위해 0.5와 같은 임계 값을 사용할 수 있습니다.

다음 질문이 나타납니다

  1. 그래서 어느 활성화 기능이 사용될 수있다?
  2. Keras에이 기능이 이미있을 수 있습니까?
  3. 이 경우 예측할 다른 방법을 제안 할 수 있습니까?
+0

가 보이는 : http://datascience.stackexchange.com/questions/13815/how-to-deal-with-item- 속한 카테고리보다 더 많은 것 그들은 단지 시그마이드 레이어를 사용하도록 제안합니다. – ZFTurbo

+0

그런 경우에도 Sigmoid 레이어를 사용합니다. –

+0

그 다음 다른 질문이 생깁니다 : loss = 'categorical_crossentropy'의 사용은 적절한 결과를 제공 할 것인가 아닌가? – ZFTurbo

답변

5

귀하의 문제가 멀티 라벨 분류 중 하나이며, Keras의 맥락에서이 여기에 예를 들어 설명 : https://github.com/fchollet/keras/issues/741

keras에 대한 짧은 제안 된 솔루션에서 softmax를 교체하는 것입니다 레이어를 Sigmoid 레이어로 만들고 비용 함수로 binary_crossentropy를 사용하십시오.

스레드에서 예 :

몇 가지 유용한 의견은 여기에서 찾을 수 있습니다처럼
# Build a classifier optimized for maximizing f1_score (uses class_weights) 

clf = Sequential() 

clf.add(Dropout(0.3)) 
clf.add(Dense(xt.shape[1], 1600, activation='relu')) 
clf.add(Dropout(0.6)) 
clf.add(Dense(1600, 1200, activation='relu')) 
clf.add(Dropout(0.6)) 
clf.add(Dense(1200, 800, activation='relu')) 
clf.add(Dropout(0.6)) 
clf.add(Dense(800, yt.shape[1], activation='sigmoid')) 

clf.compile(optimizer=Adam(), loss='binary_crossentropy') 

clf.fit(xt, yt, batch_size=64, nb_epoch=300, validation_data=(xs, ys), class_weight=W, verbose=0) 

preds = clf.predict(xs) 

preds[preds>=0.5] = 1 
preds[preds<0.5] = 0 

print f1_score(ys, preds, average='macro') 
+0

감사합니다. 정확히 내가 필요로하는 것처럼 보입니다! – ZFTurbo