File size: 5,417 Bytes
23eac00
 
 
 
 
 
4ac5b29
 
23eac00
 
e83702f
2ed1ed0
 
e83702f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b7f690d
da458b4
06f6e26
 
 
0900c65
 
b7f690d
 
 
 
 
 
 
 
8752922
23eac00
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
---
license: mit
tags:
- space
- radiation
- LEO
datasets:
- lucazsh/RadNet
---

<p align="center">
  <img class="dark:hidden" src="https://huggingface.co/lucazsh/RadNet/raw/main/img/radnet_light.svg" alt="RadNet Light" width="690" height="122" style="max-width:90%;">
  <img class="hidden dark:block" src="https://huggingface.co/lucazsh/RadNet/raw/main/img/radnet_dark.svg" alt="RadNet Dark" width="690" height="122" style="max-width:90%;">
</p>

<div style="text-align:center;">
  <span style="display:inline-block; margin:4px;">
    <img alt="language: Python" src="https://img.shields.io/badge/language-Python-3776AB?&logo=python&logoColor=white">
  </span>
  <span style="display:inline-block; margin:4px;">
    <img alt="license: MIT" src="https://img.shields.io/badge/license-MIT-green">
  </span>
  <span style="display:inline-block; margin:4px;">
    <img alt="domain: Space" src="https://img.shields.io/badge/domain-Space-0b3d91">
  </span>
  <span style="display:inline-block; margin:4px;">
    <img alt="topic: Radiation" src="https://img.shields.io/badge/topic-Radiation-ff6f00">
  </span>
  <span style="display:inline-block; margin:4px;">
    <img alt="orbit: LEO" src="https://img.shields.io/badge/orbit-LEO-009688">
  </span>
  <span style="display:inline-block; margin:4px;">
    <img alt="model: LSTM" src="https://img.shields.io/badge/model-LSTM-blueviolet">
  </span>
  <span style="display:inline-block; margin:4px;">
    <img alt="framework: PyTorch" src="https://img.shields.io/badge/framework-PyTorch-EE4C2C?logo=pytorch&logoColor=white">
  </span>
  <span style="display:inline-block; margin:4px;">
    <img alt="status: Active" src="https://img.shields.io/badge/status-Active-brightgreen">
  </span>
  <span style="display:inline-block; margin:4px;">
    <img alt="featured: NSS" src="https://img.shields.io/badge/featured-NSS-darkgreen">
  </span>
</div>


## Introduction:
RadNet it is composed of 2 LSTM (Long-Short Term Memory) layers that helps the model to identify patterns from the dataset, that was trained on ([lucazsh/RadNet](https://huggingface.co/lucazsh/RadNet)), which will facilitate the prediction of the daily radiation amount as well as solar storms in LEO (Low Earth Orbit). This model was also featured in the __National Space Society (NSS) contest__ under the project __Aletheia__.

The radiation data was extracted from the NASA OSDR EDA API (https://visualization.osdr.nasa.gov/eda/), from the RR's missions (RR-1, RR-3, RR-4, RR-6, RR-8, RR-9, RR-12, RR-17, and RR-19).

## Installation
To install the dependencies, you need to make sure you have Python 3.10+ installed on your system. If not, you can download it from [python.org](https://www.python.org/).

Install dependencies:                                          
```bash
pip install numpy json torch
```

## Code:

Below is the Python code that runs the RadNet model and displays the daily radiation dose and solar storm: 
```
import json
import torch
import torch.nn as nn
import numpy as np

class RadNet(nn.Module):
    def __init__(self, input_size=2, hidden_size=64, num_layers=2, output_size=2):
        super(RadNet, self).__init__()
        self.rnn = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True,
                           dropout=0.2)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        # x = [batch_size, sequence_length, input_size]
        out, _ = self.rnn(x)  # [batch_size, sequence_length, hidden_size]
        return self.fc(out[:, -1, :])  # [batch_size, output_size]

def main():
    path = "./RadNet.pth"  # path to the pre-trained RadNet checkpoint
    data_path = "test.json"  # path to the JSON file with test data

    # load the data from JSON
    with open(data_path, 'r') as f:
        data = json.load(f)

    # load the checkpoint to the preferred device, in our case cpu
    checkpoint = torch.load(path, weights_only=False, map_location=torch.device('cpu'))
    cfg = checkpoint["config"]
    mean = checkpoint["mean"]
    std = checkpoint["std"]

    model = RadNet(hidden_size=64, num_layers=2)
    model.load_state_dict(checkpoint["model_state_dict"])
    model.eval()

    tmp_data = []
    for d in data:
        solar_storm = d.get("solar_storm_score", 0.0)
        daily_radiation = d.get("sv_per_day_mSv", 0.0)
        tmp_data.append([solar_storm, daily_radiation])

    raw_data = np.array(tmp_data, dtype=float)

    print(f"RadNet was trained with a sequence of: {cfg['seq_length']} days.")
    print(f"Available data in the JSON dataset: {len(raw_data)} days.")

    user_seq_len = int(input(f"Enter the number of days: "))
    if len(raw_data) < user_seq_len:
        print(f"You do not have enough data in the JSON file for {user_seq_len} days.")
        return

    input_seq = raw_data[-user_seq_len:]
    input_norm = (input_seq - mean) / (std + 1e-6)
    input_tensor = torch.tensor(input_norm, dtype=torch.float32).unsqueeze(0)

    # predict using the model
    with torch.no_grad():
        pred_norm = model(input_tensor).numpy()[0]
        pred_values = (pred_norm * (std + 1e-6)) + mean

    if user_seq_len == 1:
        print(f"Prediction based on the last day:")
    else:
        print(f"Prediction based on the last {user_seq_len} days:")

    print(f"Solar storm score: {pred_values[0]:.6f}")
    print(f"Radiation (mSv): {pred_values[1]:.6f}")

if __name__ == "__main__":
    main()
```