我正在尝试在Keras中实现一个用于多类分类的简单神经网络。代码如下:
model = Sequential()model.add(Dense(512, input_dim = 55 , kernel_regularizer=l2(0.00001), activation = 'relu'))model.add(Dense(8, activation = 'softmax'))model.compile(loss = 'categorical_crossentropy' , optimizer = 'adam' , metrics = ['accuracy'] )model.fit(X_train, dummy_y, epochs = 20, batch_size = 30, class_weight=class_weights)
我有55个特征,我希望预测8个类别中的一个(0,1,2,3,4,5,6,7)。我还这样编码y_train
:
encoder = LabelEncoder()encoder.fit(y_train)encoded_Y = encoder.transform(y_train)# 将整数转换为虚拟变量(即独热编码)dummy_y = np_utils.to_categorical(encoded_Y)
然而,当我使用predict()
时,输出是每个类别的概率数组:
array([[3.3881092e-01, 2.6201099e-06, 1.9504215e-03, ..., 7.0641324e-02, 4.4026113e-01, 1.2641836e-02], [2.3457911e-02, 5.5409328e-04, 2.8759112e-05, ..., 2.1585675e-03, 5.5625242e-01, 1.0208529e-01], [4.6981460e-01, 2.0882198e-05, 1.4895502e-01, ..., 1.3179567e-01, 2.2908358e-01, 1.4160757e-03], ...
我应该如何修改网络,以便输出概率最高的类别?像这样:
[[0,5,7,3,2,0,0,.....]]
回答:
你可以简单地使用predict_classes
方法:
preds_classes = model.predict_classes(X_test)
你看到的predict
方法的输出是每个类别的概率或置信度得分。因此,作为另一种解决方案,你可以获取最大得分的索引,这对应于预测的类别:
import numpy as npprobs = model.predict(X_test)classes = np.argmax(probs, axis=-1)