如果可以激活多个输出,softmax层的替代品是什么?

时间:2017-01-11 11:02:18

标签: keras conv-neural-network mnist 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]

由于softmax的定义,预测总和等于1.0。

让我们说我有一个任务,我需要对一些可能属于几个类别的对象进行分类:

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. 在这种情况下,您可以提出其他预测方法吗?

1 个答案:

答案 0 :(得分:6)

您的问题是多标签分类之一,在Keras的上下文中,例如,这里讨论:enter image description here

简而言之,keras中建议的解决方案是用sigmoid层替换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')