Skip to content

Commit f6559ca

Browse files
Merge pull request #32 from akhilsinghal1234/ogle
Added OGLE variable star classification
2 parents eb40846 + 4b3175b commit f6559ca

File tree

3 files changed

+106
-32
lines changed

3 files changed

+106
-32
lines changed

mirapy/classifiers/models.py

Lines changed: 74 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
from keras.optimizers import *
33
from keras.models import load_model, Sequential
4+
# from keras.layers import Input, Dense, LSTM, Dropout
45
from keras.layers import *
56
import matplotlib.pyplot as plt
67

@@ -10,6 +11,7 @@ def __init__(self):
1011
self.model = None
1112
self.optimizer = None
1213
self.activation = None
14+
self.history = None
1315

1416
def compile(self, optimizer, loss='mean_squared_error'):
1517
pass
@@ -20,8 +22,8 @@ def save_model(self, model_name, path):
2022
def load_model(self, model_name, path):
2123
pass
2224

23-
def train(self, x_train, y_train, epochs=100, batch_size=32,
24-
validation_split=0.1):
25+
def train(self, x_train, y_train, epochs, batch_size, reset_weights,
26+
class_weight, validation_data, verbose):
2527
pass
2628

2729
def predict(self, x):
@@ -45,10 +47,8 @@ class XRayBinaryClassifier(Classifier):
4547
"""
4648
build pre-worked model
4749
"""
48-
def __init__(self, activation='relu',
49-
optimizer=Adam(lr=0.0001, decay=1e-6)):
50+
def __init__(self, activation='relu'):
5051
self.activation = activation
51-
self.optimizer = optimizer
5252

5353
model = Sequential()
5454
model.add(Dense(32, input_shape=(3,), activation=self.activation))
@@ -57,13 +57,27 @@ def __init__(self, activation='relu',
5757
model.add(Dense(3, activation='softmax'))
5858
self.model = model
5959

60-
def compile(self, loss='mean_squared_error'):
60+
def compile(self, optimizer=Adam(lr=0.0001, decay=1e-6),
61+
loss='mean_squared_error'):
6162
"""
6263
build the model
6364
"""
65+
self.optimizer = optimizer
6466
self.model.compile(self.optimizer,
6567
loss=loss, metrics=['accuracy'])
6668

69+
def train(self, x_train, y_train, epochs=50, batch_size=100,
70+
reset_weights=True, class_weight=None, validation_data=None,
71+
verbose=1):
72+
if reset_weights:
73+
self.reset()
74+
75+
self.history = self.model.fit(x_train, y_train, batch_size=batch_size,
76+
epochs=epochs,
77+
validation_data=validation_data,
78+
class_weight=class_weight, shuffle=True,
79+
verbose=verbose)
80+
6781
def save_model(self, model_name, path='models/'):
6882
"""
6983
save model
@@ -81,27 +95,16 @@ def load_model(self, model_name, path='models/'):
8195
else:
8296
raise FileNotFoundError("Model does not exists")
8397

84-
def train(self, x_train, y_train, epochs=100, batch_size=32,
85-
validation_split=0.1):
86-
87-
if not isinstance(x_train, np.ndarray) and\
88-
isinstance(y_train, np.ndarray):
89-
raise ValueError('Input array should be numpy arrays')
90-
91-
self.model.fit(x_train, y_train, epochs=epochs, shuffle=True,
92-
batch_size=batch_size,
93-
validation_split=validation_split)
94-
9598
def test(self, x_test):
9699
return self.model.predict_classes(x_test)
97100

98101

99102
class AtlasVarStarClassifier(Classifier):
100103

101-
def __init__(self, activation='relu', optimizer=Adam(lr=0.01, decay=0.01),
102-
input_size=22, num_classes=9):
104+
def __init__(self, activation='relu', input_size=22, num_classes=9):
103105
self.activation = activation
104-
self.optimizer = optimizer
106+
self.history = None
107+
105108
model = Sequential()
106109
model.add(Dense(64, input_shape=(input_size,),
107110
activation=self.activation))
@@ -111,13 +114,27 @@ def __init__(self, activation='relu', optimizer=Adam(lr=0.01, decay=0.01),
111114
model.add(Dense(num_classes, activation='softmax'))
112115
self.model = model
113116

114-
def compile(self, loss='mean_squared_error'):
117+
def compile(self, optimizer=Adam(lr=0.01, decay=0.01),
118+
loss='mean_squared_error'):
115119
"""
116120
build the model
117121
"""
122+
self.optimizer = optimizer
118123
self.model.compile(self.optimizer,
119124
loss=loss, metrics=['accuracy'])
120125

126+
def train(self, x_train, y_train, epochs=50, batch_size=100,
127+
reset_weights=True, class_weight=None, validation_data=None,
128+
verbose=1):
129+
if reset_weights:
130+
self.reset()
131+
132+
self.history = self.model.fit(x_train, y_train, batch_size=batch_size,
133+
epochs=epochs,
134+
validation_data=validation_data,
135+
class_weight=class_weight, shuffle=True,
136+
verbose=verbose)
137+
121138
def save_model(self, model_name, path='models/'):
122139
"""
123140
save model
@@ -135,19 +152,45 @@ def load_model(self, model_name, path='models/'):
135152
else:
136153
raise FileNotFoundError("Model does not exists")
137154

138-
def train(self, x_train, y_train, epochs=100, batch_size=32,
139-
validation_split=0.1):
155+
def test(self, x_test):
156+
return self.model.predict_classes(x_test)
140157

141-
if not isinstance(x_train, np.ndarray) and\
142-
isinstance(y_train, np.ndarray):
143-
raise ValueError('Input array should be numpy arrays')
144158

145-
self.model.fit(x_train, y_train, epochs=epochs, shuffle=True,
146-
batch_size=batch_size,
147-
validation_split=validation_split)
159+
class OGLEClassifier(Classifier):
148160

149-
def test(self, x_test):
150-
return self.model.predict_classes(x_test)
161+
def __init__(self, activation='relu', input_size=50, num_classes=5):
162+
self.activation = activation
163+
self.history = None
164+
165+
model = Sequential()
166+
model.add(LSTM(units=64, input_shape=(input_size, 1)))
167+
model.add(Dense(64, activation=self.activation))
168+
model.add(Dropout(0.2))
169+
model.add(Dense(16, activation=self.activation))
170+
model.add(Dense(num_classes, activation='softmax'))
171+
self.model = model
172+
173+
def compile(self, optimizer='adam', loss='categorical_crossentropy'):
174+
"""
175+
build the model
176+
"""
177+
self.optimizer = optimizer
178+
self.model.compile(self.optimizer, loss=loss, metrics=['accuracy'])
179+
180+
def train(self, x_train, y_train, epochs=50, batch_size=100,
181+
reset_weights=True, class_weight=None, validation_data=None,
182+
verbose=1):
183+
if reset_weights:
184+
self.reset()
185+
186+
self.history = self.model.fit(x_train, y_train, batch_size=batch_size,
187+
epochs=epochs,
188+
validation_data=validation_data,
189+
class_weight=class_weight, shuffle=True,
190+
verbose=verbose)
191+
192+
def predict(self, x):
193+
return self.model.predict_classes(x)
151194

152195

153196
class HTRU1Classifier(Classifier):

mirapy/data/load_dataset.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,37 @@ def load_atlas_star_data(path, test_split, standard_scaler=True,
136136
return x_train, y_train, x_test, y_test
137137

138138

139+
# handle class inequality
140+
def load_ogle_dataset(path, classes, test_split=0.2, time_len=50, pad=False):
141+
mag, y = [], []
142+
for class_ in classes:
143+
folder = path + '/' + class_ + '/I'
144+
for file in os.listdir(folder):
145+
num_lines = sum(1 for line in open(folder + '/' + file))
146+
mag_i, j = [0 for i in range(time_len)], 0
147+
148+
if not pad and num_lines < time_len:
149+
continue
150+
for line in open(folder + '/' + file):
151+
try:
152+
_, b, _ = line.split(' ')
153+
except Exception:
154+
break
155+
mag_i[j] = float(b)
156+
j += 1
157+
if j is time_len or j is num_lines:
158+
mag.append(np.array(mag_i))
159+
y.append(classes.index(class_))
160+
break
161+
162+
mag = np.array(mag)
163+
y = np.array(y)
164+
mag = mag.reshape(mag.shape[0], mag.shape[1], 1)
165+
x_train, x_test, y_train, y_test = \
166+
train_test_split(mag, y, test_size=test_split, random_state=42)
167+
return x_train, y_train, x_test, y_test
168+
169+
139170
def load_htru1_data(data_dir='htru1-batches-py'):
140171
x_train = None
141172
y_train = []

0 commit comments

Comments
 (0)