Cyclic cosine annealing LR that produces M diverse snapshots from a single training run for free ensembling
Scanned 9/12/2026
Install to Claude Code
npx -y skills add wenmin-wu/ds-skills --skill snapshot-cosine-ensemble --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Snapshot Cosine Ensemble?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/wenmin-wu-snapshot-cosine-ensemble)More formats (shields.io, HTML) on the badges page.
---
name: cv-snapshot-cosine-ensemble
description: Cyclic cosine annealing LR that produces M diverse snapshots from a single training run for free ensembling
---
## Overview
Snapshot ensembling runs cosine LR cycles during a single training pass. Each cycle converges to a different minimum, giving M diverse models for the cost of training one. Combined with SWA or simple prediction averaging, this provides cheap ensemble diversity without M training runs.
## Quick Start
```python
import numpy as np
from keras.callbacks import LearningRateScheduler, ModelCheckpoint
class SnapshotCallbackBuilder:
def __init__(self, nb_epochs, nb_snapshots, init_lr=0.1):
self.T = nb_epochs
self.M = nb_snapshots
self.alpha_zero = init_lr
def _cosine_anneal(self, epoch):
cos_inner = np.pi * (epoch % (self.T // self.M)) / (self.T // self.M)
return float(self.alpha_zero / 2 * (np.cos(cos_inner) + 1))
def get_callbacks(self, model_prefix='snap'):
return [
ModelCheckpoint(f'{model_prefix}_best.h5', monitor='val_loss',
save_best_only=True),
LearningRateScheduler(self._cosine_anneal),
]
# Usage: 50 epochs, 5 snapshots, init_lr=1e-3
builder = SnapshotCallbackBuilder(nb_epochs=50, nb_snapshots=5, init_lr=1e-3)
model.fit(..., epochs=50, callbacks=builder.get_callbacks('run1'))
```
## Workflow
1. Choose total epochs T and number of snapshots M (cycle length = T/M)
2. LR follows cosine schedule within each cycle, restarting to `init_lr` at cycle start
3. Save model weights at the end of each cycle (when LR hits minimum)
4. At inference, average predictions from all M snapshots
5. Optionally combine with SWA by averaging weights of the final few snapshots
## Key Decisions
- **M value**: 3-5 snapshots. More snapshots means shorter cycles and less convergence per snapshot.
- **init_lr**: Higher than normal (start of each cycle hits this). Typical 1e-3 → 1e-1 depending on model.
- **Cycle length**: T/M epochs — ensure each cycle has enough time to converge meaningfully.
- **vs. checkpoint ensemble**: Snapshot ensemble is more diverse because each cycle explores new minima via the LR restart.
## References
- [Nested Unet with EfficientNet Encoder](https://www.kaggle.com/code/meaninglesslives/nested-unet-with-efficientnet-encoder)
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!