| """This file is for creating and training the neural network models for eye movement prediction. Also, this is for creating and training
|
| The in-out model which is for predicting whether the subject is looking inside of the screen or outside of the screen. To understand this
|
| module, you should know about how to build neural network models with keras and tensorflow"""
|
|
|
| from tensorflow.keras.layers import (Input, Conv2D, Flatten, MaxPooling2D,
|
| Dense, Concatenate)
|
| from tensorflow.keras.models import Model
|
| import numpy as np
|
| import os
|
| from tensorflow.keras.callbacks import EarlyStopping
|
| from tensorflow.keras.models import load_model
|
| from sklearn.preprocessing import StandardScaler
|
| from sklearn.utils import shuffle
|
| from joblib import dump as j_dump
|
| from joblib import load as j_load
|
| import random
|
| from codes.base import eyeing as ey
|
| from openpyxl import Workbook
|
|
|
|
|
| class Modeling():
|
| @staticmethod
|
| def create_io():
|
| """
|
| creating in-out model (a CNN model) using tensorflow and keras
|
|
|
| Parameters:
|
| None
|
|
|
| Returns:
|
| None
|
| """
|
|
|
| print("Starting to create an empty in_out model...")
|
| inp1_shape = (ey.EYE_SIZE[0], ey.EYE_SIZE[1]*2, 1)
|
| x2_chosen_features = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
|
| inp2_shape = (len(x2_chosen_features),)
|
|
|
| inp1 = Input(inp1_shape)
|
| layer = Conv2D(16, (11, 11), (1, 1), 'same', activation='relu')(inp1)
|
| layer = MaxPooling2D((2, 2), (2, 2))(layer)
|
| layer = Conv2D(32, (7, 7), (1, 1), 'same', activation='relu')(layer)
|
| layer = MaxPooling2D((2, 2), (2, 2))(layer)
|
| layer = Conv2D(64, (5, 5), (1, 1), 'same', activation='relu')(layer)
|
| layer = MaxPooling2D((2, 2), (2, 2))(layer)
|
| layer = Conv2D(128, (3, 3), (1, 1), activation='relu')(layer)
|
| layer = MaxPooling2D((2, 2), (2, 2))(layer)
|
| layer = Flatten()(layer)
|
| inp2 = Input(inp2_shape)
|
| layer = Concatenate()([layer, inp2])
|
| layer = Dense(256, 'relu')(layer)
|
| layer = Dense(128, 'relu')(layer)
|
| layer = Dense(32, 'relu')(layer)
|
| layer = Dense(8, 'relu')(layer)
|
| output_layer = Dense(1, "sigmoid")(layer)
|
| input_layers = [inp1, inp2]
|
| model = Model(inputs=input_layers, outputs=output_layer)
|
| model.compile(optimizer="adam", loss="binary_crossentropy", metrics="acc")
|
| print(model.summary())
|
| n_weights = np.sum([np.prod(v.get_shape()) for v in model.trainable_weights])
|
|
|
| mdl_num = ey.find_max_mdl(ey.io_raw_dir) + 1
|
| info = {"n_weights": n_weights,
|
| "input1_shape": inp1_shape,
|
| "input2_shape": inp2_shape,
|
| "x2_chosen_features": x2_chosen_features}
|
| mdl_name = ey.MDL + f"{mdl_num}"
|
| mdl_dir = ey.io_raw_dir + mdl_name + ".h5"
|
| model.save(mdl_dir)
|
| ey.save([info], ey.io_raw_dir, [mdl_name])
|
| print("\nEmpty in_out model created and saved to " + mdl_dir)
|
|
|
|
|
| @staticmethod
|
| def create_et():
|
| """
|
| Creating eye tracking model (CNN model) using tensorflow and keras. You can change the structure in following, as you want.
|
|
|
| Parameters:
|
| None
|
|
|
| Returns:
|
| None
|
| """
|
|
|
|
|
| print("Starting to create empty eye_tracking models...")
|
| inp1_shape = (ey.EYE_SIZE[0], ey.EYE_SIZE[1]*2, 1)
|
| x2_chosen_features = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
|
| inp2_shape = (len(x2_chosen_features),)
|
|
|
| inp1 = Input(inp1_shape)
|
| layer = Conv2D(16, (11, 11), (1, 1), 'same', activation='relu')(inp1)
|
| layer = MaxPooling2D((2, 2), (2, 2))(layer)
|
| layer = Conv2D(32, (7, 7), (1, 1), 'same', activation='relu')(layer)
|
| layer = MaxPooling2D((2, 2), (2, 2))(layer)
|
| layer = Conv2D(64, (5, 5), (1, 1), 'same', activation='relu')(layer)
|
| layer = MaxPooling2D((2, 2), (2, 2))(layer)
|
| layer = Conv2D(128, (3, 3), (1, 1), activation='relu')(layer)
|
| layer = MaxPooling2D((2, 2), (2, 2))(layer)
|
| layer = Flatten()(layer)
|
| inp2 = Input(inp2_shape)
|
| layer = Concatenate()([layer, inp2])
|
| layer = Dense(256, 'relu')(layer)
|
| layer = Dense(128, 'relu')(layer)
|
| layer = Dense(32, 'relu')(layer)
|
| layer = Dense(8, 'relu')(layer)
|
| out = Dense(1, 'linear')(layer)
|
| input_layers = [inp1, inp2]
|
| model = Model(inputs=input_layers, outputs=out)
|
| model.compile(optimizer='adam', loss='mse')
|
| print(model.summary())
|
| n_weights = np.sum([np.prod(v.get_shape()) for v in model.trainable_weights])
|
|
|
| mdl_num = ey.find_max_mdl(ey.et_raw_dir) + 1
|
| info = {"n_weights": n_weights,
|
| "input1_shape": inp1_shape,
|
| "input2_shape": inp2_shape,
|
| "x2_chosen_features": x2_chosen_features}
|
|
|
| mdl_name = ey.MDL + f"{mdl_num}"
|
| mdl_dir = ey.et_raw_dir + mdl_name + ".h5"
|
| model.save(mdl_dir)
|
| ey.save([info], ey.et_raw_dir, [mdl_name])
|
| print("\nEmpty eye_tracking model created and saved to " + mdl_dir)
|
|
|
| @staticmethod
|
| def train_io(
|
| subjects,
|
| models_list,
|
| min_max_brightness_ratio=[[0.65, 1.45]],
|
| r_train_list=[0.85],
|
| n_epochs_patience=[[160, 10]],
|
| save_scaler=False,
|
| show_model=False
|
| ):
|
| """
|
| Training the io models. This method uses the dataset in the io folder of subject's number folder. The parameters should be lists.
|
| So, you can train each model with several parameters and hyper parameters to see which one works better.
|
|
|
| Parameters:
|
| subjects: a list of subject numbers that you want to train the model with them.
|
| models_list: You can train several models at a same time. So, you can enter a list of model numbers
|
| min_max_brightness_ratio: To make the models robust to the brightness, the eyes images are multiplies into a number between two considered numbers
|
| r_train_list: The ratio for train dataset
|
| n_epochs_patience: The number of epochs and patience to intrupt training
|
| save_scaler: To save the scaler
|
| show_model: To show the model
|
|
|
| Returns:
|
| None
|
| """
|
| print("Starting to train in_out model...")
|
|
|
| x1_load = []
|
| x2_load = []
|
| y_load = []
|
| for sbj in subjects:
|
| data_io_dir = ey.create_dir([ey.subjects_dir, f"{sbj}", ey.IO])
|
| x1_load0, x2_load0, y_load0 = ey.load(data_io_dir, [ey.X1, ey.X2, ey.Y])
|
| for (x10, x20, y10) in zip(x1_load0[0], x2_load0[0], y_load0[0]):
|
| x1_load.append(x10)
|
| x2_load.append(x20)
|
| y_load.append(y10)
|
|
|
| x1_load = np.array(x1_load)
|
| x2_load = np.array(x2_load)
|
| y_load = np.array(y_load)
|
|
|
| n_smp = x1_load.shape[0]
|
| print(f"\nNumber of samples : {n_smp}")
|
|
|
|
|
| j = 1
|
| for mbr in min_max_brightness_ratio:
|
| x1_new = x1_load.copy()
|
| for (i, _) in enumerate(x1_load):
|
| r = random.uniform(mbr[0], mbr[1])
|
| x1_new[i] = (x1_new[i] * r).astype(np.uint8)
|
|
|
|
|
| for raw_mdl_num in models_list:
|
| info = ey.load(ey.io_raw_dir, [ey.MDL + f"{raw_mdl_num}"])[0]
|
| x2_chosen_features = info["x2_chosen_features"]
|
| x2_new = x2_load[:, x2_chosen_features]
|
|
|
| x1_shf, x2_shf, y_shf = shuffle(x1_new, x2_new, y_load)
|
|
|
| x1_scaler = ey.X1_SCALER
|
| x1 = x1_shf / x1_scaler
|
|
|
| x2_scaler = StandardScaler()
|
| x2 = x2_scaler.fit_transform(x2_shf)
|
|
|
| scalers = [x1_scaler, x2_scaler]
|
| if save_scaler:
|
| j_dump(scalers, ey.scalers_dir + f"scl_io_{len(x2_chosen_features)}.bin")
|
|
|
|
|
| for rt in r_train_list:
|
| n_train = int(rt * n_smp)
|
| x1_train, x2_train = x1[:n_train], x2[:n_train]
|
| x1_val, x2_val = x1[n_train:], x2[n_train:]
|
|
|
| y_train = y_shf[:n_train]
|
| y_val = y_shf[n_train:]
|
| print("\nTrain and val data shape:")
|
| print(x1_train.shape, x1_val.shape, x2_train.shape, x2_val.shape,
|
| y_train.shape, y_val.shape)
|
|
|
| x_train = [x1_train, x2_train]
|
| x_val = [x1_val, x2_val]
|
|
|
|
|
| for nep in n_epochs_patience:
|
|
|
| info["min_max_brightness_ratio"] = mbr
|
| info["r_train"] = rt
|
| info["n_epochs_patience"] = nep
|
| cb = EarlyStopping(patience=nep[1], verbose=1, restore_best_weights=True)
|
|
|
| raw_model_dir = ey.io_raw_dir + ey.MDL + f"{raw_mdl_num}.h5"
|
| print("\nLoading blink_in_out model from " + raw_model_dir)
|
| model = load_model(raw_model_dir)
|
| if show_model:
|
| print(model.summary())
|
|
|
| print(f"\n<<<<<<< {j}-model:{raw_mdl_num}-min_max_ratio:{mbr}-r_train:{rt}-epoch_patience:{nep} >>>>>>>>")
|
| model.fit(x_train,
|
| y_train,
|
| validation_data=(x_val, y_val),
|
| epochs=nep[0],
|
| callbacks=cb)
|
| train_loss = model.evaluate(x_train, y_train)
|
| val_loss = model.evaluate(x_val, y_val)
|
|
|
| info["train_loss"] = train_loss
|
| info["val_loss"] = val_loss
|
|
|
| trained_mdl_num = ey.find_max_mdl(ey.io_trained_dir) + 1
|
| mdl_name = ey.MDL + f'{trained_mdl_num}'
|
| ey.save([info], ey.io_trained_dir, [mdl_name])
|
| mdl_tr_dir = ey.io_trained_dir + mdl_name + ".h5"
|
| model.save(mdl_tr_dir)
|
| print("\nSaving in_out model in " + mdl_tr_dir)
|
| j += 1
|
|
|
|
|
| @staticmethod
|
| def train_et(
|
| subjects,
|
| models_list,
|
| min_max_brightness_ratio=[[0.65, 1.45]],
|
| r_train_list=[0.8],
|
| n_epochs_patience=[[100, 15]],
|
| shift_samples=None,
|
| blinking_threshold="d",
|
| save_scaler=False,
|
| show_model=False
|
| ):
|
| """
|
| Training the et (base) models. This method uses the dataset in the et folder of subject's number folder. The parameters should be lists.
|
| So, you can train each model with several parameters and hyper parameters to see which one works better.
|
|
|
| Parameters:
|
| subjects: a list of subject numbers that you want to train the model with them.
|
| models_list: You can train several models at a same time. So, you can enter a list of model numbers
|
| min_max_brightness_ratio: To make the models robust to the brightness, the eyes images are multiplies into a number between two considered numbers
|
| r_train_list: The ratio for train dataset
|
| n_epochs_patience: The number of epochs and patience to intrupt training
|
| shift_samples: To shift sample if there is a high delay
|
| blinking_threshold: It can have three types --> d: default, ao: app offered, uo: user offered
|
| save_scaler: To save the scaler
|
| show_model: To show the model
|
|
|
| Returns:
|
| None
|
| """
|
| print("Starting to train eye_tracking models...")
|
|
|
|
|
| x1_load = []
|
| x2_load = []
|
| y_load = []
|
| kk = 0
|
| for sbj in subjects:
|
| sbj_dir = ey.create_dir([ey.subjects_dir, f"{sbj}"])
|
| sbj_clb_dir = ey.create_dir([sbj_dir, ey.CLB])
|
|
|
| (
|
| sbj_x1_load,
|
| sbj_x2_load,
|
| sbj_y_load,
|
| sbj_t_mat,
|
| sbj_eyes_ratio
|
| ) = ey.load(sbj_clb_dir, [ey.X1, ey.X2, ey.Y, ey.T, ey.ER])
|
|
|
|
|
| if shift_samples:
|
| if shift_samples[kk]:
|
| ii = 0
|
| for (x11, x21, y1, t1, eyr1) in zip(sbj_x1_load, sbj_x2_load, sbj_y_load, sbj_t_mat, sbj_eyes_ratio):
|
| sbj_t_mat[ii] = t1[:-shift_samples[kk]]
|
| sbj_x1_load[ii] = x11[shift_samples[kk]:]
|
| sbj_x2_load[ii] = x21[shift_samples[kk]:]
|
| sbj_y_load[ii] = y1[:-shift_samples[kk]]
|
| sbj_eyes_ratio[ii] = eyr1[shift_samples[kk]:]
|
| ii += 1
|
|
|
| kk += 1
|
| sbj_er_dir = ey.create_dir([sbj_dir, ey.ER])
|
|
|
|
|
| sbj_blinking_threshold = ey.get_threshold(sbj_er_dir, blinking_threshold)
|
|
|
| sbj_blinking = ey.get_blinking(sbj_t_mat, sbj_eyes_ratio, sbj_blinking_threshold)[1]
|
|
|
| for (x11, x21, y1, b1) in zip(sbj_x1_load, sbj_x2_load, sbj_y_load, sbj_blinking):
|
| for (x10, x20, y0, b0) in zip(x11, x21, y1, b1):
|
| if not b0:
|
| x1_load.append(x10)
|
| x2_load.append(x20)
|
| y_load.append(y0)
|
| x1_load = np.array(x1_load)
|
| x2_load = np.array(x2_load)
|
| y_load = np.array(y_load)
|
| n_smp = x1_load.shape[0]
|
| print(f"\nNumber of samples : {n_smp}")
|
|
|
|
|
| j = 1
|
| for mbr in min_max_brightness_ratio:
|
| x1_new = x1_load.copy()
|
| for (i, _) in enumerate(x1_load):
|
| r = random.uniform(mbr[0], mbr[1])
|
| x1_new[i] = (x1_new[i] * r).astype(np.uint8)
|
|
|
|
|
| for raw_mdl_num in models_list:
|
| info = ey.load(ey.et_raw_dir, [ey.MDL + f"{raw_mdl_num}"])[0]
|
| x2_chosen_features = info["x2_chosen_features"]
|
| x2_new = x2_load[:, x2_chosen_features]
|
|
|
| x1_shf, x2_shf, y_hrz_shf, y_vrt_shf = shuffle(x1_new, x2_new, y_load[:, 0], y_load[:, 1])
|
|
|
| x1_scaler = ey.X1_SCALER
|
| x1 = x1_shf / x1_scaler
|
|
|
| x2_scaler = StandardScaler()
|
| x2 = x2_scaler.fit_transform(x2_shf)
|
| y_scaler = ey.Y_SCALER
|
|
|
| scalers = [x1_scaler, x2_scaler, y_scaler]
|
|
|
| if save_scaler:
|
| j_dump(scalers, ey.scalers_dir + f"scl_et_{len(x2_chosen_features)}.bin")
|
|
|
|
|
| for rt in r_train_list:
|
| n_train = int(rt * n_smp)
|
| x1_train, x2_train = x1[:n_train], x2[:n_train]
|
| x1_val, x2_val = x1[n_train:], x2[n_train:]
|
|
|
| y_hrz_train, y_vrt_train = y_hrz_shf[:n_train], y_vrt_shf[:n_train]
|
| y_hrz_val, y_vrt_val = y_hrz_shf[n_train:], y_vrt_shf[n_train:]
|
| print("\nTrain and val data shape:")
|
| print(x1_train.shape, x1_val.shape, x2_train.shape, x2_val.shape,
|
| y_hrz_train.shape, y_hrz_val.shape, y_vrt_train.shape, y_vrt_val.shape)
|
|
|
| x_train = [x1_train, x2_train]
|
| x_val = [x1_val, x2_val]
|
|
|
|
|
| for nep in n_epochs_patience:
|
|
|
| info["min_max_brightness_ratio"] = mbr
|
| info["r_train"] = rt
|
| info["n_epochs_patience"] = nep
|
| cb = EarlyStopping(patience=nep[1], verbose=1, restore_best_weights=True)
|
|
|
| raw_model_dir = ey.et_raw_dir + ey.MDL + f"{raw_mdl_num}.h5"
|
| print("\nLoading eye_tracking model from " + raw_model_dir)
|
| model_hrz = load_model(raw_model_dir)
|
| model_vrt = load_model(raw_model_dir)
|
| if show_model:
|
| print(model_hrz.summary())
|
|
|
| trained_mdl_num = ey.find_max_mdl(ey.et_trained_dir, b=-7) + 1
|
|
|
| print(f"\n<<<<<<< {j}-model-hrz:{raw_mdl_num}-min_max_ratio:{mbr}-r_train:{rt}-epoch_patience:{nep} >>>>>>>>")
|
| model_hrz.fit(x_train,
|
| y_hrz_train * y_scaler,
|
| validation_data=(x_val, y_hrz_val * y_scaler),
|
| epochs=nep[0],
|
| callbacks=cb)
|
| mdl_name = ey.MDL + f"{trained_mdl_num}"
|
| mdl_hrz_tr_dir = ey.et_trained_dir + mdl_name + "-hrz.h5"
|
| print("\nSaving horizontally eye_tracking model in " + mdl_hrz_tr_dir)
|
| model_hrz.save(mdl_hrz_tr_dir)
|
| hrz_train_loss = model_hrz.evaluate(x_train, y_hrz_train * y_scaler)
|
| hrz_val_loss = model_hrz.evaluate(x_val, y_hrz_val * y_scaler)
|
| info["hrz_train_loss"] = hrz_train_loss
|
| info["hrz_val_loss"] = hrz_val_loss
|
|
|
| print(f"\n<<<<<<< {j}-model-vrt:{raw_mdl_num}-min_max_ratio:{mbr}-r_train:{rt}-epoch_patience:{nep} >>>>>>>>")
|
| model_vrt.fit(x_train,
|
| y_vrt_train * y_scaler,
|
| validation_data=(x_val, y_vrt_val * y_scaler),
|
| epochs=nep[0],
|
| callbacks=cb)
|
| tr_model_vrt_dir = ey.et_trained_dir + mdl_name + f"-vrt.h5"
|
| print("Saving vertically eye_tracking model in " + tr_model_vrt_dir)
|
| model_vrt.save(tr_model_vrt_dir)
|
| vrt_train_loss = model_vrt.evaluate(x_train, y_vrt_train * y_scaler)
|
| vrt_val_loss = model_vrt.evaluate(x_val, y_vrt_val * y_scaler)
|
| info["vrt_train_loss"] = vrt_train_loss
|
| info["vrt_val_loss"] = vrt_val_loss
|
|
|
| ey.save([info], ey.et_trained_dir, [mdl_name])
|
|
|
| j += 1
|
|
|
|
|
| @staticmethod
|
| def get_models_information(io=True, raw=True, show_model=False):
|
| """
|
| To write the models information in an excel file. It gets the information from attached pickle file for each model.
|
| There are raw models and trained models in the io and the et.
|
|
|
| Parameters:
|
| io: If it's io or et
|
| raw: If the model is trained or not
|
| show_model: If you want to show the model
|
|
|
| Returns:
|
| None
|
| """
|
| wb = Workbook()
|
| ws = wb.active
|
| ws['A1'] = "# of model"
|
| ws['B1'] = "# of weights"
|
| ws['C1'] = "input 1 shape"
|
| ws['D1'] = "input 2 shape"
|
| ws['E1'] = "x2 chosen features"
|
| if io:
|
| if raw:
|
| files_name = os.listdir(ey.io_raw_dir)
|
| if files_name:
|
| for fn in files_name:
|
| if fn[-7:] == ".pickle":
|
| mdl_num = int(fn[3:-7])
|
| mdl_name = ey.MDL + f"{mdl_num}"
|
| if show_model:
|
| mdl_dir = ey.io_raw_dir + mdl_name + ".h5"
|
| mdl = load_model(mdl_dir)
|
| print(f"<<<<<<<<<<<<<< {mdl_dir} >>>>>>>>>>>>>>")
|
| print(mdl.summary())
|
| info = ey.load(ey.io_raw_dir, [mdl_name])[0]
|
|
|
| ws[f'A{mdl_num+1}'] = str(mdl_num)
|
| ws[f'B{mdl_num+1}'] = str(info['n_weights'])
|
| ws[f'C{mdl_num+1}'] = str(info['input1_shape'])
|
| ws[f'D{mdl_num+1}'] = str(info['input2_shape'])
|
| ws[f'E{mdl_num+1}'] = str(info['x2_chosen_features'])
|
| else:
|
| ws['F1'] = "min-Max brightness ratio"
|
| ws['G1'] = "r_train"
|
| ws['H1'] = "# of epochs and patience"
|
| ws['I1'] = "train loss"
|
| ws['J1'] = "val loss"
|
|
|
| files_name = os.listdir(ey.io_trained_dir)
|
| if files_name:
|
| for fn in files_name:
|
| if fn[-7:] == ".pickle":
|
| mdl_num = int(fn[3:-7])
|
| mdl_name = ey.MDL + f"{mdl_num}"
|
| if show_model:
|
| mdl_dir = ey.io_trained_dir + mdl_name + ".h5"
|
| mdl = load_model(mdl_dir)
|
| print(f"<<<<<<<<<<<<<< {mdl_dir} >>>>>>>>>>>>>>")
|
| print(mdl.summary())
|
| info = ey.load(ey.io_trained_dir, [mdl_name])[0]
|
|
|
| ws[f'A{mdl_num+1}'] = str(mdl_num)
|
| ws[f'B{mdl_num+1}'] = str(info['n_weights'])
|
| ws[f'C{mdl_num+1}'] = str(info['input1_shape'])
|
| ws[f'D{mdl_num+1}'] = str(info['input2_shape'])
|
| ws[f'E{mdl_num+1}'] = str(info['x2_chosen_features'])
|
| ws[f'F{mdl_num+1}'] = str(info['min_max_brightness_ratio'])
|
| ws[f'G{mdl_num+1}'] = str(info['r_train'])
|
| ws[f'H{mdl_num+1}'] = str(info['n_epochs_patience'])
|
| ws[f'I{mdl_num+1}'] = str(info['train_loss'])
|
| ws[f'J{mdl_num+1}'] = str(info['val_loss'])
|
|
|
| else:
|
| if raw:
|
| files_name = os.listdir(ey.et_raw_dir)
|
| if files_name:
|
| for fn in files_name:
|
| if fn[-7:] == ".pickle":
|
| mdl_num = int(fn[3:-7])
|
| mdl_name = ey.MDL + f"{mdl_num}"
|
| if show_model:
|
| mdl_dir = ey.et_raw_dir + mdl_name + ".h5"
|
| mdl = load_model(mdl_dir)
|
| print(f"<<<<<<<<<<<<<< {mdl_dir} >>>>>>>>>>>>>>")
|
| print(mdl.summary())
|
| info = ey.load(ey.et_raw_dir, [mdl_name])[0]
|
|
|
| ws[f'A{mdl_num+1}'] = str(mdl_num)
|
| ws[f'B{mdl_num+1}'] = str(info['n_weights'])
|
| ws[f'C{mdl_num+1}'] = str(info['input1_shape'])
|
| ws[f'D{mdl_num+1}'] = str(info['input2_shape'])
|
| ws[f'E{mdl_num+1}'] = str(info['x2_chosen_features'])
|
|
|
| else:
|
| ws['F1'] = "min-Max brightness ratio"
|
| ws['G1'] = "r_train"
|
| ws['H1'] = "# of epochs and patience"
|
| ws['I1'] = "model-hrz train loss"
|
| ws['J1'] = "model-hrz val loss"
|
| ws['K1'] = "model-vrt train loss"
|
| ws['L1'] = "model-vrt val loss"
|
|
|
| files_name = os.listdir(ey.et_trained_dir)
|
| if files_name:
|
| for fn in files_name:
|
| if fn[-7:] == ".pickle":
|
| mdl_num = int(fn[3:-7])
|
| mdl_name = ey.MDL + f"{mdl_num}"
|
| if show_model:
|
| mdl_dir = ey.et_trained_dir + mdl_name + "-hrz.h5"
|
| mdl = load_model(mdl_dir)
|
| print(f"<<<<<<<<<<<<<< {mdl_dir} >>>>>>>>>>>>>>")
|
| print(mdl.summary())
|
| info = ey.load(ey.et_trained_dir, [mdl_name])[0]
|
|
|
| ws[f'A{mdl_num+1}'] = str(mdl_num)
|
| ws[f'B{mdl_num+1}'] = str(info['n_weights'])
|
| ws[f'C{mdl_num+1}'] = str(info['input1_shape'])
|
| ws[f'D{mdl_num+1}'] = str(info['input2_shape'])
|
| ws[f'E{mdl_num+1}'] = str(info['x2_chosen_features'])
|
| ws[f'F{mdl_num+1}'] = str(info['min_max_brightness_ratio'])
|
| ws[f'G{mdl_num+1}'] = str(info['r_train'])
|
| ws[f'H{mdl_num+1}'] = str(info['n_epochs_patience'])
|
| ws[f'I{mdl_num+1}'] = str(info['hrz_train_loss'])
|
| ws[f'J{mdl_num+1}'] = str(info['hrz_val_loss'])
|
| ws[f'K{mdl_num+1}'] = str(info['vrt_train_loss'])
|
| ws[f'L{mdl_num+1}'] = str(info['vrt_val_loss'])
|
|
|
| if io and raw:
|
| info_name = "info_io_raw"
|
| elif io and not raw:
|
| info_name = "info_io_trained"
|
| elif not io and raw:
|
| info_name = "info_et_raw"
|
| else:
|
| info_name = "info_et_trained"
|
|
|
| wb.save(ey.files_dir + info_name + ".xlsx") |