Instructions to use zachtheyek/aetherscan with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Keras
How to use zachtheyek/aetherscan with Keras:
# Available backend options are: "jax", "torch", "tensorflow". import os os.environ["KERAS_BACKEND"] = "jax" import keras model = keras.saving.load_model("hf://zachtheyek/aetherscan") - Notebooks
- Google Colab
- Kaggle
test_v26
Browse files- .gitattributes +2 -0
- README.md +84 -0
- config.json +187 -0
- random_forest.joblib +3 -0
- vae_decoder.keras +3 -0
- 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
|