I am trying to optimize the hyperparameters of a simple CNN model using Bayesian optimization, but I have been getting an error that I am trying to fix. Can someone please help?
My code:
from sklearn.model_selection import train_test_split
from sklearn import datasets
from keras.models import Sequential
iris = datasets.load_iris()
X = iris.data
y = iris.target
def create_model(num_filters, kernel_size, activation_index):
# Create a CNN model with the specified hyperparameters
activation_map = {0: 'relu', 1: 'sigmoid'}
activation = activation_map[int(activation_index)]
model = Sequential()
model.add(Conv2D(num_filters, kernel_size, activation=activation, input_shape=(4, 1)))
model.add(MaxPooling2D())
model.add(Flatten())
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
def objective_function(num_filters, kernel_size, activation_index):
model = create_model(num_filters, kernel_size, activation_index)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model.fit(X_train, y_train, epochs=10, verbose=0)
loss, accuracy = model.evaluate(X_test, y_test, verbose=0)
return accuracy
bounds = {
'num_filters': (32, 128),
'kernel_size': (3, 7),
'activation_index': (0, 1)
}
optimizer = BayesianOptimization(objective_function, bounds)
optimizer.maximize(init_points=5, n_iter=10)
best_params = optimizer.maximize(init_points=5, n_iter=10)
print("Best hyperparameter values:", best_params['x'])
print("Best model accuracy:", best_params['fun'])
The error message:
ValueError: The `kernel_size` argument must be a tuple of 2 integers. Received: 3.048666679718899