-
Notifications
You must be signed in to change notification settings - Fork 0
/
bayesianOptimizationCNN.py
127 lines (101 loc) · 4.42 KB
/
bayesianOptimizationCNN.py
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
from keras_model import CNN
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
# import GPyOpt as GP
from bayes_opt import BayesianOptimization, UtilityFunction
from tqdm import tqdm
from itertools import product
from sklearn.gaussian_process import GaussianProcessRegressor as GPR
# Load data
# X = np.load("image_data.npy")
X = np.load("image_data_gray.npy")
y = np.load("labels.npy")
SHAPE = np.shape(X[0])
seed = 42
n_iter = 3
BATCH_SIZE = 80
EPOCHS = 20
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=seed)
def blackBoxFunction(dropRate1,dropRate2):
model = CNN(dropRate1,dropRate2,input_shape=SHAPE)
model.train_opt(X_train, y_train, X_test, y_test, batch_size=BATCH_SIZE, epochs = EPOCHS, verbose=0)
loss, acc = model.evaluate(X_test,y_test)
return acc
# # with bayes_opt simple approach
bounds2D = {"dropRate1":(0.0,0.5),"dropRate2":(0.0,0.5)}
#optimizer = BayesianOptimization(f=blackBoxFunction, pbounds=bounds2D, verbose=2, random_state=seed)
optimizer = BayesianOptimization(f=blackBoxFunction, pbounds=bounds2D, verbose=2)
print("###########Starting optimization##############")
#optimizer.maximize(init_points = 5, n_iter = n_iter)
### Broken down optimization
utility_list = []
#utility_function = UtilityFunction(kind="ucb", kappa=5, xi=0)
# Random initialization
optimizer.maximize(init_points = 2, n_iter = 0)
print("Random done")
# Iter loop
x1 = np.linspace(0, 0.5, num=51)
x2 = np.linspace(0, 0.5, num=51)
x1x2 = np.array(list(product(x1, x2)))
for i in range(n_iter):
optimizer.maximize(init_points = 0, n_iter = 1)
utility_function = UtilityFunction(kind="ucb", kappa=5, xi=0) # Kappa 5?
utility = utility_function.utility(x1x2, optimizer._gp, 1)
gpr_pred = GPR.predict()
print(f"Utility {i}= {utility}")
pred = np.reshape(utility, (51,51))
print(f"Pred {i}= {pred}")
utility_list.append(pred)
# Save utility
np.save("utility1.npy", np.array(utility_list))
# Plot
#X0p, X1p = x1x2[:,0].reshape(51,51), x1x2[:,1].reshape(51,51)
#fig = plt.figure(figsize=(10,8))
#ax = fig.add_subplot(111)
#ax.pcolormesh(X0p, X1p, utility)
#ax.contourf(X0p, X1p, utility)
#plt.colorbar()
#plt.show()
print()
# ### fra: https://github.com/fmfn/BayesianOptimization/blob/master/examples/visualization.ipynb
# def posterior(optimizer, x_obs, y_obs, grid):
# optimizer._gp.fit(x_obs, y_obs)
# mu, sigma = optimizer._gp.predict(grid, return_std=True)
# return mu, sigma
# ### fra: https://github.com/fmfn/BayesianOptimization/blob/master/examples/visualization.ipynb
# def plot_gp(optimizer, x, y):
# fig = plt.figure(figsize=(16, 10))
# steps = len(optimizer.space)
# fig.suptitle(
# 'Gaussian Process and Utility Function After {} Steps'.format(steps),
# fontdict={'size':30}
# )
# gs = gridspec.GridSpec(2, 1, height_ratios=[3, 1])
# axis = plt.subplot(gs[0])
# acq = plt.subplot(gs[1])
# x_obs = np.array([[res["params"]["x"]] for res in optimizer.res])
# y_obs = np.array([res["target"] for res in optimizer.res])
# mu, sigma = posterior(optimizer, x_obs, y_obs, x)
# axis.plot(x, y, linewidth=3, label='Target')
# axis.plot(x_obs.flatten(), y_obs, 'D', markersize=8, label=u'Observations', color='r')
# axis.plot(x, mu, '--', color='k', label='Prediction')
# axis.fill(np.concatenate([x, x[::-1]]),
# np.concatenate([mu - 1.9600 * sigma, (mu + 1.9600 * sigma)[::-1]]),
# alpha=.6, fc='c', ec='None', label='95% confidence interval')
# axis.set_xlim((-2, 10))
# axis.set_ylim((None, None))
# axis.set_ylabel('f(x)', fontdict={'size':20})
# axis.set_xlabel('x', fontdict={'size':20})
# utility_function = UtilityFunction(kind="ucb", kappa=5, xi=0)
# utility = utility_function.utility(x, optimizer._gp, 0)
# acq.plot(x, utility, label='Utility Function', color='purple')
# acq.plot(x[np.argmax(utility)], np.max(utility), '*', markersize=15,
# label=u'Next Best Guess', markerfacecolor='gold', markeredgecolor='k', markeredgewidth=1)
# acq.set_xlim((-2, 10))
# acq.set_ylim((0, np.max(utility) + 0.5))
# acq.set_ylabel('Utility', fontdict={'size':20})
# acq.set_xlabel('x', fontdict={'size':20})
# axis.legend(loc=2, bbox_to_anchor=(1.01, 1), borderaxespad=0.)
# acq.legend(loc=2, bbox_to_anchor=(1.01, 1), borderaxespad=0.)
# plot_gp(optimizer, )