Skip to content

Commit d269a1f

Browse files
committed
Try completing test with Keras
Also adds a classification test probably this will be overkill for GH actions but try it.
1 parent 367196e commit d269a1f

File tree

3 files changed

+64
-36
lines changed

3 files changed

+64
-36
lines changed

src/gurobi_ml/modeling/softmax.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,6 @@ def softmax(
197197
predictor_model.linear_predictor = linear_predictor_vars
198198

199199
exponentials = gp_model.addMVar(output.shape)
200-
exponentials = exponentials
201200
denominator = gp_model.addMVar((output.shape[0]), lb=epsilon)
202201

203202
num_gc = gp_model.NumGenConstrs

tests/test_keras/keras_cases.py

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@
44
55
"""
66

7-
import os
87
from abc import ABC, abstractmethod
98

9+
import tensorflow as tf
1010
import keras
1111

12+
try:
13+
HAS_NL_EXPR = True
14+
except ImportError:
15+
HAS_NL_EXPR = False
16+
1217

1318
def layers_as_string(layers):
1419
if isinstance(layers, str):
@@ -32,25 +37,11 @@ def __init__(
3237
self,
3338
dataset,
3439
):
35-
self.basedir = os.path.join(os.path.dirname(__file__), "..", "predictors")
3640
self.dataset = dataset
3741

3842
# Filled with get data if needed
3943
self._data = None
4044

41-
keras_version_file = f"{dataset}_keras_version"
42-
43-
try:
44-
with open(os.path.join(self.basedir, keras_version_file)) as file_in:
45-
version = file_in.read().strip()
46-
except FileNotFoundError:
47-
version = None
48-
if version != keras.__version__:
49-
print(f"Keras version changed. Regenerate predictors for {dataset}")
50-
self.build_all_predictors()
51-
with open(os.path.join(self.basedir, keras_version_file), "w") as file_out:
52-
print(keras.__version__, file=file_out)
53-
5445
def __iter__(self):
5546
return self.all_tested_layers.__iter__()
5647

@@ -69,39 +60,28 @@ def data(self):
6960
self.load_data()
7061
return self._data
7162

72-
def predictor_file(self, predictor):
73-
return f"{self.dataset}_{layers_as_string(predictor)}.keras"
74-
75-
def build_predictor(self, layers):
63+
def get_case(self, layers):
7664
"""Build model for one predictor"""
7765
X, y = self.data
7866
predictor = self.compile(layers)
7967
predictor.fit(X, y)
8068

81-
predictor.save(self.predictor_file(layers))
8269
return predictor
8370

84-
def build_all_predictors(self):
85-
"""Build all the predictor for this case.
86-
(Done when we have a new sklearn version)"""
87-
for predictor in self:
88-
self.build_predictor(predictor)
89-
90-
def get_case(self, predictor):
91-
filename = self.predictor_file(predictor)
92-
try:
93-
return keras.saving.load_model(os.path.join(self.basedir, filename))
94-
except ValueError:
95-
return self.build_predictor(predictor)
96-
9771

9872
class HousingCases(Cases):
9973
"""Base class to have cases for testing regression models on diabetes set
10074
10175
This is appropriate for testing a regression with a single output."""
10276

10377
def __init__(self):
104-
self.all_tested_layers = [[keras.layers.Dense(16, activation="relu")]]
78+
self.all_tested_layers = [
79+
[keras.layers.Dense(16, activation="relu")],
80+
]
81+
if HAS_NL_EXPR:
82+
self.all_tested_layers.append(
83+
[keras.layers.Dense(16, activation="sigmoid")],
84+
)
10585
super().__init__("housing")
10686
self.load_data()
10787

@@ -117,3 +97,37 @@ def compile(self, layers):
11797
)
11898
nn.compile(loss="mean_squared_error", optimizer="adam")
11999
return nn
100+
101+
102+
class MNISTCases(Cases):
103+
"""Base class to have cases for testing regression models on diabetes set
104+
105+
This is appropriate for testing a regression with a single output."""
106+
107+
def __init__(self):
108+
self.all_tested_layers = [
109+
[keras.layers.Dense(20, activation="relu")],
110+
]
111+
112+
if HAS_NL_EXPR:
113+
self.all_tested_layers += [
114+
[keras.layers.Dense(20, activation="sigmoid")],
115+
]
116+
super().__init__("housing")
117+
self.load_data()
118+
119+
def load_data(self):
120+
(X_train, y_train), (_, _) = keras.datasets.fashion_mnist.load_data()
121+
X_train = tf.reshape(tf.cast(X_train, tf.float32) / 255.0, [-1, 28 * 28])
122+
self._data = (X_train, y_train)
123+
124+
def compile(self, layers):
125+
nn = keras.models.Sequential(
126+
[keras.layers.InputLayer((28 * 28,))] + layers + [keras.layers.Dense(10)]
127+
)
128+
nn.compile(
129+
optimizer="adam",
130+
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
131+
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],
132+
)
133+
return nn

tests/test_keras/test_keras_formulations.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@
33
import keras
44
from joblib import load
55

6+
try:
7+
HAS_NL_EXPR = True
8+
except ImportError:
9+
HAS_NL_EXPR = False
10+
611
from ..fixed_formulation import FixedRegressionModel
7-
from .keras_cases import HousingCases
12+
from .keras_cases import HousingCases, MNISTCases
813

914
VERBOSE = False
1015

@@ -45,3 +50,13 @@ def test_housing_keras(self):
4550
onecase = {"predictor": regressor, "nonconvex": 0}
4651
self.do_one_case(onecase, X, 5, "all")
4752
self.do_one_case(onecase, X, 6, "pairs")
53+
54+
def test_mnist_keras(self):
55+
cases = MNISTCases()
56+
57+
X = cases._data[0].numpy()
58+
for case in cases:
59+
regressor = cases.get_case(case)
60+
onecase = {"predictor": regressor, "nonconvex": 0}
61+
self.do_one_case(onecase, X, 5, "all")
62+
self.do_one_case(onecase, X, 6, "pairs")

0 commit comments

Comments
 (0)