一些知识点记录一下:
- Test-Time Augmentation,测试时数据增强
- 测试时将原始数据做不同形式的增强,然后取结果的平均值作为最终结果。可以进一步提升最终结果的精度
- The input size significantly influences detection accuracy, since high resolution make the detectors " small objects" clearly to increase successful detections. The multi-scale test can make the detector trainer with limited input size (e.g. 320*320) to see those small objects that only can be ‘see’ by the large input size (1000*600) .
dataloader = DataLoader(dataset, num_workers=2, batch_size=3)
- 主进程初始化
- 创建
num_workers
各不同的子进程 - 为每个子远程维护
index_queue
,用于发送需要采集数据的index。注意,队列每个元素都是一个batch的index的数组。 - 所有子进程共享一个
data_queue
,用于存放子进程返回的数据。 - 为每个子进程的
index_queue
依次存放两个batch的数据。0号worker存放[0,1,2],[6,7,8]
,为1号worker存放[3,4,5],[9,10,11]
。依次存放是为了尽量保证去的数据的顺序和采样器生成的顺序是一致的,而存放两组数据是为了数据预取的功能(即取第 i i i个batch的数据时, i + 1 i+1 i+1个batch的数据已经读好,并开始缓存 i + 2 i+2 i+2batch的数据) - 一个完整的batch由一个worker产生,而不是由多个worker 共同产生。这样做的目的是为了尽可能减少进程通信的次数
- 正常情况下,内存中稳定存在
2*num_worker
个batch的数据。但由于乱序缓存机制的存在,实际会比这个大一些。最坏情况下是某个worker卡住始终不返回数据,那就会一直缓存后续数据,一直读取,直到爆内存。
- 创建
DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,num_workers=0, collate_fn=default_collate, pin_memory=False,drop_last=False)
- dataset:加载的数据集(Dataset对象)
shuffle
,表示数据是否打乱sampler
,样本抽样num_workers
,使用多进程加载的进程数,0表示不使用多进程collate_fn
,如何将多个样本数据拼接成一个batch,一般使用默认的拼接方式即可pin_memory
,是否将数据保存在pin memory
区,pin memory
中的数据转到GPU会快一点drop_last
,dataset中的数据个数可能不是batch_size的整数倍,drop_last为True将多出来不足一个batch的数据丢弃。
- Conv2d函数详解
dilation
(Pytorch):dilation
扩张,一般情况下,卷积核和输入图像对应的位置之间的计算是相同尺寸的,也就是说卷积核的大小是 3 × 3 3\times3 3×3,那么它在输入图像上每次作用的区域是 3 × 3 3\times3 3×3。这种情况下 d i l a t i o n = 0 dilation=0 dilation=0。当 d i l a t i o n = 1 dilation=1 dilation=1时,表示的是下图这种情况。
groups
:分组。指的是对输入通道进行分组,如果 g r o u p s = 1 groups=1 groups=1,那么输入就一组,输出也为一组。如果 g r o u p s = 2 groups=2 groups=2,那么就将输入分为两组,那么相应的输出也是两组。另外需要注意的是in_channels和out_channels必须能整除gropus。