如何利用PyTorch中的Moco-V2减少计算约束( 三 )

步骤4:我们将最新的batch加入我们的队列 。 如果我们的队列大小大于我们定义的最大队列大小(K) , 那么我们就从其中取出最老的batch 。 可以使用torch.cat进行队列操作 。
# 更新队列queue = torch.cat((queue, k), 0) # 如果队列大于最大队列大小(k) , 则出列# batch大小是256 , 可以用变量替换if queue.shape[0] > K:queue = queue[256:,:]步骤5:现在我们进入训练循环的最后一步 , 即更新键编码器 。 我们使用下面的for循环来实现这一点 。
# 更新resnetfor θ_k, θ_q in zip(resnetk.parameters(), resnetq.parameters()):θ_k.data.copy_(momentum*θ_k.data + θ_q.data*(1.0 - momentum))一些训练细节训练resnet-18模型的Imagenette和Imagewoof数据集的GPU时间接近18小时 。 为此 , 我们使用了googlecolab的GPU(16GB) 。 我们使用的batch大小为256 , tau值为0.05 , 学习率为0.001 , 最终降低到1e-5 , 权重衰减为1e-6 。 我们的队列大小为8192 , 键编码器的动量值为0.999 。
结果前3层(将relu视为一层)定义了投影头 , 我们将其移除用于图像分类的下游任务 。 在剩下的网络上 , 我们训练了一个线性分类器 。
我们得到了64.2%的正确率 , 而使用10%的标记训练数据 , 使用MoCo-v2 。 相比之下 , 使用最先进的监督学习方法 , 其准确率接近95% 。
对于Imagewoof , 我们对10%的标记数据得到了38.6%的准确率 。 在这个数据集上进行对比学习的效果低于我们的预期 。 我们怀疑这是因为首先 , 数据集非常困难 , 因为所有类都是狗类 。
其次 , 我们认为颜色是这些类的一个重要的区别特征 。 应用颜色抖动可能会导致来自不同类的多个图像彼此混合表示 。 相比之下 , 监督方法的准确率接近90% 。
【如何利用PyTorch中的Moco-V2减少计算约束】能够弥合自监督模型和监督模型之间差距的设计变更:

  1. 使用更大更宽的模型 。
  2. 通过使用更大的批量和字典大小 。
  3. 使用更多的数据 , 如果可以的话 。 同时引入所有未标记的数据 。
  4. 在大量数据上训练大型模型 , 然后提取它们 。
  • 谷歌Colab:
  • Imagewoof Github仓库结果:
  • Imagenette Github仓库结果:
  • Imagewoof数据集链接:
  • Imagenette数据集链接: