YOLOv3 中的批量和细分
batch and subdivisions in YOLOv3
我正在使用来自 AlexeyAB's fork of Darknet 的 YOLOv3 和 YOLOv3-Tiny。我知道图像大小必须是 32 的倍数。batch
除以 subdivisions
决定了将并行处理的图像数量。
例如默认yolov3.cfg文件中的batch size为64
,细分为16
,即一次加载4张图片,需要16张这些小批量完成一次迭代。
我没有看到记录的内容 in the wiki:
这些值有限制吗?必须是16的倍数吗? 2的幂?我可以有 batch=25
和 subdivisions=5
吗?
我认为不一定是 2 的幂,重要的是 batch
必须能被 subdivisions
整除,因为代码使用了小批量的 batch / subdivisions
正如您在 parcer.c:
中看到的
net->batch /= subdivs;
则每一步处理的图像数量定义为detector.c:
int imgs = net.batch * net.subdivisions * ngpus;
虽然在dark_cuda.h中定义的BLOCK
是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 的倍数的数字都可能导致部分已用内存未得到充分利用。
但是,我建议您尝试使用这些参数训练您的网络,以确认它是否按预期工作。
我正在使用来自 AlexeyAB's fork of Darknet 的 YOLOv3 和 YOLOv3-Tiny。我知道图像大小必须是 32 的倍数。batch
除以 subdivisions
决定了将并行处理的图像数量。
例如默认yolov3.cfg文件中的batch size为64
,细分为16
,即一次加载4张图片,需要16张这些小批量完成一次迭代。
我没有看到记录的内容 in the wiki:
这些值有限制吗?必须是16的倍数吗? 2的幂?我可以有 batch=25
和 subdivisions=5
吗?
我认为不一定是 2 的幂,重要的是 batch
必须能被 subdivisions
整除,因为代码使用了小批量的 batch / subdivisions
正如您在 parcer.c:
net->batch /= subdivs;
则每一步处理的图像数量定义为detector.c:
int imgs = net.batch * net.subdivisions * ngpus;
虽然在dark_cuda.h中定义的BLOCK
是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 的倍数的数字都可能导致部分已用内存未得到充分利用。
但是,我建议您尝试使用这些参数训练您的网络,以确认它是否按预期工作。