Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added docs/getting_started/results/example.h5
Binary file not shown.
Binary file added docs/getting_started/training_data/example.npy
Binary file not shown.
1,558 changes: 947 additions & 611 deletions docs/getting_started/tutorial.ipynb

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ pybind11
tornado
matplotlib
lightkurve>=2.0.0
numpy
sklearn
numpy<2,>=1.21
scikit-learn
more-itertools
scipy!=1.4.1
poetry
3 changes: 1 addition & 2 deletions stella/download_nn_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,7 @@ def download_catalog(self):

Vizier.ROW_LIMIT = -1

catalog_list = Vizier.find_catalogs('TESS flares sectors')
catalogs = Vizier.get_catalogs(catalog_list.keys())
catalogs = Vizier.get_catalogs('J/AJ/159/60')

self.flare_table = catalogs[1]
self.flare_table.rename_column('_tab2_5', 'tpeak')
Expand Down
68 changes: 55 additions & 13 deletions stella/neural_network.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,40 @@ def __init__(self, output_dir, ds=None,

self.output_dir = output_dir

# Clean the training and validation data
self.clean_data()


def clean_data(self):
"""
Removes NaN values from the traning and validation data, and replaces the values
with zeros
"""
# Clean training data
valid_indices_train = ~np.isnan(self.ds.train_data).any(axis=(1, 2))
self.ds.train_data = self.ds.train_data[valid_indices_train]
self.ds.train_labels = self.ds.train_labels[valid_indices_train]

# Clean validation data
valid_indices_val = ~np.isnan(self.ds.val_data).any(axis=(1, 2))
self.ds.val_data = self.ds.val_data[valid_indices_val]
self.ds.val_labels = self.ds.val_labels[valid_indices_val]

# Clean additional validation attributes
self.ds.val_ids = self.ds.val_ids[valid_indices_val]
self.ds.val_tpeaks = self.ds.val_tpeaks[valid_indices_val]

# Replace NaN values with zero
self.ds.train_data = np.nan_to_num(self.ds.train_data, nan=0.0)
self.ds.val_data = np.nan_to_num(self.ds.val_data, nan=0.0)

# Replace NaN values with the mean of the corresponding feature
col_mean_train = np.nanmean(self.ds.train_data, axis=1, keepdims=True)
self.ds.train_data = np.where(np.isnan(self.ds.train_data), col_mean_train, self.ds.train_data)

col_mean_val = np.nanmean(self.ds.val_data, axis=1, keepdims=True)
self.ds.val_data = np.where(np.isnan(self.ds.val_data), col_mean_val, self.ds.val_data)


def create_model(self, seed):
"""
Expand Down Expand Up @@ -117,7 +151,7 @@ def create_model(self, seed):
# CONVOLUTIONAL LAYERS
model.add(tf.keras.layers.Conv1D(filters=filter1, kernel_size=7,
activation='relu', padding='same',
input_shape=(self.cadences, 1)))
input_shape=(int(self.cadences), 1)))
model.add(tf.keras.layers.MaxPooling1D(pool_size=2))
model.add(tf.keras.layers.Dropout(dropout))
model.add(tf.keras.layers.Conv1D(filters=filter2, kernel_size=3,
Expand Down Expand Up @@ -517,30 +551,38 @@ def identify_gaps(t):

model = keras.models.load_model(modelname)

self.model = model
# Create and compile the model
input_shape = model.input_shape

input_layer = keras.layers.Input(shape=input_shape[1:])
new_model = keras.models.Model(inputs=input_layer, outputs=model(input_layer))

new_model.compile(optimizer = self.optimizer,
loss = self.loss,
metrics = self.metrics)

self.model = new_model

# GETS REQUIRED INPUT SHAPE FROM MODEL
cadences = model.input.shape[1]
print(cadences)
cad_pad = cadences/2

# REFORMATS FOR A SINGLE LIGHT CURVE PASSED IN
try:
times[0][0]
except:
times = [times]
if not isinstance(times[0], np.ndarray):
times = [times]
fluxes = [fluxes]
errs = [errs]
errs = [errs]


predictions = []
pred_t, pred_f, pred_e = [], [], []

for j in tqdm(range(len(times))):
time = times[j] + 0.0
lc = fluxes[j] / np.nanmedian(fluxes[j]) # MUST BE NORMALIZED
err = errs[j] + 0.0
time = np.array(times[j], dtype=float)
lc = np.array(fluxes[j], dtype=float) / np.nanmedian(fluxes[j]) # MUST BE NORMALIZED
err = np.array(errs[j], dtype=float) + 0.0

q = ( (np.isnan(time) == False) & (np.isnan(lc) == False))
q = (~np.isnan(time)) & (~np.isnan(lc))
time, lc, err = time[q], lc[q], err[q]

# APPENDS MASKED LIGHT CURVES TO KEEP TRACK OF
Expand Down Expand Up @@ -569,4 +611,4 @@ def identify_gaps(t):
self.predict_time = np.array(pred_t)
self.predict_flux = np.array(pred_f)
self.predict_err = np.array(pred_e)
self.predictions = np.array(predictions)
self.predictions = np.array(predictions)