партия и подразделения в YOLOv3

Я использую YOLOv3 и YOLOv3-Tiny из вилки AlexeyAB в Darknet. Я понимаю, что размер изображения должен быть кратен 32. И это batch, разделенное на subdivisions, определяет количество изображений, которые будут обрабатываться параллельно.

Например, размер пакета в файле yolov3.cfg по умолчанию - 64, а subdivision - 16, что означает, что одновременно будут загружены 4 изображения, и для выполнения одной итерации потребуется 16 из этих мини-пакетов.

То, что я не вижу документированного в вики:

Существуют ли ограничения на эти значения? Должны ли они быть кратными 16? Мощность 2? Можно batch=25 и subdivisions=5?


person Stéphane    schedule 12.10.2019    source источник


Ответы (1)


Я считаю, что не обязательно быть степенью двойки, важно то, что batch должно делиться на subdivisions, поскольку в коде используются небольшие партии batch / subdivisions, как вы можете видеть в parcer.c:

net->batch /= subdivs;

тогда количество изображений, обрабатываемых на каждом этапе, определяется как в детектор.c:

int imgs = net.batch * net.subdivisions * ngpus;

Хотя значение BLOCK в dark_cuda.h равно 512, используемое num_blocks в ядрах не обязательно должно делиться на 2, как можно увидеть в dark_cuda.c:

int get_number_of_blocks(int array_size, int block_size)
{
    return array_size / block_size + ((array_size % block_size > 0) ? 1 : 0);
}

Я думаю, что единственной проблемой может быть проблема с производительностью, поскольку CUDA работает в оболочке из 32, поэтому любое число, не кратное 2, может привести к неполному использованию части используемой памяти.

Однако я рекомендую вам попробовать обучить вашу сеть с этими параметрами, чтобы убедиться, что она работает должным образом.

person AbdelAziz AbdelLatef    schedule 26.10.2019
comment
Код может обрабатывать, когда партия не делится на подразделения, для информации. В любом случае, ничего страшного! - person Philippe Remy; 19.07.2020