求助:我的Keras卷积神经网络为何仅输出1?
Hey there, let’s dig into why your Keras CNN is only spitting out class 1 predictions and stuck at 50% accuracy—this is a super common pitfall in binary classification setups, so let’s walk through the most likely causes step by step:
Top Causes & Fixes
Class Imbalance (or Even Split with No Actual Learning)
If your training dataset has an even 50/50 split of 0s and 1s, a model that blindly predicts 1 will naturally hit 50% accuracy—it’s just guessing randomly. If one class dominates, the model might take the lazy route to minimize loss by favoring the majority class. First, check your label distribution with a quick snippet:import pandas as pd print(pd.Series(train_labels).value_counts())Fixes: Use oversampling for the minority class, undersampling for the majority, or pass the
class_weightparameter tomodel.fit()(e.g.,class_weight={0: 2, 1: 1}if class 0 is underrepresented).Incorrect Output Layer & Loss Function Setup
Binary classification requires specific layer configurations, and mixing these up is a frequent culprit. Here’s the correct setup you need:- Output layer: A single neuron with
sigmoidactivation (to output a probability between 0 and 1) - Loss function:
binary_crossentropy
Example of the right configuration:
model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])If you used
softmaxwith 2 neurons andcategorical_crossentropybut didn’t one-hot encode your labels, the model might default to predicting class 1 consistently.- Output layer: A single neuron with
Label or Data Preprocessing Errors
Double-check that your labels are correctly paired with images. It’s easy to mix up labels during data loading (e.g., reading the wrong column, misaligning augmented images with their labels). Also, verify your image preprocessing:- Are images normalized to the right range (e.g., 0-1 instead of 0-255)?
- Do image dimensions match your model’s input layer (e.g., (28,28,1) for grayscale images)?
If your model is fed invalid or misaligned input, it can’t learn meaningful features—and might default to predicting one class.
Underpowered Model or Insufficient Training
A too-simple CNN might not capture the visual differences between class 0 and class 1. Try adding more convolutional layers, increasing the number of filters per layer (e.g., from 32 to 64), or adding dropout layers to prevent overfitting (though in this case, it’s likely underfitting).
Also, check if you’re training for enough epochs. Plot your training loss and accuracy over time—if the metrics are still improving at the end of training, you need to let it run longer. If they’re flat at 50%, the model isn’t learning at all, so go back to checking your data and layer setup.Activation Function or Weight Initialization Issues
Usingsigmoidas a hidden layer activation can cause gradient vanishing in deeper networks, making it impossible for the model to learn. Swap torelu(orleaky_relu) for hidden layers instead. Additionally, poor weight initialization might cause the model to start biased toward class 1—try usingHeNormalinitialization for convolutional layers to give it a better starting point.
Quick Troubleshooting Checklist
- First, confirm your train/test label distribution and correctness
- Validate your output layer and loss function setup is right for binary classification
- Plot training metrics to see if the model is actually learning
- Adjust model complexity or training duration if needed
内容的提问来源于stack exchange,提问作者Will P.

