YOLOv3 中的批量和细分

Sté*_*ane 5 darknet yolo

我正在使用来自AlexeyAB 的 Darknet 分支的YOLOv3 和 YOLOv3-Tiny 。我知道图像大小必须是 32 的倍数。除以batch决定subdivisions并行处理的图像数量。

例如,默认的 yolov3.cfg 文件中的批量大小为64,细分为16,这意味着一次将加载 4 个图像,并且需要其中 16 个小批量才能完成一次迭代。

我在 wiki 中没有看到记录的内容:

这些值有限制吗? 它们必须是 16 的倍数吗?2 的幂?我可以有batch=25subdivisions=5吗?

Abd*_*tef 2

我相信它不一定是 2 的幂,重要的是它batch必须可以被整除,subdivisions因为代码使用小批量,正如您在parcer.cbatch / subdivisions中看到的那样:

net->batch /= subdivs;

那么每一步处理的图像数量定义为detector.c

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

虽然dark_cuda.hBLOCK中定义的是 512,但内核中使用的值不必能被 2 整除,如dark_cuda.c中所示:num_blocks

int get_number_of_blocks(int array_size, int block_size)
{
    return array_size / block_size + ((array_size % block_size > 0) ? 1 : 0);
}
Run Code Online (Sandbox Code Playgroud)

我认为唯一的问题可能是性能问题,因为 CUDA 以 32 为单位运行,因此任何不是 2 倍数的数字都可能导致部分已用内存未得到充分利用。

但是,我建议您尝试使用这些参数来训练您的网络,以确认其按预期工作。