ImageDataGenerator görüntü yollarını değiştirme

0

Soru

Keras'ın işlevsel apı'sini kullanarak oluşturduğum çok girişli keras modeli için kendi özel datagenerator'ımı uygulamak istiyorum.

Sequence sınıfı ve işlevselliğini çeşitli şekillerde nasıl genişletebileceğim hakkında çok şey okudum.

Veri kümem 3 sınıf içeren ağır dengesiz.

enter image description here

Elde etmek istediğim, flowfromdataframe kullanan özel bir datagenerator oluşturmaktır. Bu veri çerçevesi görüntülere giden yolları içerir. Aşırı temsil edilen sınıf dizinindeki görüntü yollarının sayısını kısıtlayarak, başarılı bir şekilde örnekleyebilir ve böylece veri kümesini dengeleyebilirim.

Veri çerçevesi yapısı:

enter image description here

Bununla birlikte, dışarıda bıraktığım kalan görüntüler hala modelimin öğrenmesini istediğim zengin bilgiler içeriyor.

ımagedatagenerator'umda dataframe'deki eski yolları değiştiren ve rastgele seçilen yeni yollarla değiştiren bir işlevi çağıran bir geri arama "onepochend" gibi bir şey kullanmak mümkün mü?

Geri arama keras belgeleri: https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/Callback

Jeneratör sınıfı dokümanlar: https://www.tensorflow.org/api_docs/python/tf/keras/utils/Sequence

Fikrimi çizdim.:

enter image description here

Yoksa tensorflow / keras'ın bunu başaracak bir şeyi var mı?

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

En iyi cevabı

0

Herkes bunun için bir çözüm arıyorsa, diziyi tensorflow'tan genişleterek özel bir jeneratör uyguladım:

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

buradaki anahtar on_epoch_end.

2021-12-10 13:53:08

Diğer dillerde

Bu sayfa diğer dillerde

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