Чем заменить слой softmax, если можно активировать более одного выхода?

Например, у меня есть CNN, который пытается предсказать числа из набора данных MNIST (код, написанный с использованием Keras). Он имеет 10 выходов, которые образуют слой softmax. Только один из выходов может быть верным (независимо для каждого разряда от 0 до 9):

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. Может быть, эта функция уже существует в Керасе?
  3. Может быть, вы можете предложить какой-то другой способ прогнозирования в этом случае?

person ZFTurbo    schedule 11.01.2017    source источник
comment
Похоже, некоторые полезные комментарии можно найти здесь: datascience.stackexchange.com/questions/13815/ Они предлагают использовать только сигмовидный слой.   -  person ZFTurbo    schedule 11.01.2017
comment
В таком случае я бы также использовал сигмовидный слой.   -  person Sergii Gryshkevych    schedule 11.01.2017
comment
Тогда возникает другой вопрос: даст ли использование loss='categorical_crossentropy' адекватный результат или нет?   -  person ZFTurbo    schedule 11.01.2017


Ответы (1)


Ваша проблема относится к классификации с несколькими метками, и в контексте 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')
person ginge    schedule 11.01.2017
comment
Спасибо. Похоже, это именно то, что мне нужно! - person ZFTurbo; 11.01.2017