Keras fit_generator тренирует один образец за раз, в то время как я получаю более одного образца от генератора - PullRequest
0 голосов
/ 14 июня 2019

Я тренирую модель, используя керас.Я попробовал обе функции: «fit» и «fit_generator».и я не понимаю, почему есть большая разница в производительности, может быть, я делаю что-то не так.Это первый раз, когда я написал код batch_generator.

с учетом размера партии 10, что я наблюдал при использовании функции -

fit :он тренируется быстрее (около 3 минут за эпоху), число в многословном увеличении увеличивается с кратными размерами партии (здесь 10)
sample- 80/7632 [..............................] - ETA: 4:31 - потери: 2,2072 - в соотв. 0,4375

fit_generator : тренируется намного медленнее (10 минут за эпоху), число при многословном увеличении на 1 за раз (не равно размеру партии)
Образец - 37/7632 [..............................] - ETA: 42:25 - потери: 2,1845 - в соответствии: 0,3676

Как вы можете видеть ETAслишком велик для fit_generator для того же набора данных.И fit_generator увеличивается каждый раз на 1, тогда как fit увеличивается в несколько раз: 10

Генератор:

def batch_generator(X ,y, batch_size=10):
    from sklearn.utils import shuffle

    batch_count = int(len(X) / batch_size)
    extra = len(X) - (batch_count * batch_size)

    while 1:
        #shuffle X and y
        X_train, y_train = shuffle(X,y)

        #Yeild Batches
        for i in range(1, batch_count):
            batch_start = (i-1) * batch_size
            batch_end = i * batch_size
            X_batch = X_train[batch_start: batch_end]
            y_batch = y_train[batch_start: batch_end]
            yield X_batch, y_batch

        #Yeild Remaining Data less than batch size
        if(extra > 0):
            batch_start = batch_count * batch_size
            X_batch = X_train[batch_start: -1]
            y_batch = y_train[batch_start: -1]
            yield X_batch, y_batch

Функция Fit:

model.fit_generator(batch_generator(X, y, 10),
                    verbose = 1,
                    samples_per_epoch = len(X),
                    epochs = 20,
                    validation_data = (X_test, y_test),
                    callbacks = callbacks_list)

Может кто-нибудь объяснить, почемуэто происходит?

1 Ответ

1 голос
/ 14 июня 2019

fit_generator не использует примеры, он использует шаги, вы используете старый Keras API с параметром samples_per_epoch, это неверно и дает неправильные результаты. Правильный fit_generator вызов будет:

model.fit_generator(batch_generator(X, y, 10),
                    verbose = 1,
                    steps_per_epoch = int(len(X) / batch_size),
                    epochs = 20,
                    validation_data = (X_test, y_test),
                    callbacks = callbacks_list)

steps_per_epoch контролирует, сколько шагов (обращений к генератору) использовать перед объявлением эпохи. Следует установить количество общих выборок, разделенное на размер партии. Для fit_generator индекс в индикаторе выполнения будет относиться к шагам (пакетам), а не к выборкам, поэтому вы не можете напрямую сравнить их с индексами в индикаторе выполнения fit.

...