import optuna import numpy as np import pandas as pd import json import tensorflow as tf from tensorflow.compat.v1 import ConfigProto from tensorflow.compat.v1 import InteractiveSession from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Input, Bidirectional, LSTM, Dropout, Dense from tensorflow.keras.optimizers import Adam from optuna.integration import TFKerasPruningCallback import pickle from optuna.visualization import plot_optimization_history import optuna.visualization as ov from optuna.trial import TrialState config = ConfigProto() config.gpu_options.allow_growth = True session = InteractiveSession(config=config) """### **Load data**""" # Load dữ liệu từ file pickle with open('data/features_162k_phobertbase.pkl', 'rb') as f: data_dict = pickle.load(f) # Trích xuất các đặc trưng và nhãn từ dictionary X_train = np.array(data_dict['X_train']) X_val = np.array(data_dict['X_val']) X_test = np.array(data_dict['X_test']) y_train = data_dict['y_train'] y_val = data_dict['y_val'] y_test = data_dict['y_test'] y_train = y_train.values.astype(int) y_test = y_test.values.astype(int) y_val = y_val.values.astype(int) """##**Build Model**""" # Define the BiLSTM model architecture def build_bilstm_model(lstm_units_1, lstm_units_2, dense_units, dropout_rate, learning_rate): model = Sequential() model.add(Input(shape=(X_train.shape[1], X_train.shape[2]))) # Lớp LSTM 1 với dropout model.add(Bidirectional(LSTM(lstm_units_1, return_sequences=True))) model.add(Dropout(dropout_rate)) # Lớp LSTM 2 với dropout model.add(Bidirectional(LSTM(lstm_units_2, return_sequences=False))) model.add(Dropout(dropout_rate)) # Lớp Dense với dropout và kích hoạt ReLU model.add(Dense(dense_units, activation='relu')) model.add(Dropout(dropout_rate)) # Lớp Dense cuối cùng với kích hoạt softmax model.add(Dense(y_train.shape[1], activation='softmax')) # Sử dụng tối ưu hóa Adam với learning rate được truyền vào optimizer = Adam(learning_rate=learning_rate) # Biên soạn mô hình model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy']) return model """##**Create objective**""" # Define the objective function for optimization def objective_bilstm(trial): lstm_units_1 = trial.suggest_int('lstm_units_1', 64, 512, step=32) lstm_units_2 = trial.suggest_int('lstm_units_2', lstm_units_1//2, lstm_units_1, step=32) dense_units = trial.suggest_int('dense_units', 64, 512, step=32) dropout_rate = trial.suggest_float('dropout_rate', 0.2, 0.5, step=0.1) learning_rate = trial.suggest_float('learning_rate', 1e-5, 1e-2, log=True) epochs = trial.suggest_int('epochs', 10, 30, step=10) batch_size = trial.suggest_int('batch_size', 64, 256, step=32) print(f"Trying hyperparameters: lstm_units_1={lstm_units_1}, lstm_units_2={lstm_units_2}, dense_units={dense_units}, " f"dropout_rate={dropout_rate}, learning_rate={learning_rate}, batch_size={batch_size}") model = build_bilstm_model(lstm_units_1, lstm_units_2, dense_units, dropout_rate, learning_rate) model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, validation_data=(X_val, y_val), callbacks=[TFKerasPruningCallback(trial, "val_loss")], verbose=1) _, accuracy = model.evaluate(X_test, y_test, verbose=0) return accuracy """##**Study to find hyperparameters**""" # Create an Optuna study for optimization study_bilstm = optuna.create_study(direction="maximize", sampler=optuna.samplers.TPESampler(), pruner=optuna.pruners.HyperbandPruner()) study_bilstm.optimize(lambda trial: objective_bilstm(trial), n_trials=100) # Save completed trials to a CSV file complete_trials = study_bilstm.trials_dataframe()[study_bilstm.trials_dataframe()['state'] == 'COMPLETE'] complete_trials.to_csv("assets/study_bilstm_256_trials.csv", index=False) # Extract the best hyperparameters best_hyperparameters_bilstm = study_bilstm.best_trial.params # Save the best hyperparameters to a JSON file with open('hyperparameters/BiLSTM_phobertbase.json', 'w') as file: json.dump(best_hyperparameters_bilstm, file) plot_optimization_history(study_bilstm) html_file_path = "images/study_bilstm_phobertbase_optimize_history.html" # Plot and save the optimization history plot as an HTML file ov.plot_optimization_history(study_bilstm).write_html(html_file_path) plot_optimization_history(study_bilstm)