Skip to content

PhaseNet-Plus-Geysers-v2

Latest

Choose a tag to compare

@zhuwq0 zhuwq0 released this 02 Nov 11:33
6dc992b

PhaseNet-Plus (Geysers), v2

PhaseNet-Plus-TF (STFT branch, polarity, event and magnitude heads) retrained on the Geysers data with the reviewed architecture: no resnet blocks, attention along time at stage 3 and the bottleneck, magnitude loss weight 0.1. Run v41_seis_tf_plus_seed1, step 24,000, EMA weights. Code: AI4EPS/PhaseNet-Plus 343d683 (architecture), phasenet==0.2.6.dev3 (P(up) at each P pick).

  • 2.00 M parameters. The checkpoint declares window_nx = 1 (one station per patch; scores identical to the training nx, since attention stays within a station).
  • Not loadable by phasenet<=0.2.6.dev1 (different architecture); v1 / v1.1 stay for those versions.

Scores (Geysers val + test eval sets)

model P precision at recall 0.85 S precision at recall 0.85 polarity agreement magnitude MAE per record
PhaseNet (2018) 0.667 0.594
v39 (magnitude weight 1.0) 0.667 0.612 0.816 0.34
v2 0.700 0.687 0.823 0.29

Magnitude is compressed at the ends (about +0.3 below M0.5, about -1.3 at M3 and above).

Class tests (EPS207 notebooks)

  • QuakeFlow on 2025-08-14, 42 BG/NC stations: P recall 0.90, S 0.99 against the NCEDC picks, median offset 10 ms; NCEDC events found 162/167 by GaMMA, 154 by ADLoc, 153 by HypoDD; P polarity agreement 0.918.
  • Focal mechanisms, 150 events of 2016 (4,739 analyst readings): polarity agreement 0.876 (impulsive 0.911, emergent 0.735); HASH from model polarities vs analyst polarities, median Kagan angle 12°. BG borehole stations keep the archive sign convention: flip their polarities per station before HASH.
from phasenet.utils.inference import load_checkpoint, predict_2d, detect_picks
model = load_checkpoint("phasenet_plus_geysers_v2.pth")  # EMA weights
scores, _ = predict_2d(model, waveform)    # waveform: (3, n_stations, nt); scores (4, n_stations, nt): noise, P, S, P(up)
picks = detect_picks(scores, channel_ids, {}, begin_time_iso)  # P picks carry phase_polarity = P(up)

sha256: 56d8ca3c3d6a7a96751a8a1e3dacf0881ac4a624bcba50fd69c3bbc4223b7f60