如果可以激活多个输出,softmax 层的替换是啥?

Posted

技术标签:

【中文标题】如果可以激活多个输出,softmax 层的替换是啥?【英文标题】:What is the replace for softmax layer in case more than one output can be activated?如果可以激活多个输出,softmax 层的替换是什么? 【发布时间】:2017-05-26 03:22:30 【问题描述】:

例如,我有 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 这样的阈值来区分给定对象所属的类别。

出现以下问题:

    那么可以使用哪个激活函数呢? 这个函数可能已经存在于 Keras 中了吗? 在这种情况下,您是否可以提出其他预测方法?

【问题讨论】:

看起来一些有用的 cmets 可以在这里找到:datascience.stackexchange.com/questions/13815/… 他们建议只使用 sigmoid 层。 在这种情况下我也会使用 sigmoid 层。 然后出现另一个问题:使用 loss='categorical_crossentropy' 会给出足够的结果吗? 【参考方案1】:

您的问题是多标签分类之一,在 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')

【讨论】:

谢谢。看起来正是我需要的!

以上是关于如果可以激活多个输出,softmax 层的替换是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Softmax MLP 分类器 - 在隐藏层中使用哪个激活函数?

深度学习入门之神经网络

在 tf.keras 中使用 softmax 作为顺序层和使用 softmax 作为密集层的激活函数有啥区别?

神经网络中回归模型输出层的激活函数

输出层的 softmax 和 sigmoid 函数

如何在 Tensorflow 中用 Logistic 层替换 Softmax 输出层?