Let's say I have 3 classes, and each sample can belong to any of those classes.

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

I set my output as Dense(3, activation="sigmoid"), and I compiled with optimizer="adam", loss="binary_crossentropy". I guet 0.05 for loss, and 0.98 for accuracy, according to Keras output.

I thought I would get only 1 or 0 for prediction if I use sigmoid and binary_crossentropy. However, model.predict(training-features) gave me values between 1 and 0.

Then I clipped the values at 0.5 like below and checked accuracy_score(training_labels, preds). The score dropped to 0.1.

preds[preds>=0.5] = 1
preds[preds<0.5] = 0

I'd appreciate if someone could give me some guidance on how I should approach this problem.



Okay, things you need to correct in your approach:

  1. If you have 3 labels/classes, you should one-hot encode your y_train.
  2. You probably should use loss=categorical_crossentropy in compile for more than 2 classes.
  3. Your final activation function should be a softmax and not a sigmoid. You are getting prediction values between 0 and 1, because that's what sigmoid does.

Now, if you take an argmax on your prediction output, you can see the class with the highest confidence score.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.