- 代码中args.mu是设为7的,即每次输入到batch中数据,假设有标签数据为64张,无标签数据就是64*7张;
- 设置eval_step是用来设置Dataloader在iter的next步数的,但手动设置会有一个问题,就是数据集遍历完了但是循环还在继续会报错。代码中采用了try except机制来使迭代循环,也即遍历完之后还会重新遍历一遍;
for batch_idx in range(args.eval_step):
try:
data_x = labeled_iter.next()
except Exception:
if args.world_size > 1:
labeled_epoch += 1
labeled_trainloader.sampler.set_epoch(labeled_epoch)
labeled_iter = iter(labeled_trainloader)
data_x = labeled_iter.next()
try:
data_u = unlabeled_iter.next()
except Exception:
if args.world_size > 1:
unlabeled_epoch += 1
unlabeled_trainloader.sampler.set_epoch(unlabeled_epoch)
unlabeled_iter = iter(unlabeled_trainloader)
data_u = unlabeled_iter.next()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 因为代码中先生成了DataLoader再进行epoch循环,这会带来一个问题:如果每次循环没有覆盖到整个数据集(也即iter步数设置过小),数据集就只有部分会参与到loss回传没有整个被用到,但是如果epoch设置小没有影响,只要iter设置大,就可以往复循环遍历整个数据集。得结论:args.eval_step一定要设置足够大。