2017-01-11 13 views
4

Например, у меня есть CNN, который пытается предсказать числа из набора данных MNIST (код написан с использованием Keras). Он имеет 10 выходов, которые образуют слой softmax. Только один из выходов может быть истинным (независимо для каждой цифры от 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] 

Сумма предсказывал равна 1,0 в связи с определением SoftMax.

Скажем, у меня есть задание, где мне нужно классифицировать некоторые объекты, которые могут упасть в несколько категорий:

Real: [0, 1, 0, 1, 0, 1, 0, 0, 0, 1] 

Так что мне нужно нормализовать каким-либо другим способом. Мне нужна функция, которая дает значение на интервале [0, 1] и, сумма может быть больше 1.

мне нужно что-то вроде этого:

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

Каждое число является вероятность того, что объект попадает в данную категорию. После этого я могу использовать некоторый порог, равный 0,5, чтобы различать категории, в которых данный объект падает. появляются

следующие вопросы:

  1. Итак, какие функции активации можно использовать для этого?
  2. Может быть, эта функция уже существует в Keras?
  3. Может быть, вы можете предложить другой способ предсказать в этом случае?
+0

Похоже, некоторые полезные комментарии можно найти здесь: http://datascience.stackexchange.com/questions/13815/how-to-deal-with-item- принадлежащие к более чем одной категории Они предлагают использовать только сигмоидный слой. – ZFTurbo

+0

Я бы тоже использовал сигмоидный слой. –

+0

Возникает и другой вопрос: будет ли использование потери = 'категориальным_crossentropy' дать адекватный результат или нет? – ZFTurbo

ответ

5

Ваша проблема одна из классификации нескольких этикеток, а также в контексте Keras обсуждается, например, здесь: https://github.com/fchollet/keras/issues/741

Короче предложенное решение для него в keras должен заменить SoftMax слой с сигмовидным слоем и используйте функцию 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