This repository contains the official implementation of DAG_Fed, a federated learning framework integrating Dynamic Adaptive Gradient Clipping (DAGC) and Hierarchical Differential Privacy (HDP) to improve both privacy protection and model utility under heterogeneous (non-IID) data distributions.
- Dynamic Client Selection & Adaptive Gradient Clipping β Mitigates statistical heterogeneity by adaptively tuning gradient norms per client.
- Hierarchical Differential Privacy (HDP) β Multi-level noise injection for balanced privacyβutility trade-off.
- Modular Aggregator β Supports FedAvg, SCAFFOLD, and custom aggregation strategies.
- Flexible Data Partitioning β IID and non-IID splits via Dirichlet sampling.
- Reproducible Experiments β Unified config file and logging system.
DAGC_HDP_Federated_Learning/
β
βββ config.py # Global configuration: hyperparameters, DP budget, scenarios
βββ main.py # Main entry: training orchestration, global loop
β
βββ clients/
β βββ client.py # Client base class: data loading, local training, DAGC
β βββ dp_utils.py # DP utilities: gradient clipping, noise injection
β βββ noise_scheduler.py # Dynamic noise scheduling
β
βββ server/
β βββ aggregator.py # Aggregators (FedAvg, SCAFFOLD, etc.)
β βββ privacy_accountant.py # DP budget tracking, RDP accounting
β
βββ models/
β βββ model_cnn.py # CNN model for vision datasets (CIFAR-10, MNIST)
β
βββ data/
β βββ data_loader.py # Dataset loading & non-IID partitioning
β βββ datasets/ # Dataset storage
β
βββ experiments/
β βββ logger.py # Logging utilities
β βββ metrics.py # Accuracy, F1, MSE calculation
β βββ attack_test.py # Privacy attack evaluation scripts
β
βββ utils/
β βββ helper.py # General utilities (seed, save/load, etc.)
β βββ plots.py # Visualization of results
β
βββ README.md # Project documentation
βββ requirements.txt # Python dependencies
git clone https://github.com/dxpython/DAG_Fed.git
cd DAG_Fedconda create -n DAG_Fed python=3.9
conda activate DAG_FedRun a CIFAR-10 experiment with 10 clients, 100 rounds, and a privacy budget of Ξ΅ = 1.0:
python main.py --dataset cifar10 --rounds 100 --clients 10 --epsilon 1.0Key Arguments:
--dataset:cifar10,cifar100,mnist,fashionmnist--rounds: Number of global communication rounds--clients: Number of participating clients--epsilon: Privacy budget for DP- Additional parameters can be set in
config.py