如果可以激活多个输出,softmax 层的替换是什么?
What is the replace for softmax layer in case more than one output can be activated?
例如,我有 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 中已经存在此功能?
- 在这种情况下,您可以提出一些其他的预测方法吗?
您的问题是多标签分类问题之一,在 Keras 的上下文中进行了讨论,例如,此处:https://github.com/fchollet/keras/issues/741
简而言之,在 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')
例如,我有 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 中已经存在此功能?
- 在这种情况下,您可以提出一些其他的预测方法吗?
您的问题是多标签分类问题之一,在 Keras 的上下文中进行了讨论,例如,此处:https://github.com/fchollet/keras/issues/741
简而言之,在 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')