Подтвердить что ты не робот

В методе Keras model.fit_generator(), для чего используется управляемый параметром очереди генератор "max_q_size"?

Я построил простой генератор, который дает a tuple(inputs, targets) только с одним элементом в списках inputs и targets - в основном сканирование набора данных, по одному образцу за раз.

Я передаю этот генератор в:

  model.fit_generator(my_generator(),
                      nb_epoch=10,
                      samples_per_epoch=1,
                      max_q_size=1  # defaults to 10
                      )

Получаю:

  • nb_epoch - это количество раз, когда будет запущена обучающая серия
  • samples_per_epoch - количество образцов, прошедших обучение в эпоху

Но что такое max_q_size для и почему он по умолчанию равен 10? Я думал, что цель использования генератора - пакетные наборы данных в разумные куски, так почему же дополнительная очередь?

4b9b3361

Ответ 1

Это просто определяет максимальный размер внутренней очереди обучения, которая используется для "предварительной проверки" ваших образцов из генератора. Он используется во время генерации очередей

def generator_queue(generator, max_q_size=10,
                    wait_time=0.05, nb_worker=1):
    '''Builds a threading queue out of a data generator.
    Used in `fit_generator`, `evaluate_generator`, `predict_generator`.
    '''
    q = queue.Queue()
    _stop = threading.Event()

    def data_generator_task():
        while not _stop.is_set():
            try:
                if q.qsize() < max_q_size:
                    try:
                        generator_output = next(generator)
                    except ValueError:
                        continue
                    q.put(generator_output)
                else:
                    time.sleep(wait_time)
            except Exception:
                _stop.set()
                raise

    generator_threads = [threading.Thread(target=data_generator_task)
                         for _ in range(nb_worker)]

    for thread in generator_threads:
        thread.daemon = True
        thread.start()

    return q, _stop

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

 while samples_seen < samples_per_epoch:
     generator_output = None
     while not _stop.is_set():
         if not data_gen_queue.empty():
             generator_output = data_gen_queue.get()
             break
         else:
             time.sleep(wait_time)

и почему значение по умолчанию 10? Нет особых причин, как и большинство параметров по умолчанию - это просто имеет смысл, но вы также можете использовать разные значения.

Конструкция, подобная этому, предполагает, что авторы думали о дорогих генераторах данных, которые могут потребовать времени для прослушивания. Например, рассмотрите возможность загрузки данных по сети в вызове генератора - тогда имеет смысл предусмотреть некоторые последующие партии и загрузить следующие параллельно, ради эффективности и быть надежными для сетевых ошибок и т.д.