This repository contains an empirical study of class imbalance effects on training dynamics and performance for:
- a Fully-Connected Network (FC / MLP) baseline, and
- a Convolutional Neural Network (CNN) baseline,
evaluated on MNIST in both:
- Binary settings (2 classes), and
- Multiclass settings (10 classes).
The code automatically selects the device as CUDA if available, else CPU.
Windows (PowerShell)
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pipmacOS / Linux
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pippip install torch torchvision torchaudio
pip install wandb numpy matplotlib pyyaml tqdm scikit-learnIf logging.use_wandb: true, you should log in once:
wandb loginTo run without W&B, set in configs/base.yaml:
logging:
use_wandb: falseExperiments are defined by merging multiple YAML config files. The final configuration is created by applying configs
left → right exactly as passed to --config.
- Configs are merged left → right.
- Later files override earlier files for overlapping keys.
Recommended order:
configs/base.yaml(shared defaults)configs/task_*.yaml(task mode / number of classes)configs/model_*.yaml(model selection + architecture params)configs/opt_*.yaml(optimizer selection + hyperparameters)configs/imbalance_*.yaml(imbalance setting)
python -m src.main \
--config configs/base.yaml \
--config configs/model_fc.yaml \
--config configs/imbalance_none.yamlpython -m src.main \
--config configs/base.yaml \
--config configs/model_cnn.yaml \
--config configs/imbalance_severe.yamlEnable multiclass mode by adding the task config (it overrides model.num_classes to 10).
python -m src.main \
--config configs/base.yaml \
--config configs/task_multiclass.yaml \
--config configs/model_fc.yaml \
--config configs/imbalance_moderate.yamlpython -m src.main \
--config configs/base.yaml \
--config configs/task_multiclass.yaml \
--config configs/model_cnn.yaml \
--config configs/imbalance_balanced.yamlModel selection is controlled by model.name:
model_fc.yamlsetsmodel.name: fcand FC-specific parameters.model_cnn.yamlsetsmodel.name: cnnand CNN-specific parameters.
The code calls build_model(cfg) (model factory), which reads cfg["model"]["name"] and instantiates the corresponding model.
Optimizer selection is controlled by training.optimizer.*. For example, adding opt_adamw.yaml typically overrides:
training.optimizer.name(e.g.,adamw)training.lrtraining.weight_decay- and any optimizer-specific parameters (e.g., betas)
Example (CNN + AdamW + multiclass):
python -m src.main \
--config configs/base.yaml \
--config configs/task_multiclass.yaml \
--config configs/model_cnn.yaml \
--config configs/opt_adamw.yaml \
--config configs/imbalance_none.yamlIn this command:
task_multiclass.yamloverrides the number of classes (10),model_cnn.yamlselects the CNN architecture,opt_adamw.yamloverrides optimizer hyperparameters frombase.yaml,imbalance_none.yamldefines the (no-)imbalance setting.
- MNIST will be downloaded automatically on first run (via
torchvision). - Outputs such as checkpoints/logs (if enabled) are written under
outputs/.