Keras 多类分类器概率为 0 和 1 值



我正在实现一个分类器来识别 3 种不同类型的图像,我的最后一层有 3 个具有 sigmoid 激活的神经元

from keras.model import Sequential
from keras.layers import Conv2D, MaxPooling2D, BatchNormalization, Dropout, Flatten, Dense
model = Sequential()
model.add(Conv2D(16, kernel_size=(3, 3), activation='relu', 
input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())
model.add(Dropout(0.2))
# more conv layers
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(3, activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(), metrics=['accuracy'])

训练集标签使用一种热编码,3 个类别中的每一个都有丰富的训练示例。

但是当我在测试集上运行model.predict(X)时,前 10 个输出是

[[0. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]
[0. 1. 1.]
[1. 1. 1.]
[0. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]

model.predict()应该输出概率,每行的总和应该为 1,但在实际结果中,有时每个类别的概率为 1。有谁知道为什么概率会这样出现?

在最后一层使用softmax而不是sigmoid

model.add(Dense(3, activation='softmax'))

对于多类分类,要获得概率,需要softmax。

问题出在输出层中。 你的问题是一个多类,所以你必须以正确的方式处理它。这些是可能性:

如果您有一维整数编码的目标,则可以使用 sparse_categorical_crossentropy 作为损失函数,使用 softmax 作为最终激活

X = np.random.randint(0,10, (1000,100))
y = np.random.randint(0,3, 1000)
model = Sequential([
Dense(128, input_dim = 100),
Dense(3, activation='softmax'),
])
model.summary()
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
history = model.fit(X, y, epochs=3)

否则,如果您将目标进行独热编码以获得 2D 形状(n_samples、n_class(,则可以使用 categorical_crossentropy 和 softmax 作为最终激活

X = np.random.randint(0,10, (1000,100))
y = pd.get_dummies(np.random.randint(0,3, 1000)).values
model = Sequential([
Dense(128, input_dim = 100),
Dense(3, activation='softmax'),
])
model.summary()
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
history = model.fit(X, y, epochs=3)

最新更新