diff --git a/labworks/LW2/lab02_lib.py b/labworks/LW2/lab02_lib.py index ec90383..2a0d382 100644 --- a/labworks/LW2/lab02_lib.py +++ b/labworks/LW2/lab02_lib.py @@ -29,12 +29,14 @@ from pandas import DataFrame from sklearn.metrics import precision_score, recall_score, f1_score, confusion_matrix from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Activation +from tensorflow.keras.callbacks import Callback visual = True verbose_show = False + # generate 2d classification dataset def datagen(x_c, y_c, n_samples, n_features): @@ -91,8 +93,27 @@ class EarlyStoppingOnValue(tensorflow.keras.callbacks.Callback): ) return monitor_value + +class VerboseEveryNEpochs(Callback): + def __init__(self, every_n_epochs=1000, verbose=1): + super().__init__() + self.every_n_epochs = every_n_epochs + self.verbose = verbose + + def on_epoch_end(self, epoch, logs=None): + if (epoch + 1) % self.every_n_epochs == 0: + if self.verbose: + print(f"\nEpoch {epoch + 1}/{self.params['epochs']}") + if logs: + log_str = ", ".join([f"{k}: {v:.4f}" for k, v in logs.items()]) + print(f" - {log_str}") + + #создание и обучение модели автокодировщика -def create_fit_save_ae(cl_train, ae_file, irefile, epohs, verbose_show, patience): +def create_fit_save_ae(cl_train, ae_file, irefile, epohs, verbose_show, patience, **kwargs): + verbose_every_n_epochs = kwargs.get('verbose_every_n_epochs', 1000) + early_stopping_delta = kwargs.get('early_stopping_delta', 0.01) + early_stopping_value = kwargs.get('early_stopping_value', 0.0001) size = cl_train.shape[1] #ans = '2' @@ -140,22 +161,28 @@ def create_fit_save_ae(cl_train, ae_file, irefile, epohs, verbose_show, patience optimizer = tensorflow.keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False) ae.compile(loss='mean_squared_error', optimizer=optimizer) - error_stop = 0.0001 epo = epohs - early_stopping_callback_on_error = EarlyStoppingOnValue(monitor='loss', baseline=error_stop) + + verbose = 1 if verbose_show else 0 + + early_stopping_callback_on_error = EarlyStoppingOnValue(monitor='loss', baseline=early_stopping_value) early_stopping_callback_on_improving = tensorflow.keras.callbacks.EarlyStopping(monitor='loss', - min_delta=0.0001, patience = patience, - verbose=1, mode='auto', + min_delta=early_stopping_delta, patience = patience, + verbose=verbose, mode='min', baseline=None, - restore_best_weights=False) + restore_best_weights=True) history_callback = tensorflow.keras.callbacks.History() - verbose = 1 if verbose_show else 0 + history_object = ae.fit(cl_train, cl_train, batch_size=cl_train.shape[0], epochs=epo, - callbacks=[early_stopping_callback_on_error, history_callback, - early_stopping_callback_on_improving], + callbacks=[ + early_stopping_callback_on_error, + history_callback, + early_stopping_callback_on_improving, + VerboseEveryNEpochs(every_n_epochs=verbose_every_n_epochs), + ], verbose=verbose) ae_trainned = ae ae_pred = ae_trainned.predict(cl_train) @@ -538,4 +565,4 @@ def ire_plot(title, IRE_test, IREth, ae_name): plt.gcf().savefig('out/IRE_' + title + ae_name + '.png') plt.show() - return \ No newline at end of file + return