Пользовательский генератор Keras работает в 50 раз медленнее - PullRequest
0 голосов
/ 21 марта 2019

Я просмотрел все сообщения "slow fit_generator" и внедрил все исправления, и мой пользовательский генератор все еще в 50 раз медленнее, чем стандартная подгонка. С той же конфигурацией мы говорим 20сек / эпоха против 800сек / эпоха.

Если я установлю verbose = 1, я также заметил, что при использовании пользовательского генератора он будет «останавливаться» через равные промежутки времени. Если я использую стандартную посадку, все партии будут проходить в обычном темпе. РЕДАКТИРОВАТЬ: я заметил, что паузы в нескольких рабочих. Если я установлю значение worker = 16, use_multiprocessing = True, оно будет приостанавливаться на длительное время в каждой 16-й партии. Есть ли способ предотвратить эту паузу ??

Вот уменьшенная версия моего пользовательского кода генератора, как мне его оптимизировать?

class custom_generator(Sequence):

    def __init__(self, <variables passed in here>):

        # Assign self.variables here

    def __len__(self):

        return int(np.floor(len(self.y) / self.batch_size))

    def on_epoch_end(self):

        if self.shuffle == True:
            # do shuffle

    def image_to_np(self, imagePath, seed):

        img = cv2.imread(imagePath)

        # Do random data augmentation
        if self.aug == True:
            new_img = self.image_gen.random_transform(img, seed=seed)
            new_img = self.image_gen.standardize(new_img)
            img = np.expand_dims(new_img, axis=0)
        elif self.aug == False:
            img = np.expand_dims(img, axis=0)
        else:
            raise Exception('Specify augmentation True or False')

        return img, imagePath

    def generate_images(self, i):

        img_seed = random.randint(0,1000)

        # Process frame
        imagePath  = self.X[i]
        imageLabel = self.y[i]
        img, path = self.image_to_np(imagePath, img_seed)

        return img, imageLabel

    def __getitem__(self, i, path=False):

        # Initialize empty np arrays
        data = np.empty((self.batch_size, self.dim[1], self.dim[0], self.n_channels), dtype=float)
        labl = np.empty((self.batch_size), dtype=int)

        k = i * self.batch_size
        for idx in range(self.batch_size):
            # Generate image
            img, label = self.generate_images(k)
            k += 1
            # Store image
            data[idx] = img
            # Store labels
            labl[idx] = label

return data, labl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...