luhaofang / tripletloss

tripletloss in caffe
MIT License
322 stars 152 forks source link

triplet_select #12

Open BrettLL opened 8 years ago

BrettLL commented 8 years ago

在 triplet_select.py中, 先按照距离对anchor, pos, neg由大到小排序,而代码: if aps[i][1] >= ans[i][1]: self.no_residual_list.append(i) self.tripletlist.append([i,aps[i][0],ans[i][0]]) 的意思是每次都取10对triplet了吗?还是其他的选择方案?

luhaofang commented 8 years ago

对的,每次取10对,在反传梯度的时候进行样本筛选的调整,这里进行排序只是为尽可能让更多的triplet满足筛选条件。

dianxin556 commented 8 years ago

datalayer层中每个人选了十对triplet,但是select里面怎么保证每对都满足条件呢?还是把不满足条件的triplet舍弃掉,还有如果每个人的样本数量不固定,比较少的话。这个策略是不是不适用

luhaofang commented 8 years ago

@dianxin556 你好,谢谢你的提问,如果每次选择的样本都存在问题,那么说明cnn的分类模型训练是存在问题的。

yzk0281 commented 8 years ago

好像vgg对数据均衡要求比较高 每个人的样本数量相差太大的话 很难收敛,, 亲身体会

dianxin556 commented 8 years ago

谢谢@pinguo-luhaofnag,@yzk0281.那每次输入的batchsize必须是固定的吗?还是只要是3的倍数就可以。

yzk0281 commented 8 years ago

我就取的30

dianxin556 commented 8 years ago

如果不指定大小可以吗,比如说一个人下面有n个样本,就用n*3这么大可以吗

yzk0281 commented 8 years ago

这个,,,我就不知道了 luhaofang大神来回答下。。

BrettLL commented 8 years ago

@pinguo-luhaofang 这样选择的10对样本有可能有的并不满足aps[i][1] >= ans[i][1]的条件,还是只选择10对样本中满足这个条件的样本对?那是不是应该是: if aps[i][1] >= ans[i][1]: self.no_residual_list.append(i) else: self.tripletlist.append([i,aps[i][0],ans[i][0]])

luhaofang commented 8 years ago

@BrettLL 我是通过不回传梯度,来达到样本对semi-hard的筛选的目的。那些符合筛选条件的样本对会进行参数更新。

dianxin556 commented 8 years ago

@pinguo-luhaofang ,我看你前一个版本选择的条件是写if an>ap,..... 最新的版本是ap>=an,新版的这个是不满足条件的样本吗?

luhaofang commented 8 years ago

2个版本的选择条件都是an > ap ,差异在于当前的代码使用的是记录minibatch里边不符合筛选条件的样本对code1。 在回传梯度的时候,这部分的样本是没有返回梯度的 code2

dianxin556 commented 8 years ago

@pinguo-luhaofang ,恩,谢谢。那你算loss的时候,是没有去除这些样本,并且把不产生loss的也加入了no_residual_list,对吧?您在数据集上训练的话,多久可以看到收敛?

luhaofang commented 8 years ago

这些样本对是产生loss的,因为他们经过loss function计算出的值是不为0的。 一个epoch(全样本图片各抽样一次),就开始收敛了。

chendd14 commented 8 years ago

@pinguo-luhaofang 你现在的代码是, if aps[i][1] >= ans[i][1]: self.no_residual_list.append(i) else: self.tripletlist.append([i,aps[i][0],ans[i][0]]) 我怎么觉得应该是 if aps[i][1] <= ans[i][1]: self.no_residual_list.append(i) else: self.tripletlist.append([i,aps[i][0],ans[i][0]])

jiangxuehan commented 8 years ago

@pinguo-luhaofang 我觉得 @chendd14 的说法是对的 如果按照 if aps[i][1] >= ans[i][1]: self.no_residual_list.append(i) 这个逻辑 hard samples(aps[i][1] >= ans[i][1]:)都不反传梯度了

lcj1105 commented 8 years ago

@pinguo-luhaofang @chendd14 你们对于现在这个版本的代码有做实验了吗?
ap>an指的是那些有损失的,但是这个时候self.no_residual_list.append(i) 这样的逻辑确实反了吧?

qiufan commented 8 years ago

@pinguo-luhaofang 个人感觉错了 我个人把这两行注释掉了 因为之后的一层里面已经有了判断 现在跑了跑 lfw分类效果确实提升了 但是还是没收敛=-= 感觉收敛了效果应该会不错

yzk0281 commented 8 years ago

@qiufan 现在收敛了没?效果怎样

qiufan commented 8 years ago

@yzk0281 没=-= 需要研究一下 又跑了3天基本没变化

tanyuan1992 commented 8 years ago

@qiufan 请问你做embedding的时候 用的什么数据进行的 ?是用的vgg基本模型训练时候的数据还是要进行测试的数据,比如lfw?

LiuJinxue commented 8 years ago

@jiangxuehan @chendd14 我觉的 if aps[i][1] >= ans[i][1]: self.no_residual_list.append(i) 这个逻辑是对的,hard negative 是不参与误差反传的,因为有可能导致bad local minimal 这个在FaceNet文章的公式(4)当中有做了说明。 只选择 ans > aps的样本

qiufan commented 8 years ago

@LiuJinxue 对的, 我后来又仔细的看了论文, 这个地方是对的。然而我还是没能收敛,因为数据库的问题源码里面的triplet 选择代码总会在随机的数的时候无限循环,自己改了之后又不能收敛。不知道是不是triplet 的选择需要多多注意?

LiuJinxue commented 8 years ago

@qiufan 无线循环是因为anchor找不到足够的positvie, 可以减少batch_size, 或者增加数据集每个类别的样本数量,每一类必须不少于batch_size/3 + 1的图片数。我的问题是收敛得太快了,所以就改小了lr。但最终的实验效果还是不如直接用vgg的fc7层

qiufan commented 8 years ago

@LiuJinxue 嗯,谢谢。我知道是无限循环的原因。那是不是说,每一次训练,都需要anchor保持同一类?完全随机是不可以的?还是不能收敛好忧桑。。。