Python 如何表示多类分类的输出?

Python 如何表示多类分类的输出?,python,machine-learning,keras,Python,Machine Learning,Keras,我有一个4个输入和3个输出的顺序模型: def baseline_model(): # create model model = Sequential() model.add(Dense(4, input_dim=4, init='normal', activation='relu')) model.add(Dense(3, init='normal', activation='sigmoid')) # Compile model model.co

我有一个4个输入和3个输出的顺序模型:

def baseline_model():
    # create model
    model = Sequential()
    model.add(Dense(4, input_dim=4, init='normal', activation='relu'))
    model.add(Dense(3, init='normal', activation='sigmoid'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    # serialize model to JSON
    model_json = model.to_json()
    with open("model.json", "w") as json_file:
        json_file.write(model_json)
    # serialize weights to HDF5
    model.save_weights("model.h5")
    print("Saved model to disk")
    return model
我使用下面的代码来预测类

prediction = model.predict(np.array([[data[0],data[1],data[2],data[3]]]))
但预测的回报是
[[0.49986306 0.5005092 0.50012374]

如何解释预测的价值

下面的解释对吗

Class1 -- when single value > 0.5 -> 1 (sum of 3 number ==1 )

Class2 -- when single value > 0.5 -> 1 (sum of 3 number ==2 )

Class3 -- when single value > 0.5 -> 1 (sum of 3 number ==3 )

如果解释是错误的,如何解释预测的价值?

正如评论中所说,既然你引用了,你应该知道这是一个错误

你想在这里预测虹膜的类型。
sigmoid
激活将为您提供3个介于0和1之间的输出。您正在训练它们,以便2必须朝向0,1必须朝向1。问题是,没有任何东西可以阻止输出为1,1,1,这不应该发生,因为您只想为一朵花检测一种类型的虹膜

这就是“softmax”激活有用的地方。它只是对输出进行规格化,使3个输出的总和为1。 如果要在多个可能性之间仅检测一个类,则应始终使用
softmax
。然后,您可以将输出
i
解释为花属于类
i
的概率

您的输出将如下所示:

[0.1, 0.2, 0.7] or [0.3, 0.4, 0.3]
为了解释这一点,第一个示例对于3类具有最高的概率,因此预测了3类。第二个例子对于2类具有最高的概率,因此预测了2类

要做到这一点,您必须在模型中更改的行是:

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

是否更清晰?

如果是分类器,则需要在层的末尾添加
softmax
层,以查看模型预测的类。我将其用作多层感知器。我使用教科书的代码。这没有softmax层。正如@Arman已经提到的,您应该使用
softmax
sigmoid
只能在外层用于二进制分类。实际上这很奇怪,因为我认为最后一层不需要激活,因为它不是二进制分类。我使用了这个示例“”