Python 如何表示多类分类的输出?
我有一个4个输入和3个输出的顺序模型: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
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
只能在外层用于二进制分类。实际上这很奇怪,因为我认为最后一层不需要激活,因为它不是二进制分类。我使用了这个示例“”