Модель Keras делает пакет размером 1 при использовании fit_generator - PullRequest
0 голосов
/ 23 апреля 2019

Когда я устанавливаю fit_generator с моим генератором пакетов, он использует размер пакета 1, он делает шаг 1 шаг для каждой эпохи. Что я делаю не так.

Я попытался изменить аргументы размера пакета для моего генератора пакетов, но все равно.

Моя функция генератора партии:

def batchGenerator(imgs, steerings, batchSize, isTraining):

    while True:
        batchImg = []
        batchSteering = []

        for i in range(batchSize):
            randIndex = random.randint(0, len(imgs) - 1)
            if isTraining:
                img, steering = randomAugment(imgs[randIndex], steerings[randIndex])
            else:
                img = imgs[randIndex]
                steering = steerings[randIndex]

            img = imgPreprocess(img)

            batchImg.append(img)
            batchSteering.append(steering)

        yield (np.asarray(batchImg), np.asarray(batchSteering))

Это мои аргументы fit_generator:

history = model.fit_generator(batchGenerator(X_train, y_train, 300, 1),
                              steps_per_epoch = 300,
                              epochs = 10,
                              validation_data = batchGenerator(X_valid, y_valid, 200, 0),
                              validation_steps = 200,
                              verbose = 1,
                              shuffle = 1)

Когда я запускаю это, размер партии кажется равным 1, так как для каждой эпохи он увеличивается на 1. Для каждой эпохи он составляет 0/300, 1/300, 2/300, 3/300 и т. Д.

Что происходит?

Ответы [ 3 ]

0 голосов
/ 23 апреля 2019

Ваш генератор не имеет проблем, и ваш код тоже в порядке.Неправильный способ интерпретации выходных данных.

Из документов вы можете увидеть

steps_per_epoch: Integer или None.Общее количество шагов (партий образцов) до объявления одной эпохи законченной и начала следующей эпохи.При обучении с использованием входных тензоров, таких как тензоры данных TensorFlow, значение по умолчанию None равно числу выборок в вашем наборе данных, разделенному на размер пакета, или 1, если это невозможно определить.

Обычно steps_per_epochs установлен как X_train.shape[0]//batch_size

Во время обучения обучение проводится для steps_per_epochs партий, и одна эпоха считается завершенной.Поскольку данные берутся в случайном порядке, нет другого способа сообщить модели, что одна эпоха окончена.

Во время тренировки вы можете видеть 0/300, 1/300, 2/300, 3/300 и так далее до 300/300.Это вполне нормально.Это означает, что ваша модель обучена для 300 шагов, где размер пакета для каждого шага равен 300 (поскольку вы задали размер пакета как 300)

Если вы задали размер пакета, как, скажем, 10, а steps_per_epoch как100 вы можете видеть во время обучения 1/100, 2/100 и так далее до 100/100, что означает, что ваша модель обучена для 100 шагов, и каждый шаг, по сути, представляет собой партию 10 образцов

0 голосов
/ 23 апреля 2019

В отличие от функции fit, вывод fit_generator - это количество партий, а не примеров обучения. Следовательно, приращение на 1 означает, что была обработана еще одна партия. С помощью steps_per_epoch вы определяете, сколько партий будет обработано за эпоху.

По определению, одна эпоха заканчивается, когда каждый пример обучения был обработан один раз. Вот почему люди предлагают установить steps_per_epoch на:

steps_per_epoch=number_of_examples//batch_size
0 голосов
/ 23 апреля 2019

Ваш steps_per_epoch всегда должен быть длиной данных обучения, деленной на batch_size, т.е. в данном случае X_train.shape[0]//batch_size.

Кроме того, то, как вы перетасовываете свои данные со случайным индексом, будет означать, что некоторые выборки могут быть выбраны более одного раза, а некоторые - никогда. Вы также можете подумать о случайном перетасовке всего учебного набора, а затем выбрать последовательные пакеты данных для обучения. Я просто хотел указать на это, если вы пропустили.

Редактировать

def batchGenerator(imgs, steerings, batchsize, isTraining):
    while True:
        start = 0
        end = batchsize

        while start  < len(imgs): 
            x = imgs[start:end]
            y = steerings[start:end]
            if isTraining:            
                x , y = randomAugment(x, y)

            yield x, y

            start += batchsize
            end += batchsize

Может быть, попробовать что-то вроде этого. Вы можете справиться с тасованием позже, если это сработает.

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