关于moco的论文解析有很多了,但是光看解析还是有一些内容不是很懂。于是就想着看看代码。
基本思路
图片进行两次数据增强,分别成为query和key。每张图片要只和自己是一类,和别的图片不成为一类。
看论文的时候理解错误的地方:
- 以为每次从队列中弹出来一部分作为反例,其实是整个队列都会作为反例的
看论文的时候没有理解的地方:
- 是不是一定需要保证队列里存在的样本和query的样本是不重复的?怎么保证的?
理论上需要保证,但是代码里在第一个epoch是不会重复,在后面的epoch有极低的概率重复,不会影响到训练
- 既然需要一个队列,那么第一个epoch的第一个batch的时候,队列里面是空的,这个时候负样本是怎么产生的?
开始的时候随机初始化队列,随机结果充满队列
代码阅读
代码:https://github.com/facebookresearch/moco
数据构造
首先是看它数据准备的部分。由于预训练是无监督的,所以只加载了images,而标签就舍弃了
for i, (images, _) in enumerate(train_loader):
# measure data loading time
data_time.update(time.time() - end)
if args.gpu is not None:
images[0] = images