FixMatch代码详解-训练过程
上一篇大概讲了数据加载的过程,这一篇更进一步,分析一下训练是怎样进行的
上一篇链接: [pytorch]FixMatch代码详解-数据加载
思维导图如下链接,非常详细的写出了代码的整体框架
思维导图

参数 default parameters
数据集链接
4000个带标签的数据集,也就是每个类400张带标签的数据
所有的参数我都默认使用作者给出的例子:
python train.py --dataset cifar10 --num-labeled 4000 --arch wideresnet --batch-size 64 --lr 0.03 --expand-labels --seed 5 --out results/cifar10@4000.5
其运行时每个参数的值如下:
INFO - __main__ - {
'T': 1, 'amp': False, 'arch': 'wideresnet', 'batch_size': 64, 'dataset': 'cifar10', 'device': device(type='cuda', index=0), 'ema_decay': 0.999, 'eval_step': 1024, 'expand_labels': True, 'gpu_id': 0, 'lambda_u': 1, 'local_rank': -1, 'lr': 0.03, 'mu': 7, 'n_gpu': 1, 'nesterov': True, 'no_progress': False, 'num_labeled': 4000, 'num_workers': 4, 'opt_level': 'O1', 'out': 'results/cifar10@4000.5', 'resume': '', 'seed': 5, 'start_epoch': 0, 'threshold': 0.95, 'total_steps': 1048576, 'use_ema': True, 'warmup': 0, 'wdecay': 0.0005, 'world_size': 1}
然后我们将这些参数带入,看看每一步是怎样运行的.
数据产生 generate data
首先,是产生带标签和不带标签数据的索引,其在cifar.py文件中的代码分析见上篇
base_dataset = datasets.CIFAR10(
'./CIFAR10', train=True, download=True)
labels = base_dataset.targets
label_per_class = 4000 // 10
labels = np.array(labels)
labeled_idx = []
# unlabeled data: all data (https://github.com/kekmodel/FixMatch-pytorch/issues/10)
unlabeled_idx = np.array(range(len(labels)))
for i in range(10):
idx = np.where(labels == i)[0]
idx = np.random.choice(idx, label_per_class, False)
labeled_idx.extend(idx)
labeled_idx = np.array(labeled_idx)
print('number labeled_idx =',len(labeled_idx))
assert len(labeled_idx) == 4000
if True or 4000 < 64:
num_expand_x = math.ceil(
64 * 1024 / 4000) #16.384 = 17
labeled_idx = np.hstack([labeled_idx for _ in range(num_expand_x)])
np.random.shuffle(labeled_idx)
print('number labeled_idx = ',len(labeled_idx))
print('number unlabeled_idx =', len(unlabeled_idx))
train_labeled_idxs = labeled_idx
train_unlabeled_idxs = unlabeled_idx
结果如下,不带标签的数据使用了所有的数据,而带标签的数据经过数据扩增之后为68000个
number labeled_idx = 4000
number labeled_idx = 68000
number unlabeled_idx = 50000
让我们看一下图片的变化
首先,是不带任何变化的原始数据图像:
train_labeled_dataset = CIFAR10SSL(
'./data', train_labeled_idxs, train=True,
transform=transforms.ToTensor())
train_iter = iter(train_labeled_dataset)
# 可视化方法,重复执行可得到不同的图片数据
imgs, label = next(train_iter)
print(image.size) # (32, 32)
image = transforms.ToPILImage()(imgs).convert('RGB')
image.show()
print(label)

然后,我们使用不带数据增强的变化,也就是作者对验证集使用的图像变化. ToTensor()能够把灰度范围从0-255变换到0-1之间,而后面的transform.Normalize()则把0-1变换到(-1,1). 注意图片大小没有变化,只是我截图的时候放大了图片.
cifar10_mean = (0.4914, 0.4822, 0.4465)
cifar10_std = (0.2471, 0.2435, 0.2616)
transform_val = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=cifar10_mean, std=cifar10_std)])
train_labeled_dataset = CIFAR10SSL(
'./data', train_labeled_idxs, train=True,
transform=transform_val)
train_iter = iter(train_labeled_dataset)
imgs, label = next(train_iter)
print(image.size) # (32, 32)
image = transforms.ToPILImage()(imgs).convert('RGB')
image.show()
print(label)

然后我们看看带数据的图片所使用的数据增强(两次)
cifar10_mean = (0.4914, 0.4822, 0.4465)
cifar10_std = (0.2471, 0.2435, 0.2616)
transform_labeled = transforms.Compose([
transforms.RandomHorizontalFlip(), #Horizontally flip the given image randomly with a given probability.
transforms.RandomCrop(size=32,
padding=int(32*0.125),
padding_mode='reflect'),
transforms.ToTensor(
422



&spm=1001.2101.3001.12003&articleId=122986762&d=1&t=3&u=1731404ecda641c2b304688a5f6d8b34)

被折叠的 条评论
为什么被折叠?



