softmax 和 sigmoid 在多类分类中给出相同的结果
softmax and sigmoid are giving same results in multiclass classification
我正在构建一个 lstm 模型。我使用 softmax 和 sigmoid 激活函数测试了我的模型。在文档中,sigmoid 用于二元分类,softmax 用于多类分类。但就我而言,两者都给出了相同的结果。为什么会这样?
这是我的代码:
embedding_vecor_length = 128
max_length = 700
model = Sequential()
model.add(Embedding(len(tokenizer.word_index)+1, embedding_vecor_length, input_length=max_length))
model.add(Conv1D(filters=32, kernel_size=5, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=16, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Bidirectional(LSTM(64)))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
预测结果如下:
[[2.72062905e-02 1.47979835e-03 4.44446778e-04 1.60833297e-05
4.15672457e-06 3.20438482e-02 9.38653767e-01 1.41544719e-04
5.55426550e-06 4.47654566e-06]
[2.31099591e-01 1.71699154e-03 1.32052042e-02 4.70457249e-04
8.86382014e-02 2.65704724e-03 6.54215395e-01 7.50611164e-03
4.89178114e-04 1.89376965e-06]
[1.24909900e-01 8.73659015e-01 9.71468398e-06 1.66079029e-04
1.05203628e-06 4.14116839e-05 3.97000113e-05 6.98190925e-05
1.10231712e-03 9.84829512e-07]
S 型函数可以让您对所有 class 个、其中一些或 none 个有很高的概率。示例:class在胸部 X 光图像中显示疾病。该图像可能包含肺炎、肺气肿、and/or 癌症,或 none 这些发现。
softmax 强制输出 classes 的概率之和等于 1,因此为了增加特定 class 的概率,您的模型必须相应地降低至少一个其他 classes 的概率。示例:class 化 MNIST 手写数字数据集中的图像。一张数字的图片只有一个真实身份——图片不能同时是7和8。
因此,在您的情况下,如果模型良好,则使用 sigmoid 或 softmax 时预测不会有很大差异,softmax 强制预测总和为 1 sigmoid 不会这样做。
我正在构建一个 lstm 模型。我使用 softmax 和 sigmoid 激活函数测试了我的模型。在文档中,sigmoid 用于二元分类,softmax 用于多类分类。但就我而言,两者都给出了相同的结果。为什么会这样?
这是我的代码:
embedding_vecor_length = 128
max_length = 700
model = Sequential()
model.add(Embedding(len(tokenizer.word_index)+1, embedding_vecor_length, input_length=max_length))
model.add(Conv1D(filters=32, kernel_size=5, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=16, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Bidirectional(LSTM(64)))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
预测结果如下:
[[2.72062905e-02 1.47979835e-03 4.44446778e-04 1.60833297e-05
4.15672457e-06 3.20438482e-02 9.38653767e-01 1.41544719e-04
5.55426550e-06 4.47654566e-06]
[2.31099591e-01 1.71699154e-03 1.32052042e-02 4.70457249e-04
8.86382014e-02 2.65704724e-03 6.54215395e-01 7.50611164e-03
4.89178114e-04 1.89376965e-06]
[1.24909900e-01 8.73659015e-01 9.71468398e-06 1.66079029e-04
1.05203628e-06 4.14116839e-05 3.97000113e-05 6.98190925e-05
1.10231712e-03 9.84829512e-07]
S 型函数可以让您对所有 class 个、其中一些或 none 个有很高的概率。示例:class在胸部 X 光图像中显示疾病。该图像可能包含肺炎、肺气肿、and/or 癌症,或 none 这些发现。
softmax 强制输出 classes 的概率之和等于 1,因此为了增加特定 class 的概率,您的模型必须相应地降低至少一个其他 classes 的概率。示例:class 化 MNIST 手写数字数据集中的图像。一张数字的图片只有一个真实身份——图片不能同时是7和8。
因此,在您的情况下,如果模型良好,则使用 sigmoid 或 softmax 时预测不会有很大差异,softmax 强制预测总和为 1 sigmoid 不会这样做。