Skip to content

Post-hoc intensity correction

This model takes one frozen U-Net wind field and current metadata, then adds a learned signed correction to the field's valid-pixel maximum. A compact CNN encodes wind, validity, and storm-center distance; an MLP combines those features with current location/time metadata. The result is clamped nonnegative. It estimates current intensity from one observation.

The zero-initialized final layer initially reproduces the raw field maximum. Training uses tropical IBTrACS USA_WIND in m/s, with USA_SSHS from −1 to 5. Storm-balanced, capped category-aware weights enter a 5 m/s Huber objective. Categories are derived from continuous predictions. The default checkpoint monitor is val/storm_macro_mae_ms.

Optional radius presets either retain field-diagnosed radii or enable a separate masked scalar structure head. Keep the source of each reported radius explicit. The default unet_intensity_correction has no structure loss.

Prepare a local cache

The cache contains split manifests, frozen field arrays, and cache-metadata.json, which records the producer checkpoint and source hashes. Generate it from source observations using:

uv run geo2wf-export intensity-cache \
  --data-root /path/to/archive \
  --manifest /path/to/observation_manifest.csv \
  --ibtracs-file /path/to/ibtracs.ALL.list.v04r01.csv \
  --config /path/to/unet/resolved-config.yaml \
  --checkpoint /path/to/unet.ckpt \
  --stats /path/to/paired/stats.json \
  --output-root data/unet_intensity

The frozen producer must match the cache provenance. End-to-end evaluation also depends on the producer's training membership; a clean downstream split cannot undo upstream exposure to evaluation storms.

Train and evaluate

uv run geo2wf-train experiment=unet_intensity_correction \
  data.root=data/unet_intensity

uv run geo2wf-evaluate intensity-correction \
  --cache-root data/unet_intensity \
  --checkpoint /path/to/intensity.ckpt --split test \
  --output logs/intensity-evaluation.json

geo2wf-infer intensity-correction accepts the same cache/checkpoint/split arguments and writes prediction CSV via --output. Its outputs include raw_unet_max_wind_ms, correction_ms, output_msw_ms, and output_category. StormSense calls this post-hoc product U-Net+MLP; it is separate from the jointly trained latent model.