Пользовательский генератор данных Keras с выходом - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь создать собственный генератор данных и не знаю, как интегрировать функцию yield в сочетании с бесконечным циклом внутри метода __getitem__.

РЕДАКТИРОВАТЬ : После ответа я понял, что код, который я использую, является Sequence, который не нуждается в выражении yield.

В настоящее время я возвращаю несколько изображений с оператором return:

class DataGenerator(tensorflow.keras.utils.Sequence):
    def __init__(self, files, labels, batch_size=32, shuffle=True, random_state=42):
        'Initialization'
        self.files = files
        self.labels = labels
        self.batch_size = batch_size
        self.shuffle = shuffle
        self.random_state = random_state
        self.on_epoch_end()

    def __len__(self):
        return int(np.floor(len(self.files) / self.batch_size))

    def __getitem__(self, index):
        # Generate indexes of the batch
        indexes = self.indexes[index * self.batch_size:(index + 1) * self.batch_size]

        files_batch = [self.files[k] for k in indexes]
        y = [self.labels[k] for k in indexes]

        # Generate data
        x = self.__data_generation(files_batch)

        return x, y

    def on_epoch_end(self):
        'Updates indexes after each epoch'
        self.indexes = np.arange(len(self.files))
        if self.shuffle == True:
            np.random.seed(self.random_state)
            np.random.shuffle(self.indexes)


    def __data_generation(self, files):
        imgs = []

        for img_file in files:

            img = cv2.imread(img_file, -1)

            ###############
            # Augment image
            ###############

            imgs.append(img) 

        return imgs

В этой статье я видел, что yield используется в бесконечном цикле. Я не совсем понимаю этот синтаксис. Как избежать цикла?

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Вы используете Sequence API, который работает немного иначе, чем обычные генераторы.В функции генератора вы должны использовать ключевое слово yield для выполнения итерации внутри цикла while True:, поэтому каждый раз, когда Keras вызывает генератор, он получает пакет данных и автоматически оборачивает конец данных.

Но в последовательности есть параметр index для функции __getitem__, поэтому итерации или yield не требуются, это выполнит Keras для вас.Это сделано для того, чтобы последовательность могла выполняться параллельно с использованием многопроцессорной обработки, что невозможно при использовании старых функций генератора.

Таким образом, вы делаете все правильно, никаких изменений не требуется.

0 голосов
/ 10 мая 2019

Пример генератора в Keras:

def datagenerator(images, labels, batchsize, mode="train"):
    while True:
        start = 0
        end = batchsize

        while start  < len(images): 
            # load your images from numpy arrays or read from directory
            x = images[start:end] 
            y = labels[start:end]
            yield x, y

            start += batchsize
            end += batchsize

Керас хочет, чтобы в генераторе работал бесконечный цикл.

Если вы хотите узнать о генераторах Python, то ссылка в комментариях - действительно хорошее место для начала.

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