ImageDataGenerator schimbarea căi de imagine

0

Problema

Vreau să pună în aplicare propria mea personalizate datagenerator de la multi-input keras modelul trebuie construit folosind funcționale api de keras.

Am citit foarte mult despre secvența de clasă și cum pot să-l extindă funcționalitatea eu diverse moduri.

Meu set de date, am puternic dezechilibrată conține 3 clase.

enter image description here

Ceea ce vreau să realizeze este de a construi un obicei datagenerator care utilizează flowfromdataframe. Acest dataframe conține căi de imagini. Prin constrângerea numărul de căi de imagine din suprareprezentați clasa directory pot cu succes undersample și echilibra astfel de date.

Dataframe structura:

enter image description here

Cu toate acestea imaginile rămase pot lăsa încă conține informații bogate vreau modelul meu de a învăța.

Este posibil de a utiliza ceva ca o un apel invers "onepochend", care solicită o funcție în imagedatagenerator care schimbă vechile căi în dataframe și înlocuiți-l cu aleator selectate de noi căi?

Callback keras docs: https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/Callback

Generator de clasa docs: https://www.tensorflow.org/api_docs/python/tf/keras/utils/Sequence

A schițat ideea mea:

enter image description here

Sau tensorflow/keras are ceva care realizează acest lucru?

deep-learning keras python tensorflow
2021-11-21 18:56:38
1

Cel mai bun răspuns

0

În cazul în care cineva este în căutarea pentru o soluție în acest sens, am implementat un obicei generator prin extinderea secvență de tensorflow:

class custom_generator(tf.keras.utils.Sequence):
    def __init__(self, ecg_path, eeg_path, batch_size, img_shape, shuffle=True, X_col='filename', Y_col='class'):
        self.batch_size = batch_size
        self.img_shape = img_shape
        self.shuffle = shuffle
        self.X_col = X_col
        self.Y_col = Y_col
        self.class_mapping = {"sz": 1, "non-sz": 0}
        self.ecg_path = ecg_path
        self.eeg_path = eeg_path
        self.eeg_df, self.ecg_df = self.__generate_data()
        self.len = len(self.eeg_df)
        self.n_name = self.ecg_df[self.Y_col].nunique()

    def __generate_data(self):
        eeg_class_dist = inspect_class_distribution(self.eeg_path)
        ecg_class_dist = inspect_class_distribution(self.ecg_path)
        max_n_images = get_lowest_distr(ecg_class_dist, eeg_class_dist)
        balanced_ecg_data = limit_data(self.ecg_path, max_n_images).sort_values(by=[self.Y_col]).reset_index(drop=True)
        balanced_eeg_data = limit_data(self.eeg_path, max_n_images).sort_values(by=[self.Y_col]).reset_index(drop=True)
        return shuffle_order_dataframes(balanced_eeg_data, balanced_ecg_data)

    def on_epoch_end(self):
        if shuffle:
            self.ecg_df, self.eeg_df = self.__generate_data()
            

    def __get_input(self, path, target_size):
        image = tf.keras.preprocessing.image.load_img(path)
        image_arr = tf.keras.preprocessing.image.img_to_array(image)
        image_arr = tf.image.resize(image_arr,(target_size[0], target_size[1])).numpy()

        return image_arr/255.

    def __get_output(self, label, num_classes):
        categoric_label = self.class_mapping[label]
        return tf.keras.utils.to_categorical(categoric_label, num_classes=num_classes)

    def __get_data(self, x1_batches):
        eeg_path_batch = x1_batches[self.X_col]
        ecg_path_batch = x1_batches[self.X_col]

        label_batch = x1_batches[self.Y_col]

        x1_batch = np.asarray([self.__get_input(x, self.img_shape) for x in eeg_path_batch])
        x2_batch = np.asarray([self.__get_input(x, self.img_shape) for x in ecg_path_batch])
        y_batch = np.asarray([self.__get_output(y, self.n_name) for y in label_batch])

        return tuple([x1_batch, x2_batch]), y_batch

    def __getitem__(self, index):
        n_batches = self.eeg_df[index * self.batch_size:(index + 1) * self.batch_size]
        X, y = self.__get_data(n_batches)        
        return X, y

    def __len__(self):
        return self.len // self.batch_size

on_epoch_end este cheia aici.

2021-12-10 13:53:08

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................