前置知识准备
Samplers — Open Metric Learning documentation
在该文档里,category表示类别,label表示商品,instance表示商品不同角度的图片。
- category就是blouses_shirts;
- label就是15;
- instance就是这5张图片;
balance sampler
每个label下pick等量的instance..
batch = allsamples // batch_size
batch_size = n_instances x n_labels
L个不同的label,我这里是L=500个。labels=40,instance=10。
batch1 | 40/500,从500个商品中挑选40个商品; 10/40,再从40个商品中,每个label挑选10个图片 |
batch2 | 40/(500-40) 10/40 |
epoch ends | L//label 500//40=12.5=12(batch12) |
在一个epoch里,所有label将会被pick一次,但不意味着所有的instance都会被挑选。
每个epoch会过完所有的label,也就是会过完所有的商品,但只会过40*10*12张图片=4800张。
总共有31w的图片,要想31w/4800=64.5=64,想要全部图片看一次需要设置这里的epoch=64次,想要看多次则64*多次。
categroy sampler
L=500,n_label=10,batch=500//10=50,需要采50个batch,每个batch里10个商品*n_instance。
总共500个商品,每次挑10个商品角度图。每一个epoch会挑选完所有的500商品。
DistinctCategoryBalanceSampler
batch_size = n_instances x n_labels x n_categories
L个商品,C个类目,
1st batch | 采categrory个类目,在这些类目中,采label个商品,在这些商品中采instance个角度图片 |
2st batch | ,all label-1st picked label 对应的所有类目 从中挑选category个类目,从中为每个类目category选择n_labels,再从n_labels中选n_instance. |
epoch end (自己设置的epoch size) |
1. 如果在epoch size前选择了所有的类目all the categories,则sampler重置。不保证epochsize结束前能遍历完所有的category,相反,如果遍历完所有类目,则再重新开始重复采样。
2. L&n_label=1,则这个剩下的商品会从batch中drop掉,因为需要成pairs。(再理解一下,如果 L % n_labels == 1 则必须删除其中一个label,因为我们总是希望拥有超过 1 个label,这里label是商品的意思。)
3. 被选择的category下的未使用label不够设置的量,那么会从已使用的label中再去重复采