The-Learning-And-Vision-Atelier-LAVA / DASR

[CVPR 2021] Unsupervised Degradation Representation Learning for Blind Super-Resolution
MIT License
387 stars 50 forks source link

关于正样本与负样本的选取问题 #84

Open JiaWang0704 opened 1 year ago

JiaWang0704 commented 1 year ago

您好!非常感谢您的工作。我在阅读您的paper的时候,如果我没有理解错的话,您是从同一LR图像中提取的其他图像块视为正样本,来自其他LR图像的图像块视为负样本。

但是我在阅读您的代码的时候,您始终都是以一个image作为单位来进行对比学习的。

因此来请教一下您,是我哪里的理解出问题了吗?

期待您的回复,谢谢!

LongguangWang commented 1 year ago

您好,您理解的没错,我们将同一LR图像中提取的其他图像块视为正样本,来自其他LR图像的图像块视为负样本。 具体到代码里也是这么操作的,dataloader里完成了的图像块的裁取,所以送入网络的就已经是图像块了。您可以再具体一下疑惑的代码位置方便进一步解释您的疑惑。

BugMaker-99 commented 8 months ago

你好,我也有这个疑惑。trainer.py第73行代码:_, output, target = self.model_E(im_q=lr[:,0,...], im_k=lr[:,1,...]) 这是将同一张LR图像的两个patch送入Moco,两个patch的退化是一样的,这都是正样本,好像没有看到负样本呀。在class Moco的forward中,有两行代码:l_pos = torch.einsum('nc,nc->n', [q, k]).unsqueeze(-1),l_neg = torch.einsum('nc,ck->nk', [q, self.queue.clone().detach()]),这两行代码写的是正负样本特征。我有点疑惑,输入的是同一张图像的两个patch,退化信息是相同的,为什么在Moco中分出了正负样本呢?

LongguangWang commented 8 months ago

感谢关注~self.queue中保存了之前iteration送入的patch样本。由于不同图像之间的退化是不一样的,因此这些之前iteration送入的、保存在self.queue中的样本对于当前的query来说就成了负样本。