1. NMS算法的流程
NMS也即非极大值抑制。在最近几年常见的物体检测算法(包括rcnn、sppnet、fast-rcnn、faster-rcnn等)中,最终都会从一张图片中找出很多个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:
所谓非极大值抑制:依靠分类器得到多个候选框,以及关于候选框中属于类别的概率值,根据分类器得到的类别分类概率做排序,具体算法流程如下:
(1)将所有框的得分排序,选中最高分及其对应的框
(2)遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除。(为什么要删除,是因为超过设定阈值,认为两个框的里面的物体属于同一个类别。我们只需要留下一个类别的可能性框图即可。)
(3)从未处理的框中继续选一个得分最高的,重复上述过程。
2. 了解torch.utils.data.DataLoader中的pin_memory属性吗
pin_memory:表示要将load进来的数据是否要拷贝到pin_memory区中,其表示生成的Tensor数据是属于内存中的锁页内存区,这样将Tensor数据转移到GPU中速度就会快一些,默认为False。
通常情况下,数据在内存中要么以锁页的方式存在,要么保存在虚拟内存(磁盘)中,设置为True后,数据直接保存在锁页内存中,后续直接传入cuda;否则需要先从虚拟内存中传入锁页内存中,再传入cuda,这样就比较耗时了,但是对于内存的大小要求比较高。
3. 多卡训练
模型并行(model parallel) -> 大型网络(对速度没有提升)
当模型需要的显卡很大,一张GPU的显存放不下时,使用这种方式就可以训练一个大型的网络
数据并行(data parallel)-> 加速训练速度
可以将整个模型放到一张GPU时,我们可以将每一个模型放到每一个GPU上,让它们同时进行训练(正向传播+反向传播)
在使用多GPU训练时,每张GPU在进行完一个step后会产生梯度,我们需要将所有GPU的梯度求平均(并不是每张GPU各自学各自的,那样就没有意义了),这样才能将每张GPU的训练结果结合在一起。
实现多卡并行计算的两种方式:
1. DataParallel : PyTorch官方很久之前给出的一种方案
2. DistributedDataParallel: 更新一代的多卡训练方法
- DP是一个单进程、多线程并且仅仅只能工作在单一的设备中(单节点,不适用于多机的情况)
- DDP是一个多进程的,可以工作在单机或者多机的场景中
- DP通常要慢于DDP(即便在单一的设备上)