Skip to content
Back to skills

Snapshot Cosine Ensemble

ASecurity

Cyclic cosine annealing LR that produces M diverse snapshots from a single training run for free ensembling

  • 61 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 12, 2026
toolspython

Works with

  • cli

Security analysis

A100/100

Scanned September 12, 2026

npx -y skills add wenmin-wu/ds-skills --skill snapshot-cosine-ensemble --agent claude-code

Installs 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 with every re-scan.

Security grade badge for Snapshot Cosine Ensemble
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/wenmin-wu-snapshot-cosine-ensemble/badge)](https://www.skillsdirectory.com/skills/wenmin-wu-snapshot-cosine-ensemble)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…