GroupNL: Low-Resource and Robust CNN Design over Cloud and Device [IEEE TMC 2026]
Compared with Ghost Conv and Seed Feature Maps-based (SineFM) Conv, the proposed GroupNL Conv generates partial feature maps without using extra cheap Conv and BatchNorm, which only uses a seed Conv with the data-agnostic and hyperparameters-fixed Nonlinear Transformation Functions (NLFs) (i.e., Sinusoidal func) and some lightweight Tensor Manipulation Operators like torch.cat, torch.split, and torch.repeat.
GroupNL Conv and GroupNL Conv (Sparse) can serve as the robust alternatives of standard Conv and depthwise Conv in Corrupted data, respectively.
GroupNL Conv and GroupNL Conv (Sparse) also achieves a comparable performance to Standard Conv and depthwise Conv on standard datasets (e.g., ImageNet-1K) while consuming fewer on-device resources (see our paper in IEEE TMC).
| Method | nn.Module | #Ops | #FLOPs |
|---|---|---|---|
| Standard Conv | Conv( |
1 | |
| Mono Conv | Conv( |
1 | |
| Ghost Conv | Conv( |
2 | |
| SineFM Conv | Conv( |
2+t | |
| GroupNL Conv | Conv( |
1 | |
| Depthwise Conv | Conv( |
1 | |
| GroupNL Conv (Sparse) | Conv( |
1 |
For the Convolutions with Conv(
For Ghost/SineFM/GroupNL Conv,
For Ghost Conv,
For GroupNL Conv (Sparse),
Our approach can achieve the performance of standard Conv with only the cost of a single seed Conv operation (i.e., Conv(
Python >= 3.8, PyTorch >= 1.10, but not strictly required
The standard dataset ImageNet-1K, and corrupted dataset ImageNet-C
The path of dataset is set by two args --data-dir and --machine in ddp_train.py (see line 363-365).
These scripts serve for the 8-RTX4090 GPUs DDP training with PyTorch.
GroupNL ResNet-101
python3 -m torch.distributed.launch --nproc_per_node=8 --master_port 25335 ddp_train.py --model gnl_resnet101 --batch-size 128 --epochs 300 --drop-path 0.1 --amp --output ./your/output/pathGroupNL MobileNet-V3
python3 -m torch.distributed.launch --nproc_per_node=8 --master_port 25335 ddp_train.py --model mobilenetv3_gnl_large_100 -b 128 --sched step --epochs 600 --decay-epochs 2.4 --decay-rate .973 --opt rmsproptf --opt-eps .001 -j 8 --warmup-lr 1e-6 --weight-decay 1e-5 --drop 0.2 --drop-path 0.2 --model-ema --model-ema-decay 0.9999 --aa rand-m9-mstd0.5 --remode pixel --reprob 0.2 --amp --lr .064 --lr-noise 0.42 0.9 --output ./your/output/pathGroupNL MobileNet-V2
python3 -m torch.distributed.launch --nproc_per_node=8 --master_port 25335 ddp_train.py --model mobilenetv2_gnl_100 -b 128 --sched step --epochs 450 --decay-epochs 2.4 --decay-rate .97 --opt rmsproptf --opt-eps .001 -j 8 --warmup-lr 1e-6 --weight-decay 1e-5 --drop 0.2 --drop-path 0.2 --aa rand-m9-mstd0.5 --remode pixel --reprob 0.2 --amp --lr .064 --output ./your/output/pathGroupNL EfficientNet-Lite0
python3 -m torch.distributed.launch --nproc_per_node=8 --master_port 25335 ddp_train.py --model efficientnet_gnl_lite0 --batch-size 128 --sched step --epochs 450 --decay-epochs 2.4 --decay-rate .97 --opt rmsproptf --opt-eps .001 -j 8 --warmup-lr 1e-6 --weight-decay 1e-5 --drop 0.2 --drop-path 0.2 --model-ema --model-ema-decay 0.9999 --aa rand-m9-mstd0.5 --remode pixel --reprob 0.2 --amp --lr .064 --output ./your/output/pathGroupNL EfficientNetV2-Small
python3 -m torch.distributed.launch --nproc_per_node=8 --master_port 25335 ddp_train.py --model efficientnetv2_gnl_s -b 128 --sched step --epochs 450 --decay-epochs 2.4 --decay-rate .97 --opt rmsproptf --opt-eps .001 -j 8 --warmup-lr 1e-6 --weight-decay 1e-5 --drop 0.2 --drop-path 0.2 --aa rand-m9-mstd0.5 --remode pixel --reprob 0.2 --amp --lr .064 --output ./your/output/pathGroupNL EfficientNet-ES
python3 -m torch.distributed.launch --nproc_per_node=8 --master_port 25335 ddp_train.py --model efficientnet_gnl_es -b 128 --sched step --epochs 450 --decay-epochs 2.4 --decay-rate .97 --opt rmsproptf --opt-eps .001 -j 8 --warmup-lr 1e-6 --weight-decay 1e-5 --drop 0.2 --drop-path 0.2 --aa rand-m9-mstd0.5 --remode pixel --reprob 0.2 --amp --lr .064 --output ./your/output/pathThe val_imagenet_c.py will validate the last epoch's checkpoint from training in ./your/checkpoint/dir/path.
The path of ImageNet-C dataset is set by the args --data-dir in val_imagenet_c.py.
Example:
GroupNL EfficientNet-ES in ImageNet-C
python3 val_imagenet_c.py --model efficientnet_gnl_es --checkpoint ./your/checkpoint/dir/path --output ./your/output/path --output-dir ./your/imgc/output/pathChuntao Ding#, Jianhang Xie#,*, Junna Zhang*, Salman Raza, Shangguang Wang, Jiannong Cao, “GroupNL: Low-Resource and Robust CNN Design over Cloud and Device,” IEEE Transactions on Mobile Computing, Accepted, 2026.
#: Co-first author; *: Corr. author.
@article{ding.tmc2026groupnl,
author={Ding, Chuntao and Xie, Jianhang and Zhang, Junna and Raza, Salman and Wang, Shangguang and Cao, Jiannong},
journal={IEEE Transactions on Mobile Computing},
title={GroupNL: Low-Resource and Robust CNN Design over Cloud and Device},
year={2026},
volume={},
number={},
pages={1-15},
doi={10.1109/TMC.2026.3655770}
}The implementation is built on top of https://github.com/huggingface/pytorch-image-models
The training scripts references https://huggingface.co/docs/timm/training_script
