zachtheyek commited on
Commit
1480422
·
verified ·
1 Parent(s): ad1763c
Files changed (6) hide show
  1. .gitattributes +2 -0
  2. README.md +84 -0
  3. config.json +187 -0
  4. random_forest.joblib +3 -0
  5. vae_decoder.keras +3 -0
  6. vae_encoder.keras +3 -0
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ vae_decoder.keras filter=lfs diff=lfs merge=lfs -text
37
+ vae_encoder.keras filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: bsd-3-clause
3
+ library_name: keras
4
+ tags:
5
+ - seti
6
+ - radio-astronomy
7
+ - anomaly-detection
8
+ - beta-vae
9
+ - random-forest
10
+ ---
11
+
12
+ # Aetherscan
13
+
14
+ [Breakthrough Listen](https://breakthroughinitiatives.org/initiative/1)'s deep-learning SETI
15
+ pipeline: a two-stage architecture where a **Beta-VAE encoder** compresses each observation of
16
+ a 6-observation cadence (3 ON / 3 OFF, ABACAD) into an 8-dimensional latent, and a **Random
17
+ Forest** classifies the cadence's concatenated latents as a technosignature candidate or not.
18
+
19
+ This repository carries the released model weights at stable filenames, versioned via git
20
+ tags: training tags match the pipeline run's save tag (e.g. `final_v3`), and release tags
21
+ (`vX.Y.Z`) mark blessed weights.
22
+
23
+ **Training tag**: `test_v26`
24
+
25
+ ## Files
26
+
27
+ | File | Description |
28
+ |---|---|
29
+ | `vae_encoder.keras` | Beta-VAE encoder (Keras) — the inference feature extractor |
30
+ | `vae_decoder.keras` | Beta-VAE decoder (Keras) — for reconstruction/traversal analysis |
31
+ | `random_forest.joblib` | Random Forest cadence classifier (joblib) |
32
+ | `config.json` | Full resolved training configuration for this run |
33
+
34
+ ## Training configuration
35
+
36
+ | Parameter | Value |
37
+ |---|---|
38
+ | Training rounds | `2` |
39
+ | Epochs per round | `2` |
40
+ | Beta-VAE samples per round | `200` |
41
+ | Random Forest samples | `200` |
42
+ | Curriculum schedule | `exponential` |
43
+ | SNR base | `10` |
44
+ | Initial SNR range | `40` |
45
+ | Final SNR range | `10` |
46
+ | Latent dimensions | `8` |
47
+ | Beta (KL weight) | `1.5` |
48
+ | Alpha (clustering weight) | `10.0` |
49
+ | RF estimators | `1000` |
50
+
51
+ The complete configuration is in `config.json`.
52
+
53
+ ## Evaluation (validation split)
54
+
55
+ | Metric | Value |
56
+ |---|---|
57
+ | ROC AUC | 0.7812 |
58
+ | Average precision | 0.7904 |
59
+ | Classification threshold | 0.99 |
60
+ | Validation samples | 40 |
61
+
62
+ ## Library versions
63
+
64
+ | Library | Version |
65
+ |---|---|
66
+ | python | `3.12.3` |
67
+ | tensorflow | `2.17.0` |
68
+ | numpy | `1.26.4` |
69
+ | scikit-learn | `1.5.2` |
70
+ | huggingface_hub | `1.21.0` |
71
+
72
+ ## Usage
73
+
74
+ Aetherscan inference downloads these weights by default when no local artifact paths are
75
+ given (pin a version with `--hf-revision`):
76
+
77
+ ```bash
78
+ python -m aetherscan.main inference --hf-revision test_v26 --inference-files <catalog.csv>
79
+ ```
80
+
81
+ ## Links & citation
82
+
83
+ Source code, documentation, and issue tracker: [https://github.com/zachtheyek/Aetherscan](https://github.com/zachtheyek/Aetherscan).
84
+ If you use Aetherscan in your research, please cite it via the repository's `CITATION.cff`.
config.json ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "paths": {
3
+ "data_path": "/datax/scratch/zachy/data/aetherscan",
4
+ "model_path": "/datax/scratch/zachy/models/aetherscan",
5
+ "output_path": "/datax/scratch/zachy/outputs/aetherscan"
6
+ },
7
+ "db": {
8
+ "get_connection_timeout": 60.0,
9
+ "stop_writer_timeout": 10.0,
10
+ "write_interval": 5.0,
11
+ "write_buffer_max_size": 100,
12
+ "write_retry_delay": 1.0,
13
+ "flush_timeout": 10.0
14
+ },
15
+ "manager": {
16
+ "n_processes": 32,
17
+ "chunks_per_worker": 4,
18
+ "pool_terminate_timeout": 10.0
19
+ },
20
+ "monitor": {
21
+ "get_gpu_timeout": 5.0,
22
+ "stop_monitor_timeout": 10.0,
23
+ "monitor_interval": 1.0,
24
+ "monitor_retry_delay": 1.0
25
+ },
26
+ "logger": {
27
+ "console_level": "INFO",
28
+ "file_level": "INFO",
29
+ "slack_level": "INFO",
30
+ "slack_enabled": true,
31
+ "slack_channel": null,
32
+ "slack_username": "Aetherscan",
33
+ "slack_timeout": 15.0,
34
+ "slack_retry_attempts": 3,
35
+ "slack_buffer_size": 100,
36
+ "slack_flush_interval": 60.0,
37
+ "slack_broadcast_level": "ERROR"
38
+ },
39
+ "beta_vae": {
40
+ "latent_dim": 8,
41
+ "dense_layer_size": 512,
42
+ "kernel_size": [
43
+ 3,
44
+ 3
45
+ ],
46
+ "beta": 1.5,
47
+ "alpha": 10.0
48
+ },
49
+ "rf": {
50
+ "n_estimators": 1000,
51
+ "bootstrap": true,
52
+ "max_features": "sqrt",
53
+ "n_jobs": -1,
54
+ "seed": 11
55
+ },
56
+ "gpu": {
57
+ "num_replicas": null,
58
+ "per_gpu_memory_limit_mb": null,
59
+ "nccl_num_packs": 2,
60
+ "use_async_allocator": true
61
+ },
62
+ "data": {
63
+ "num_observations": 6,
64
+ "width_bin": 4096,
65
+ "downsample_factor": 8,
66
+ "time_bins": 16,
67
+ "freq_resolution": 2.7939677238464355,
68
+ "time_resolution": 18.25361108,
69
+ "num_target_backgrounds": 45000,
70
+ "background_load_chunk_size": 15000,
71
+ "max_chunks_per_file": 1,
72
+ "inference_background_load_chunk_size": 50000,
73
+ "train_files": [
74
+ "real_filtered_LARGE_HIP110750.npy",
75
+ "real_filtered_LARGE_HIP13402.npy",
76
+ "real_filtered_LARGE_HIP8497.npy"
77
+ ],
78
+ "test_files": [
79
+ "real_filtered_LARGE_test_HIP15638.npy"
80
+ ],
81
+ "inference_files": null
82
+ },
83
+ "training": {
84
+ "num_training_rounds": 2,
85
+ "epochs_per_round": 2,
86
+ "num_samples_beta_vae": 200,
87
+ "num_samples_rf": 200,
88
+ "train_val_split": 0.8,
89
+ "per_replica_batch_size": 4,
90
+ "effective_batch_size": 20,
91
+ "per_replica_val_batch_size": 4,
92
+ "signal_injection_chunk_size": 50000,
93
+ "data_gen_task_size": 256,
94
+ "round_data_dir": null,
95
+ "overlap_data_generation": true,
96
+ "keep_round_data": false,
97
+ "plot_injection_subsampling_count": 100000,
98
+ "plot_injection_outlier_percentile": 99.0,
99
+ "latent_viz_num_cadences_per_type": 5,
100
+ "latent_viz_step_interval": 10,
101
+ "latent_viz_umap_fit_max_samples": 100000,
102
+ "latent_viz_umap_n_neighbors": [
103
+ 5,
104
+ 15,
105
+ 30,
106
+ 50
107
+ ],
108
+ "latent_viz_umap_min_dist": [
109
+ 0.0,
110
+ 0.1,
111
+ 0.5
112
+ ],
113
+ "latent_viz_gif_max_frames": 500,
114
+ "latent_viz_gif_duration_ms": 100,
115
+ "latent_traversal_every_round": false,
116
+ "latent_traversal_num_steps": 7,
117
+ "latent_traversal_max_sigma": 3.0,
118
+ "shap_max_samples_summary": 5000,
119
+ "shap_max_samples_interaction": 1500,
120
+ "shap_top_k_features_dependence": 48,
121
+ "rf_decision_boundary_grid_size": 150,
122
+ "rf_decision_boundary_max_points": 5000,
123
+ "snr_base": 10,
124
+ "initial_snr_range": 40,
125
+ "final_snr_range": 10,
126
+ "curriculum_schedule": "exponential",
127
+ "exponential_decay_rate": -3.0,
128
+ "step_easy_rounds": 5,
129
+ "step_hard_rounds": 15,
130
+ "base_learning_rate": 0.001,
131
+ "min_learning_rate": 1e-06,
132
+ "min_pct_improvement": 0.001,
133
+ "patience_threshold": 3,
134
+ "reduction_factor": 0.2,
135
+ "max_retries": 1,
136
+ "retry_delay": 60
137
+ },
138
+ "inference": {
139
+ "encoder_path": null,
140
+ "rf_path": null,
141
+ "config_path": null,
142
+ "per_replica_batch_size": 2048,
143
+ "classification_threshold": 0.99,
144
+ "cadence_group_by_cols": [
145
+ "Target",
146
+ "Session",
147
+ "Band",
148
+ "Cadence ID",
149
+ "Frequency"
150
+ ],
151
+ "cadence_h5_path_col": ".h5 path",
152
+ "cadence_expected_obs": 6,
153
+ "coarse_channel_width": 1048576,
154
+ "parallel_coarse_chans": null,
155
+ "bandpass_method": "pfb",
156
+ "pfb_taps_per_channel": 12,
157
+ "bandpass_debug_plot": false,
158
+ "spline_order": 16,
159
+ "detection_window_size": 256,
160
+ "detection_step_size": 128,
161
+ "stat_threshold": 2048.0,
162
+ "stamp_width": 4096,
163
+ "store_downsampled_stamps": true,
164
+ "overlap_search": true,
165
+ "overlap_fraction": 0.5,
166
+ "discard_side_channels": false,
167
+ "side_channel_count": 0,
168
+ "preprocess_output_dir": null,
169
+ "inference_viz_enabled": true,
170
+ "stamp_gallery_top_k": 12,
171
+ "max_candidate_plots": 50,
172
+ "max_retries": 3,
173
+ "retry_delay": 60
174
+ },
175
+ "hf": {
176
+ "repo_id": "zachtheyek/aetherscan",
177
+ "upload_after_training": true,
178
+ "revision": null
179
+ },
180
+ "checkpoint": {
181
+ "load_dir": null,
182
+ "load_tag": null,
183
+ "start_round": 1,
184
+ "save_tag": "test_v26",
185
+ "force_tag": false
186
+ }
187
+ }
random_forest.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:13c7595b2d2ac27c851ae369cbc801069bfd481e52fbe2fbd46a80804e22b41d
3
+ size 3882585
vae_decoder.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0c9ea1fcaaff25fc0fde39c92057e51c6eb5f5e92410b5e7607aa56f4cbd11e2
3
+ size 18677748
vae_encoder.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6e451ee8fbee81ef4608c6ab1e07d1c33916c726fb7e00f8489c9ab62fcad4d7
3
+ size 18667989