model / SCA.py
mayss14's picture
Create SCA.py
aa1b7ba verified
import numpy as np
from cnn_model import build_cnn_model
# -------------------------
# Fonction objectif pour SCA
# -------------------------
def objective_function(x, X_train, y_train):
filter1 = int(x[0])
filter2 = int(x[1])
filter3 = int(x[2])
learning_rate = float(x[3])
dropout = float(x[4])
model = build_cnn_model(
input_shape=(X_train.shape[1], X_train.shape[2]),
num_classes=y_train.shape[1],
filter1=filter1,
filter2=filter2,
filter3=filter3,
learning_rate=learning_rate,
dropout=dropout
)
history = model.fit(
X_train, y_train,
validation_split=0.2,
epochs=3, # rapide pour optimisation
batch_size=32,
verbose=0
)
val_acc = history.history['val_accuracy'][-1]
return 1 - val_acc # minimiser 1 - précision
# -------------------------
# Implémentation simple de SCA
# -------------------------
def devsca(objf, lb, ub, dim, N, T, X_train, y_train):
X = np.random.uniform(0, 1, (N, dim)) * (np.array(ub) - np.array(lb)) + np.array(lb)
fitness = np.array([objf(ind, X_train, y_train) for ind in X])
best_idx = np.argmin(fitness)
best_X = X[best_idx].copy()
best_fit = fitness[best_idx]
convergence_curve = []
for t in range(T):
r1 = np.linspace(2, 0, T)[t] # diminue avec le temps
for i in range(N):
for j in range(dim):
r2 = 2 * np.pi * np.random.rand()
r3 = 2 * np.random.rand()
r4 = np.random.rand()
if r4 < 0.5:
X[i, j] = X[i, j] + r1 * np.sin(r2) * abs(r3 * best_X[j] - X[i, j])
else:
X[i, j] = X[i, j] + r1 * np.cos(r2) * abs(r3 * best_X[j] - X[i, j])
X[i] = np.clip(X[i], lb, ub)
fit = objf(X[i], X_train, y_train)
if fit < best_fit:
best_fit = fit
best_X = X[i].copy()
convergence_curve.append(best_fit)
print(f"Iteration {t+1}/{T} | Best Accuracy: {1 - best_fit:.4f}")
return best_X, best_fit, convergence_curve