Модель поезда в партиях с использованием fit_generator - PullRequest
0 голосов
/ 05 марта 2020

В моей модели 100 000 обучающих образцов изображений. Как изменить приведенный ниже код для обучения его партиями? С model.fit_generator я должен указать это внутри функции генератора:

def data_generator(descriptions, features, n_step, max_sequence):
    # loop until we finish training
    while 1:
        # loop over photo identifiers in the dataset
        for i in range(0, len(descriptions), n_step):
            Ximages, XSeq, y = list(), list(),list()
            for j in range(i, min(len(descriptions), i+n_step)):
                image = features[j]
                # retrieve text input
                desc = descriptions[j]
                # generate input-output pairs
                in_img, in_seq, out_word = preprocess_data([desc], [image], max_sequence)
                for k in range(len(in_img)):
                    Ximages.append(in_img[k])
                    XSeq.append(in_seq[k])
                    y.append(out_word[k])
            # yield this batch of samples to the model
            yield [[array(Ximages), array(XSeq)], array(y)]

Мой model.fit_generator код:

model.fit_generator(data_generator(texts, train_features, 1, 150), 
                    steps_per_epoch=1500, epochs=50, callbacks=callbacks_list, verbose=1)

Любая помощь будет отличной, я тренируюсь на облако 16 ГБ, V100 Tesla

Редактировать: Моя модель подписи к изображению создает обучающую выборку для каждого токена в DSL (250 токенов). С набором данных из 50 изображений (эквивалентным 12500 обучающим образцам) и размером партии 1 я получаю OOM. Приблизительно с 32 (эквивалентно 8000 выборкам и размеру пакета 1 он отлично работает). Мой вопрос заключается в том, могу ли я оптимизировать свой код лучше или я могу использовать только несколько графических процессоров?

Исправить:

Steps_per_epoch должен быть равен ceil (num_samples / batch_size), поэтому, если набор данных имеет 1500 выборок, steps_per_epoch должен быть равен 1500. Я также уменьшил мое скользящее окно LSTM с 48 до 24

steps_per_epoch: целое число. Общее количество шагов (партий образцов), которые нужно получить от генератора до объявления одной эпохи законченной и начала следующей эпохи. Обычно он должен быть равен ceil (num_samples / batch_size). Необязательно для последовательности: если не указано, будет использоваться len (генератор) в качестве количества шагов.

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Вот правильный способ использования генераторов: создайте генератор, который выдает отдельные данные. Создайте Dataset из него и используйте метод batch для этого объекта. Настройте параметр, чтобы найти самый большой размер пакета, который не вызовет OOM.

def data_generator(descriptions, features, max_sequence):
    def _gen():
        for img, seq, word in zip(*preprocess_data(descriptions, features, max_sequence)):
            yield {'image': in_img, 'seq': seq}, wo
    return _gen    


ds = tf.data.Dataset.from_generator(
    data_generator(descriptions, features, max_sequence),
    output_types=({'image': tf.float32, 'seq': tf.float32}, tf.int32),
    output_shapes=({
            'image': tf.TensorShape([blah, blah]),
            'seq': tf.TensorShape([blah, blah]),
        },
        tf.TensorShape([balh])
    )
)

ds = ds.batch(n_step)
0 голосов
/ 05 марта 2020

Генераторы уже возвращают партии.

Каждый yield является партией. Это полностью зависит от вас, чтобы разработать генератор с партиями, как вы хотите.

В вашем коде размер партии равен n_step.

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