Repository: HanxunH/Unlearnable-Examples Branch: main Commit: f347155ee23b Files: 236 Total size: 876.9 KB Directory structure: gitextract_b3y44xt6/ ├── .gitattributes ├── .gitignore ├── CITATION.cff ├── LICENSE ├── QuickStart.ipynb ├── README.md ├── collect_results.py ├── configs/ │ ├── cifar10/ │ │ ├── dense121.yaml │ │ ├── resnet18.yaml │ │ ├── resnet18_add-uniform-noise-aug.yaml │ │ ├── resnet18_add-uniform-noise.yaml │ │ ├── resnet18_augement.yaml │ │ ├── resnet18_augmentation.yaml │ │ ├── resnet18_classpoison.yaml │ │ ├── resnet18_classpoison_targeted.yaml │ │ ├── resnet18_cutmix.yaml │ │ ├── resnet18_cutout.yaml │ │ ├── resnet18_denoise.yaml │ │ ├── resnet18_madrys.yaml │ │ ├── resnet18_mixup.yaml │ │ ├── resnet50.yaml │ │ ├── toy_cifar.yaml │ │ └── toy_cifar_madrys.yaml │ ├── cifar100/ │ │ ├── dense121.yaml │ │ ├── resnet18.yaml │ │ ├── resnet18_madrys.yaml │ │ └── resnet50.yaml │ ├── cifar101/ │ │ └── resnet18.yaml │ ├── face/ │ │ └── InceptionResnet.yaml │ ├── imagenet-mini/ │ │ ├── dense121.yaml │ │ ├── resnet18.yaml │ │ └── resnet50.yaml │ ├── svhn/ │ │ ├── dense121.yaml │ │ ├── resnet18.yaml │ │ ├── resnet18_madrys.yaml │ │ └── resnet50.yaml │ └── tiny-imagenet/ │ ├── dense121.yaml │ ├── resnet18.yaml │ └── resnet50.yaml ├── dataset.py ├── evaluator.py ├── fast_autoaugment/ │ ├── .gitignore │ ├── FastAutoAugment/ │ │ ├── __init__.py │ │ ├── archive.py │ │ ├── aug_mixup.py │ │ ├── augmentations.py │ │ ├── common.py │ │ ├── data.py │ │ ├── imagenet.py │ │ ├── lr_scheduler.py │ │ ├── metrics.py │ │ ├── networks/ │ │ │ ├── __init__.py │ │ │ ├── efficientnet_pytorch/ │ │ │ │ ├── __init__.py │ │ │ │ ├── condconv.py │ │ │ │ ├── model.py │ │ │ │ └── utils.py │ │ │ ├── pyramidnet.py │ │ │ ├── resnet.py │ │ │ ├── shakedrop.py │ │ │ ├── shakeshake/ │ │ │ │ ├── __init__.py │ │ │ │ ├── shake_resnet.py │ │ │ │ ├── shake_resnext.py │ │ │ │ └── shakeshake.py │ │ │ └── wideresnet.py │ │ ├── safe_shell_exec.py │ │ ├── search.py │ │ ├── tf_port/ │ │ │ ├── __init__.py │ │ │ ├── rmsprop.py │ │ │ └── tpu_bn.py │ │ ├── train.py │ │ └── train_dist.py │ ├── LICENSE │ ├── README.md │ ├── __init__.py │ ├── archive.py │ ├── confs/ │ │ ├── efficientnet_b0.yaml │ │ ├── efficientnet_b0_condconv.yaml │ │ ├── efficientnet_b1.yaml │ │ ├── efficientnet_b2.yaml │ │ ├── efficientnet_b3.yaml │ │ ├── efficientnet_b4.yaml │ │ ├── pyramid272_cifar.yaml │ │ ├── resnet200.yaml │ │ ├── resnet50.yaml │ │ ├── resnet50_mixup.yaml │ │ ├── shake26_2x112d_cifar.yaml │ │ ├── shake26_2x32d_cifar.yaml │ │ ├── shake26_2x96d_cifar.yaml │ │ ├── wresnet28x10_cifar.yaml │ │ ├── wresnet28x10_svhn.yaml │ │ └── wresnet40x2_cifar.yaml │ └── requirements.txt ├── madrys.py ├── main.py ├── models/ │ ├── DenseNet.py │ ├── ResNet.py │ ├── ToyModel.py │ ├── __init__.py │ ├── download.py │ └── inception_resnet_v1.py ├── perturbation.py ├── requirements.txt ├── scripts/ │ ├── cifar10/ │ │ ├── min-max-noise/ │ │ │ ├── classwise-noise/ │ │ │ │ ├── exp_setting.sh │ │ │ │ ├── search_perturbation_noise.sh │ │ │ │ ├── submit.sh │ │ │ │ ├── train.sh │ │ │ │ └── train.slurm │ │ │ └── samplewise-noise/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ ├── min-min-noise/ │ │ │ ├── classwise-noise/ │ │ │ │ ├── exp_setting.sh │ │ │ │ ├── search_perturbation_noise.sh │ │ │ │ ├── submit.sh │ │ │ │ ├── train.sh │ │ │ │ └── train.slurm │ │ │ └── samplewise-noise/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ └── random-noise/ │ │ ├── classwise-noise/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ └── samplewise-noise/ │ │ ├── exp_setting.sh │ │ ├── search_perturbation_noise.sh │ │ ├── submit.sh │ │ ├── train.sh │ │ └── train.slurm │ ├── cifar10-extension/ │ │ └── min-min-noise/ │ │ ├── classwise-noise-2/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ ├── classwise-noise-eps=16/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ ├── classwise-noise-eps=24/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ ├── classwise-noise-random-patch16/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ ├── classwise-noise-random-patch24/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ ├── classwise-noise-random-patch8/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ ├── classwise-noise-transfer-tiny-imagenet/ │ │ │ ├── exp_setting.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ ├── samplewise-noise-eps=16/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ ├── samplewise-noise-eps=24/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ ├── samplewise-noise-random-patch16/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ ├── samplewise-noise-random-patch24/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ └── samplewise-noise-random-patch8/ │ │ ├── exp_setting.sh │ │ ├── search_perturbation_noise.sh │ │ ├── submit.sh │ │ ├── train.sh │ │ └── train.slurm │ ├── cifar100/ │ │ └── min-min-noise/ │ │ ├── classwise-noise/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ └── samplewise-noise/ │ │ ├── exp_setting.sh │ │ ├── search_perturbation_noise.sh │ │ ├── submit.sh │ │ ├── train.sh │ │ └── train.slurm │ ├── cifar101/ │ │ ├── exp_setting.sh │ │ └── train.sh │ ├── face/ │ │ └── min-min-noise/ │ │ ├── exp_setting.sh │ │ ├── search_perturbation_noise.sh │ │ ├── train.sh │ │ ├── train.slurm │ │ ├── train_clean.sh │ │ ├── train_clean.slurm │ │ ├── train_protected.sh │ │ └── train_protected.slurm │ ├── imagenet-mini/ │ │ └── min-min-noise/ │ │ ├── classwise-noise/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ └── samplewise-noise/ │ │ ├── exp_setting.sh │ │ ├── search_perturbation_noise.sh │ │ ├── submit.sh │ │ ├── train.sh │ │ └── train.slurm │ ├── svhn/ │ │ └── min-min-noise/ │ │ ├── classwise-noise/ │ │ │ ├── exp_setting.sh │ │ │ ├── search_perturbation_noise.sh │ │ │ ├── submit.sh │ │ │ ├── train.sh │ │ │ └── train.slurm │ │ └── samplewise-noise/ │ │ ├── exp_setting.sh │ │ ├── search_perturbation_noise.sh │ │ ├── submit.sh │ │ ├── train.sh │ │ └── train.slurm │ └── tiny-imagenet/ │ └── min-min-noise/ │ └── classwise-noise/ │ ├── exp_setting.sh │ └── search_perturbation_noise.sh ├── toolbox.py ├── trainer.py └── util.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ # Auto detect text files and perform LF normalization * text=auto ================================================ FILE: .gitignore ================================================ __pycache__ *.pyc .DS_Store .ipynb_checkpoints experiments/ test_exp/ pretrained_checkpoints/ exp_results.json plots/ ================================================ FILE: CITATION.cff ================================================ cff-version: 1.2.0 message: "If you use this software, please cite it as below." authors: - family-names: "Huang" given-names: "Hanxun" orcid: "https://orcid.org/0000-0002-2793-6680" - family-names: "Ma" given-names: "Xingjun" orcid: "https://orcid.org/0000-0003-2099-4973" - family-names: "Erfani" given-names: "Sarah" orcid: "https://orcid.org/0000-0003-0885-0643" - family-names: "Bailey" given-names: "James" orcid: "https://orcid.org/0000-0002-3769-3811" - family-names: "Wang" given-names: "Yisen" title: "Unlearnable Examples: Making Personal Data Unexploitable" version: 0.0.1 date-released: 2021-01-15 url: "https://github.com/HanxunH/Unlearnable-Examples" preferred-citation: type: conference-paper title: "Unlearnable Examples: Making Personal Data Unexploitable" authors: - family-names: "Huang" given-names: "Hanxun" orcid: "https://orcid.org/0000-0002-2793-6680" - family-names: "Ma" given-names: "Xingjun" orcid: "https://orcid.org/0000-0003-2099-4973" - family-names: "Erfani" given-names: "Sarah" orcid: "https://orcid.org/0000-0003-0885-0643" - family-names: "Bailey" given-names: "James" orcid: "https://orcid.org/0000-0002-3769-3811" - family-names: "Wang" given-names: "Yisen" collection-title: "ICLR" year: 2021 ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2021 HanxunH Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: QuickStart.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "

Quick Start: Creating Sample-wise Unlearnable Examples

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Prepare Data

" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Files already downloaded and verified\n", "Files already downloaded and verified\n" ] } ], "source": [ "import torch\n", "import torchvision\n", "from torch.utils.data import DataLoader\n", "from torchvision import datasets, transforms\n", "\n", "# Prepare Dataset\n", "train_transform = [\n", " transforms.ToTensor()\n", "]\n", "test_transform = [\n", " transforms.ToTensor()\n", "]\n", "train_transform = transforms.Compose(train_transform)\n", "test_transform = transforms.Compose(test_transform)\n", "\n", "clean_train_dataset = datasets.CIFAR10(root='../datasets', train=True, download=True, transform=train_transform)\n", "clean_test_dataset = datasets.CIFAR10(root='../datasets', train=False, download=True, transform=test_transform)\n", "\n", "clean_train_loader = DataLoader(dataset=clean_train_dataset, batch_size=512,\n", " shuffle=False, pin_memory=True,\n", " drop_last=False, num_workers=12)\n", "clean_test_loader = DataLoader(dataset=clean_test_dataset, batch_size=512,\n", " shuffle=False, pin_memory=True,\n", " drop_last=False, num_workers=12)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Prepare Model

" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from models.ResNet import ResNet18\n", "import toolbox\n", "\n", "torch.backends.cudnn.enabled = True\n", "torch.backends.cudnn.benchmark = True\n", "\n", "base_model = ResNet18()\n", "base_model = base_model.cuda()\n", "criterion = torch.nn.CrossEntropyLoss()\n", "optimizer = torch.optim.SGD(params=base_model.parameters(), lr=0.1, weight_decay=0.0005, momentum=0.9)\n", "\n", "noise_generator = toolbox.PerturbationTool(epsilon=0.03137254901960784, num_steps=20, step_size=0.0031372549019607846)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Generate Error-Minimizing Noise

" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 98/98 [03:05<00:00, 1.89s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy 8.13\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 98/98 [03:06<00:00, 1.91s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy 11.89\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 98/98 [03:07<00:00, 1.91s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy 31.45\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 98/98 [03:07<00:00, 1.91s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy 67.06\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 98/98 [03:08<00:00, 1.92s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy 88.17\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 98/98 [03:07<00:00, 1.91s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy 68.22\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 98/98 [03:07<00:00, 1.91s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy 53.30\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 98/98 [03:08<00:00, 1.92s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy 96.87\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 98/98 [03:07<00:00, 1.92s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy 97.75\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 98/98 [03:07<00:00, 1.91s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy 99.72\n" ] } ], "source": [ "from tqdm import tqdm\n", "\n", "noise = torch.zeros([50000, 3, 32, 32])\n", "data_iter = iter(clean_train_loader)\n", "condition = True\n", "train_idx = 0\n", "\n", "while condition:\n", " # optimize theta for M steps\n", " base_model.train()\n", " for param in base_model.parameters():\n", " param.requires_grad = True\n", " for j in range(0, 10):\n", " try:\n", " (images, labels) = next(data_iter)\n", " except:\n", " train_idx = 0\n", " data_iter = iter(clean_train_loader)\n", " (images, labels) = next(data_iter)\n", " \n", " for i, _ in enumerate(images):\n", " # Update noise to images\n", " images[i] += noise[train_idx]\n", " train_idx += 1\n", " images, labels = images.cuda(), labels.cuda()\n", " base_model.zero_grad()\n", " optimizer.zero_grad()\n", " logits = base_model(images)\n", " loss = criterion(logits, labels)\n", " loss.backward()\n", " torch.nn.utils.clip_grad_norm_(base_model.parameters(), 5.0)\n", " optimizer.step()\n", " \n", " # Perturbation over entire dataset\n", " idx = 0\n", " for param in base_model.parameters():\n", " param.requires_grad = False\n", " for i, (images, labels) in tqdm(enumerate(clean_train_loader), total=len(clean_train_loader)):\n", " batch_start_idx, batch_noise = idx, []\n", " for i, _ in enumerate(images):\n", " # Update noise to images\n", " batch_noise.append(noise[idx])\n", " idx += 1\n", " batch_noise = torch.stack(batch_noise).cuda()\n", " \n", " # Update sample-wise perturbation\n", " base_model.eval()\n", " images, labels = images.cuda(), labels.cuda()\n", " perturb_img, eta = noise_generator.min_min_attack(images, labels, base_model, optimizer, criterion, \n", " random_noise=batch_noise)\n", " for i, delta in enumerate(eta):\n", " noise[batch_start_idx+i] = delta.clone().detach().cpu()\n", " \n", " # Eval stop condition\n", " eval_idx, total, correct = 0, 0, 0\n", " for i, (images, labels) in enumerate(clean_train_loader):\n", " for i, _ in enumerate(images):\n", " # Update noise to images\n", " images[i] += noise[eval_idx]\n", " eval_idx += 1\n", " images, labels = images.cuda(), labels.cuda()\n", " with torch.no_grad():\n", " logits = base_model(images)\n", " _, predicted = torch.max(logits.data, 1)\n", " total += labels.size(0)\n", " correct += (predicted == labels).sum().item()\n", " acc = correct / total\n", " print('Accuracy %.2f' % (acc*100))\n", " if acc > 0.99:\n", " condition=False \n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor([[[[ 2.5098e-02, 3.1373e-02, 2.8235e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " [-9.4118e-03, 1.8824e-02, -1.2549e-02, ..., -2.8235e-02,\n", " -2.8235e-02, -2.8235e-02],\n", " [-2.1961e-02, -3.1373e-02, -3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " ...,\n", " [ 3.1370e-03, -2.1961e-02, -2.8235e-02, ..., 6.2747e-03,\n", " 1.2549e-02, 2.5098e-02],\n", " [-3.1370e-03, 9.4119e-03, 9.4119e-03, ..., 2.3842e-07,\n", " -2.5098e-02, -3.1373e-02],\n", " [-3.1370e-03, 3.1375e-03, -1.5686e-02, ..., -6.2742e-03,\n", " -2.3842e-07, -1.5686e-02]],\n", "\n", " [[-3.1373e-02, -5.9605e-08, -2.8235e-02, ..., 3.1371e-03,\n", " -1.5686e-02, -2.1961e-02],\n", " [-3.1373e-02, 1.2549e-02, 6.2745e-03, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " [ 3.1373e-02, 2.5098e-02, 2.5098e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " ...,\n", " [-3.1373e-02, 1.8823e-02, 9.4115e-03, ..., -1.8824e-02,\n", " 9.4117e-03, 2.1961e-02],\n", " [ 3.1370e-03, -6.2745e-03, -9.4119e-03, ..., 3.1373e-02,\n", " 2.5098e-02, 2.8235e-02],\n", " [ 1.2549e-02, 2.1961e-02, 1.5686e-02, ..., 1.2549e-02,\n", " 2.5098e-02, 3.1373e-02]],\n", "\n", " [[ 3.1373e-02, -2.5098e-02, -2.5098e-02, ..., -2.8235e-02,\n", " -2.8235e-02, -2.8235e-02],\n", " [ 3.1373e-02, 0.0000e+00, 1.2549e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [-1.8823e-02, 0.0000e+00, -3.1373e-02, ..., -1.8824e-02,\n", " -1.8824e-02, 2.8235e-02],\n", " ...,\n", " [-2.1961e-02, -2.8235e-02, -2.5098e-02, ..., -3.1373e-02,\n", " -2.7451e-02, -2.8235e-02],\n", " [ 3.1373e-02, 3.1372e-03, 3.1373e-02, ..., -3.1373e-02,\n", " -1.2549e-02, -1.8824e-02],\n", " [ 9.4117e-03, 1.5686e-02, -2.8235e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02]]],\n", "\n", "\n", " [[[-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 2.5098e-02],\n", " ...,\n", " [-2.3842e-07, 6.2742e-03, -1.8824e-02, ..., -2.5098e-02,\n", " -2.5098e-02, -2.5098e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -2.8235e-02,\n", " -2.8235e-02, -2.8235e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -2.8235e-02,\n", " -2.8235e-02, -2.8235e-02]],\n", "\n", " [[ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " [ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " [-1.2549e-02, -3.1373e-02, 1.8824e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " ...,\n", " [ 1.2549e-02, 6.2747e-03, 2.5098e-02, ..., 2.5098e-02,\n", " 1.2549e-02, 3.1373e-02],\n", " [ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., 2.8235e-02,\n", " 2.8235e-02, 2.8235e-02],\n", " [ 2.8235e-02, 3.1373e-02, 3.1373e-02, ..., 2.8235e-02,\n", " 2.8235e-02, 2.8235e-02]],\n", "\n", " [[-2.1960e-02, -3.1373e-02, -3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [-3.1373e-02, -1.2549e-02, -3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " [-1.8824e-02, 2.5098e-02, 1.8824e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " ...,\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -2.8235e-02,\n", " -2.8235e-02, -2.8235e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -2.8235e-02,\n", " -2.8235e-02, -2.8235e-02],\n", " [ 1.2549e-02, 6.2746e-03, -3.1373e-02, ..., -2.8235e-02,\n", " -3.1373e-02, -3.1373e-02]]],\n", "\n", "\n", " [[[-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -3.1373e-02,\n", " 1.0980e-02, 1.0980e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., 3.1372e-03,\n", " 3.1372e-03, 3.1372e-03],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., 7.0588e-03,\n", " 7.0588e-03, 7.0588e-03],\n", " ...,\n", " [ 5.9605e-08, -6.2745e-03, -1.2549e-02, ..., -1.2549e-02,\n", " -2.5098e-02, -6.2745e-03],\n", " [-2.5098e-02, -1.8824e-02, 6.2746e-03, ..., 1.2549e-02,\n", " 1.2549e-02, 6.2746e-03],\n", " [-1.2549e-02, -1.8824e-02, 3.1373e-02, ..., 5.9605e-08,\n", " 5.9605e-08, -6.2745e-03]],\n", "\n", " [[ 3.1372e-03, 1.0980e-02, 1.0980e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [ 3.1372e-03, 3.1372e-03, 3.1372e-03, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [-2.5098e-02, -1.4902e-02, 7.0588e-03, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " ...,\n", " [ 6.2745e-03, 1.2549e-02, 1.2549e-02, ..., -6.2746e-03,\n", " -6.2746e-03, -5.9605e-08],\n", " [ 1.8824e-02, 2.5098e-02, -5.9605e-08, ..., -1.2549e-02,\n", " 1.2549e-02, 2.5098e-02],\n", " [-6.2746e-03, 3.1373e-02, -3.1373e-02, ..., -5.9605e-08,\n", " -6.2746e-03, 2.8235e-02]],\n", "\n", " [[-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., 1.0980e-02,\n", " 1.0980e-02, 1.0980e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., 3.1372e-03,\n", " 3.1372e-03, 3.1372e-03],\n", " [-6.2747e-03, -3.1373e-02, -3.1373e-02, ..., 7.0588e-03,\n", " 7.0588e-03, 7.0588e-03],\n", " ...,\n", " [-6.2745e-03, -6.2745e-03, -6.2745e-03, ..., -2.8235e-02,\n", " -2.8235e-02, -2.5098e-02],\n", " [ 1.2549e-02, 1.8824e-02, 1.2549e-02, ..., -2.1961e-02,\n", " -2.5098e-02, -2.8235e-02],\n", " [-2.5098e-02, -3.1373e-02, -1.8824e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -1.8824e-02]]],\n", "\n", "\n", " ...,\n", "\n", "\n", " [[[ 6.2745e-03, 1.2549e-02, -3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " [-4.4703e-08, -2.8235e-02, -3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " [-2.5098e-02, -2.5098e-02, -2.5098e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " ...,\n", " [ 1.2549e-02, 6.2746e-03, -6.2745e-03, ..., -6.2745e-03,\n", " -6.2745e-03, -6.2745e-03],\n", " [-6.2745e-03, -6.2745e-03, 5.9605e-08, ..., -2.2352e-08,\n", " -1.4901e-08, -2.3529e-03],\n", " [-3.1373e-02, -3.1373e-02, -1.8824e-02, ..., -2.5098e-02,\n", " -2.5098e-02, -2.5098e-02]],\n", "\n", " [[-1.2549e-02, 1.8823e-02, 3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [ 1.2549e-02, 1.2549e-02, -6.2742e-03, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " ...,\n", " [-1.8824e-02, 6.2745e-03, 6.2745e-03, ..., 6.2745e-03,\n", " 6.2745e-03, 6.2745e-03],\n", " [-5.9605e-08, -5.9605e-08, -5.9605e-08, ..., -5.9605e-08,\n", " 6.2745e-03, 1.2549e-02],\n", " [ 3.1373e-02, 2.1961e-02, 1.2549e-02, ..., 2.5098e-02,\n", " 2.5098e-02, 2.5098e-02]],\n", "\n", " [[ 1.2549e-02, -3.1373e-02, -3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " [ 3.1373e-02, -3.1375e-03, 3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " [ 3.1373e-02, 1.4902e-02, 3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " ...,\n", " [-6.2745e-03, -6.2745e-03, -6.2745e-03, ..., -2.5098e-02,\n", " -2.8235e-02, -2.5098e-02],\n", " [ 5.9605e-08, -1.5686e-02, -1.2549e-02, ..., -2.8235e-02,\n", " -2.5098e-02, -6.2746e-03],\n", " [-1.8824e-02, -2.8235e-02, -2.8235e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02]]],\n", "\n", "\n", " [[[ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " ...,\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., 3.1370e-03,\n", " -2.3842e-07, -2.3842e-07],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -1.8824e-02,\n", " -1.8824e-02, -1.8824e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -1.8824e-02,\n", " -1.8824e-02, -1.8824e-02]],\n", "\n", " [[-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " [ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 3.1373e-02],\n", " ...,\n", " [ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., 9.4119e-03,\n", " -9.4115e-03, 1.2549e-02],\n", " [ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., 1.8824e-02,\n", " 1.8824e-02, 1.8824e-02],\n", " [ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., 1.8824e-02,\n", " 1.8824e-02, 1.8824e-02]],\n", "\n", " [[ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [ 3.1372e-02, -3.1373e-02, 3.1372e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " ...,\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -1.8824e-02,\n", " -1.8824e-02, 2.8235e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -1.8824e-02,\n", " -1.8824e-02, -1.8824e-02],\n", " [-3.1373e-02, -3.1373e-02, -3.1373e-02, ..., -1.8824e-02,\n", " -1.8824e-02, -1.8824e-02]]],\n", "\n", "\n", " [[[ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., -2.5098e-02,\n", " -2.5098e-02, -3.1373e-02],\n", " [ 3.1373e-02, 3.1373e-02, 2.8235e-02, ..., -2.5098e-02,\n", " -2.5098e-02, -2.5098e-02],\n", " [ 3.1372e-02, 1.8823e-02, -3.1373e-02, ..., -2.5098e-02,\n", " -2.5098e-02, -2.5098e-02],\n", " ...,\n", " [-2.5098e-02, -2.5098e-02, -2.5098e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [-2.5098e-02, -2.5098e-02, -2.5098e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1372e-02],\n", " [-3.1373e-02, -3.1373e-02, -2.5098e-02, ..., 2.8235e-02,\n", " 2.8235e-02, 2.8235e-02]],\n", "\n", " [[-3.1373e-02, -3.1373e-02, -2.8235e-02, ..., 2.5098e-02,\n", " 2.5098e-02, 3.1373e-02],\n", " [-3.1373e-02, -3.1373e-02, -2.3842e-07, ..., 2.5098e-02,\n", " 2.5098e-02, 3.1373e-02],\n", " [-6.2742e-03, 2.5098e-02, 3.1373e-02, ..., 2.5098e-02,\n", " 2.5098e-02, 2.5098e-02],\n", " ...,\n", " [ 2.5098e-02, 2.5098e-02, 2.5098e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 2.8235e-02],\n", " [ 2.5098e-02, 2.5098e-02, 2.5098e-02, ..., 3.1373e-02,\n", " 3.1373e-02, 2.8235e-02],\n", " [ 3.1373e-02, 3.1373e-02, 3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02]],\n", "\n", " [[ 1.8823e-02, 2.8235e-02, 6.2742e-03, ..., -2.5098e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [-1.2549e-02, -3.1373e-02, -3.1373e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [-2.5098e-02, -2.5098e-02, -2.5098e-02, ..., -2.5098e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " ...,\n", " [-2.5098e-02, -2.5098e-02, -2.5098e-02, ..., -2.8235e-02,\n", " -2.8235e-02, -2.8235e-02],\n", " [-2.5098e-02, -2.5098e-02, -2.5098e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02],\n", " [-3.1373e-02, -2.5098e-02, -2.5098e-02, ..., -3.1373e-02,\n", " -3.1373e-02, -3.1373e-02]]]])\n" ] } ], "source": [ "# Examine the noise\n", "print(noise)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Creat Unlearnable Dataset

" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Files already downloaded and verified\n", "Files already downloaded and verified\n" ] } ], "source": [ "import numpy as np\n", "\n", "# Add standard augmentation\n", "train_transform = [\n", " transforms.RandomCrop(32, padding=4),\n", " transforms.RandomHorizontalFlip(),\n", " transforms.ToTensor()\n", "]\n", "train_transform = transforms.Compose(train_transform)\n", "clean_train_dataset = datasets.CIFAR10(root='../datasets', train=True, download=True, transform=train_transform)\n", "unlearnable_train_dataset = datasets.CIFAR10(root='../datasets', train=True, download=True, transform=train_transform)\n", "\n", "perturb_noise = noise.mul(255).clamp_(0, 255).permute(0, 2, 3, 1).to('cpu').numpy()\n", "unlearnable_train_dataset.data = unlearnable_train_dataset.data.astype(np.float32)\n", "for i in range(len(unlearnable_train_dataset)):\n", " unlearnable_train_dataset.data[i] += perturb_noise[i]\n", " unlearnable_train_dataset.data[i] = np.clip(unlearnable_train_dataset.data[i], a_min=0, a_max=255)\n", "unlearnable_train_dataset.data = unlearnable_train_dataset.data.astype(np.uint8)\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Visualize Clean Images, Error-Minimizing Noise, Unlearnable Images

" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import random\n", "import matplotlib.pyplot as plt\n", "import matplotlib\n", "%matplotlib inline\n", "\n", "def imshow(img):\n", " fig = plt.figure(figsize=(8, 8), dpi=80, facecolor='w', edgecolor='k')\n", " npimg = img.numpy()\n", " plt.imshow(np.transpose(npimg, (1, 2, 0)))\n", " plt.show()\n", " \n", "def get_pairs_of_imgs(idx):\n", " clean_img = clean_train_dataset.data[idx]\n", " unlearnable_img = unlearnable_train_dataset.data[idx]\n", " clean_img = torchvision.transforms.functional.to_tensor(clean_img)\n", " unlearnable_img = torchvision.transforms.functional.to_tensor(unlearnable_img)\n", "\n", " x = noise[idx]\n", " x_min = torch.min(x)\n", " x_max = torch.max(x)\n", " noise_norm = (x - x_min) / (x_max - x_min)\n", " noise_norm = torch.clamp(noise_norm, 0, 1)\n", " return [clean_img, noise_norm, unlearnable_img]\n", " \n", "selected_idx = [random.randint(0, 50000) for _ in range(3)]\n", "img_grid = []\n", "for idx in selected_idx:\n", " img_grid += get_pairs_of_imgs(idx)\n", " \n", "\n", "imshow(torchvision.utils.make_grid(torch.stack(img_grid), nrow=3, pad_value=255))\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Train ResNet18 on Unlearnable Dataset

" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Acc 36.99 Loss: 1.73: 100%|██████████| 391/391 [00:20<00:00, 19.17it/s]\n", " 0%| | 0/391 [00:00 pr: continue img = apply_augment(img, name, level) return img class CatDogDataset(datasets.VisionDataset): def __init__(self, root, split='train', transform=None, target_transform=None): self.root = root self.split = split self.transform = transform self.target_transform = target_transform self.img_file_names = os.listdir(os.path.join(root, split)) def __len__(self): return len(self.img_file_names) def __getitem__(self, index): filename = self.img_file_names[index] label = filename[:3] if label == 'cat': label = 0 elif label == 'dog': label = 1 else: print(filename) raise('Unknown label') with open(os.path.join(self.root, self.split, filename), 'rb') as f: img = Image.open(f).convert('RGB') if self.transform is not None: img = self.transform(img) if self.target_transform is not None: label = self.target_transform(label) return img, label class CelebAMini(datasets.CelebA): def __init__(self, root, split="train", target_type="attr", transform=None, target_transform=None, download=False, num_of_classes=1000): super(CelebAMini, self).__init__(root=root, split=split, target_type=target_type, transform=transform, target_transform=target_transform, download=False) split_map = { "train": 0, "valid": 1, "test": 2, "all": None, } split_ = split_map[datasets.utils.verify_str_arg(split.lower(), "split", ("train", "valid", "test", "all"))] fn = partial(os.path.join, self.root, self.base_folder) splits = pandas.read_csv(fn("list_eval_partition.txt"), delim_whitespace=True, header=None, index_col=0) identity = pandas.read_csv(fn("identity_CelebA.txt"), delim_whitespace=True, header=None, index_col=0) mask = slice(None) if split_ is None else (splits[1] == split_) identity = identity[mask] identity = identity[identity[1] < num_of_classes] self.filename = identity.index.values self.identity = identity.values print(self.identity) def __len__(self): return len(self.identity) def __getitem__(self, index): filename = self.filename[index] target = self.identity[index][0] X = Image.open(os.path.join(self.root, self.base_folder, "img_align_celeba", filename)) if self.transform is not None: X = self.transform(X) return X, target class Cutout(object): def __init__(self, length): self.length = length def __call__(self, img): h, w = img.size(1), img.size(2) mask = np.ones((h, w), np.float32) y = np.random.randint(h) x = np.random.randint(w) y1 = np.clip(y - self.length // 2, 0, h) y2 = np.clip(y + self.length // 2, 0, h) x1 = np.clip(x - self.length // 2, 0, w) x2 = np.clip(x + self.length // 2, 0, w) mask[y1: y2, x1: x2] = 0. mask = torch.from_numpy(mask) mask = mask.expand_as(img) img *= mask return img class CutMix(Dataset): def __init__(self, dataset, num_class, num_mix=2, beta=1.0, prob=0.5): self.dataset = dataset self.num_class = num_class self.num_mix = num_mix self.beta = beta self.prob = prob def __getitem__(self, index): img, lb = self.dataset[index] lb_onehot = onehot(self.num_class, lb) for _ in range(self.num_mix): r = np.random.rand(1) if self.beta <= 0 or r > self.prob: continue # generate mixed sample lam = np.random.beta(self.beta, self.beta) rand_index = random.choice(range(len(self))) img2, lb2 = self.dataset[rand_index] lb2_onehot = onehot(self.num_class, lb2) bbx1, bby1, bbx2, bby2 = rand_bbox(img.size(), lam) img[:, bbx1:bbx2, bby1:bby2] = img2[:, bbx1:bbx2, bby1:bby2] lam = 1 - ((bbx2 - bbx1) * (bby2 - bby1) / (img.size()[-1] * img.size()[-2])) lb_onehot = lb_onehot * lam + lb2_onehot * (1. - lam) return img, lb_onehot def __len__(self): return len(self.dataset) class MixUp(Dataset): def __init__(self, dataset, num_class, num_mix=2, beta=1.0, prob=0.5): self.dataset = dataset self.num_class = num_class self.num_mix = num_mix self.beta = beta self.prob = prob def __getitem__(self, index): img, lb = self.dataset[index] lb_onehot = onehot(self.num_class, lb) for _ in range(self.num_mix): r = np.random.rand(1) if self.beta <= 0 or r > self.prob: continue # generate mixed sample lam = np.random.beta(self.beta, self.beta) rand_index = random.choice(range(len(self))) img2, lb2 = self.dataset[rand_index] lb2_onehot = onehot(self.num_class, lb2) img = img * lam + img2 * (1-lam) lb_onehot = lb_onehot * lam + lb2_onehot * (1. - lam) return img, lb_onehot def __len__(self): return len(self.dataset) ================================================ FILE: evaluator.py ================================================ import time import models import torch import torch.optim as optim import util from torch.autograd import Variable if torch.cuda.is_available(): device = torch.device('cuda') else: device = torch.device('cpu') class Evaluator(): def __init__(self, data_loader, logger, config): self.loss_meters = util.AverageMeter() self.acc_meters = util.AverageMeter() self.acc5_meters = util.AverageMeter() self.criterion = torch.nn.CrossEntropyLoss() self.data_loader = data_loader self.logger = logger self.log_frequency = config.log_frequency if config.log_frequency is not None else 100 self.config = config self.current_acc = 0 self.current_acc_top5 = 0 self.confusion_matrix = torch.zeros(config.num_classes, config.num_classes) return def _reset_stats(self): self.loss_meters = util.AverageMeter() self.acc_meters = util.AverageMeter() self.acc5_meters = util.AverageMeter() self.confusion_matrix = torch.zeros(self.config.num_classes, self.config.num_classes) return def eval(self, epoch, model): model.eval() for i, (images, labels) in enumerate(self.data_loader["test_dataset"]): start = time.time() log_payload = self.eval_batch(images=images, labels=labels, model=model) end = time.time() time_used = end - start display = util.log_display(epoch=epoch, global_step=i, time_elapse=time_used, **log_payload) if self.logger is not None: self.logger.info(display) return def eval_batch(self, images, labels, model): images, labels = images.to(device, non_blocking=True), labels.to(device, non_blocking=True) with torch.no_grad(): pred = model(images) loss = self.criterion(pred, labels) acc, acc5 = util.accuracy(pred, labels, topk=(1, 5)) _, preds = torch.max(pred, 1) for t, p in zip(labels.view(-1), preds.view(-1)): self.confusion_matrix[t.long(), p.long()] += 1 self.loss_meters.update(loss.item(), n=images.size(0)) self.acc_meters.update(acc.item(), n=images.size(0)) self.acc5_meters.update(acc5.item(), n=images.size(0)) payload = {"acc": acc.item(), "acc_avg": self.acc_meters.avg, "acc5": acc5.item(), "acc5_avg": self.acc5_meters.avg, "loss": loss.item(), "loss_avg": self.loss_meters.avg} return payload def _pgd_whitebox(self, model, X, y, random_start=True, epsilon=0.031, num_steps=20, step_size=0.003): model.eval() out = model(X) acc = (out.data.max(1)[1] == y.data).float().sum() X_pgd = Variable(X.data, requires_grad=True) if random_start: random_noise = torch.FloatTensor(*X_pgd.shape).uniform_(-epsilon, epsilon).to(device) X_pgd = Variable(X_pgd.data + random_noise, requires_grad=True) for _ in range(num_steps): opt = optim.SGD([X_pgd], lr=1e-3) opt.zero_grad() with torch.enable_grad(): loss = torch.nn.CrossEntropyLoss()(model(X_pgd), y) loss.backward() eta = step_size * X_pgd.grad.data.sign() X_pgd = Variable(X_pgd.data + eta, requires_grad=True) eta = torch.clamp(X_pgd.data - X.data, -epsilon, epsilon) X_pgd = Variable(X.data + eta, requires_grad=True) X_pgd = Variable(torch.clamp(X_pgd, 0, 1.0), requires_grad=True) acc_pgd = (model(X_pgd).data.max(1)[1] == y.data).float().sum() return acc.item(), acc_pgd.item() ================================================ FILE: fast_autoaugment/.gitignore ================================================ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ ================================================ FILE: fast_autoaugment/FastAutoAugment/__init__.py ================================================ ================================================ FILE: fast_autoaugment/FastAutoAugment/archive.py ================================================ # Policy found on CIFAR-10 and CIFAR-100 from __future__ import absolute_import from __future__ import division from __future__ import print_function from collections import defaultdict from .augmentations import get_augment, augment_list def arsaug_policy(): exp0_0 = [ [('Solarize', 0.66, 0.34), ('Equalize', 0.56, 0.61)], [('Equalize', 0.43, 0.06), ('AutoContrast', 0.66, 0.08)], [('Color', 0.72, 0.47), ('Contrast', 0.88, 0.86)], [('Brightness', 0.84, 0.71), ('Color', 0.31, 0.74)], [('Rotate', 0.68, 0.26), ('TranslateX', 0.38, 0.88)]] exp0_1 = [ [('TranslateY', 0.88, 0.96), ('TranslateY', 0.53, 0.79)], [('AutoContrast', 0.44, 0.36), ('Solarize', 0.22, 0.48)], [('AutoContrast', 0.93, 0.32), ('Solarize', 0.85, 0.26)], [('Solarize', 0.55, 0.38), ('Equalize', 0.43, 0.48)], [('TranslateY', 0.72, 0.93), ('AutoContrast', 0.83, 0.95)]] exp0_2 = [ [('Solarize', 0.43, 0.58), ('AutoContrast', 0.82, 0.26)], [('TranslateY', 0.71, 0.79), ('AutoContrast', 0.81, 0.94)], [('AutoContrast', 0.92, 0.18), ('TranslateY', 0.77, 0.85)], [('Equalize', 0.71, 0.69), ('Color', 0.23, 0.33)], [('Sharpness', 0.36, 0.98), ('Brightness', 0.72, 0.78)]] exp0_3 = [ [('Equalize', 0.74, 0.49), ('TranslateY', 0.86, 0.91)], [('TranslateY', 0.82, 0.91), ('TranslateY', 0.96, 0.79)], [('AutoContrast', 0.53, 0.37), ('Solarize', 0.39, 0.47)], [('TranslateY', 0.22, 0.78), ('Color', 0.91, 0.65)], [('Brightness', 0.82, 0.46), ('Color', 0.23, 0.91)]] exp0_4 = [ [('Cutout', 0.27, 0.45), ('Equalize', 0.37, 0.21)], [('Color', 0.43, 0.23), ('Brightness', 0.65, 0.71)], [('ShearX', 0.49, 0.31), ('AutoContrast', 0.92, 0.28)], [('Equalize', 0.62, 0.59), ('Equalize', 0.38, 0.91)], [('Solarize', 0.57, 0.31), ('Equalize', 0.61, 0.51)]] exp0_5 = [ [('TranslateY', 0.29, 0.35), ('Sharpness', 0.31, 0.64)], [('Color', 0.73, 0.77), ('TranslateX', 0.65, 0.76)], [('ShearY', 0.29, 0.74), ('Posterize', 0.42, 0.58)], [('Color', 0.92, 0.79), ('Equalize', 0.68, 0.54)], [('Sharpness', 0.87, 0.91), ('Sharpness', 0.93, 0.41)]] exp0_6 = [ [('Solarize', 0.39, 0.35), ('Color', 0.31, 0.44)], [('Color', 0.33, 0.77), ('Color', 0.25, 0.46)], [('ShearY', 0.29, 0.74), ('Posterize', 0.42, 0.58)], [('AutoContrast', 0.32, 0.79), ('Cutout', 0.68, 0.34)], [('AutoContrast', 0.67, 0.91), ('AutoContrast', 0.73, 0.83)]] return exp0_0 + exp0_1 + exp0_2 + exp0_3 + exp0_4 + exp0_5 + exp0_6 def autoaug2arsaug(f): def autoaug(): mapper = defaultdict(lambda: lambda x: x) mapper.update({ 'ShearX': lambda x: float_parameter(x, 0.3), 'ShearY': lambda x: float_parameter(x, 0.3), 'TranslateX': lambda x: int_parameter(x, 10), 'TranslateY': lambda x: int_parameter(x, 10), 'Rotate': lambda x: int_parameter(x, 30), 'Solarize': lambda x: 256 - int_parameter(x, 256), 'Posterize2': lambda x: 4 - int_parameter(x, 4), 'Contrast': lambda x: float_parameter(x, 1.8) + .1, 'Color': lambda x: float_parameter(x, 1.8) + .1, 'Brightness': lambda x: float_parameter(x, 1.8) + .1, 'Sharpness': lambda x: float_parameter(x, 1.8) + .1, 'CutoutAbs': lambda x: int_parameter(x, 20) }) def low_high(name, prev_value): _, low, high = get_augment(name) return float(prev_value - low) / (high - low) policies = f() new_policies = [] for policy in policies: new_policies.append([(name, pr, low_high(name, mapper[name](level))) for name, pr, level in policy]) return new_policies return autoaug @autoaug2arsaug def autoaug_paper_cifar10(): return [ [('Invert', 0.1, 7), ('Contrast', 0.2, 6)], [('Rotate', 0.7, 2), ('TranslateXAbs', 0.3, 9)], [('Sharpness', 0.8, 1), ('Sharpness', 0.9, 3)], [('ShearY', 0.5, 8), ('TranslateYAbs', 0.7, 9)], [('AutoContrast', 0.5, 8), ('Equalize', 0.9, 2)], [('ShearY', 0.2, 7), ('Posterize2', 0.3, 7)], [('Color', 0.4, 3), ('Brightness', 0.6, 7)], [('Sharpness', 0.3, 9), ('Brightness', 0.7, 9)], [('Equalize', 0.6, 5), ('Equalize', 0.5, 1)], [('Contrast', 0.6, 7), ('Sharpness', 0.6, 5)], [('Color', 0.7, 7), ('TranslateXAbs', 0.5, 8)], [('Equalize', 0.3, 7), ('AutoContrast', 0.4, 8)], [('TranslateYAbs', 0.4, 3), ('Sharpness', 0.2, 6)], [('Brightness', 0.9, 6), ('Color', 0.2, 6)], [('Solarize', 0.5, 2), ('Invert', 0.0, 3)], [('Equalize', 0.2, 0), ('AutoContrast', 0.6, 0)], [('Equalize', 0.2, 8), ('Equalize', 0.6, 4)], [('Color', 0.9, 9), ('Equalize', 0.6, 6)], [('AutoContrast', 0.8, 4), ('Solarize', 0.2, 8)], [('Brightness', 0.1, 3), ('Color', 0.7, 0)], [('Solarize', 0.4, 5), ('AutoContrast', 0.9, 3)], [('TranslateYAbs', 0.9, 9), ('TranslateYAbs', 0.7, 9)], [('AutoContrast', 0.9, 2), ('Solarize', 0.8, 3)], [('Equalize', 0.8, 8), ('Invert', 0.1, 3)], [('TranslateYAbs', 0.7, 9), ('AutoContrast', 0.9, 1)], ] @autoaug2arsaug def autoaug_policy(): """AutoAugment policies found on Cifar.""" exp0_0 = [ [('Invert', 0.1, 7), ('Contrast', 0.2, 6)], [('Rotate', 0.7, 2), ('TranslateXAbs', 0.3, 9)], [('Sharpness', 0.8, 1), ('Sharpness', 0.9, 3)], [('ShearY', 0.5, 8), ('TranslateYAbs', 0.7, 9)], [('AutoContrast', 0.5, 8), ('Equalize', 0.9, 2)]] exp0_1 = [ [('Solarize', 0.4, 5), ('AutoContrast', 0.9, 3)], [('TranslateYAbs', 0.9, 9), ('TranslateYAbs', 0.7, 9)], [('AutoContrast', 0.9, 2), ('Solarize', 0.8, 3)], [('Equalize', 0.8, 8), ('Invert', 0.1, 3)], [('TranslateYAbs', 0.7, 9), ('AutoContrast', 0.9, 1)]] exp0_2 = [ [('Solarize', 0.4, 5), ('AutoContrast', 0.0, 2)], [('TranslateYAbs', 0.7, 9), ('TranslateYAbs', 0.7, 9)], [('AutoContrast', 0.9, 0), ('Solarize', 0.4, 3)], [('Equalize', 0.7, 5), ('Invert', 0.1, 3)], [('TranslateYAbs', 0.7, 9), ('TranslateYAbs', 0.7, 9)]] exp0_3 = [ [('Solarize', 0.4, 5), ('AutoContrast', 0.9, 1)], [('TranslateYAbs', 0.8, 9), ('TranslateYAbs', 0.9, 9)], [('AutoContrast', 0.8, 0), ('TranslateYAbs', 0.7, 9)], [('TranslateYAbs', 0.2, 7), ('Color', 0.9, 6)], [('Equalize', 0.7, 6), ('Color', 0.4, 9)]] exp1_0 = [ [('ShearY', 0.2, 7), ('Posterize2', 0.3, 7)], [('Color', 0.4, 3), ('Brightness', 0.6, 7)], [('Sharpness', 0.3, 9), ('Brightness', 0.7, 9)], [('Equalize', 0.6, 5), ('Equalize', 0.5, 1)], [('Contrast', 0.6, 7), ('Sharpness', 0.6, 5)]] exp1_1 = [ [('Brightness', 0.3, 7), ('AutoContrast', 0.5, 8)], [('AutoContrast', 0.9, 4), ('AutoContrast', 0.5, 6)], [('Solarize', 0.3, 5), ('Equalize', 0.6, 5)], [('TranslateYAbs', 0.2, 4), ('Sharpness', 0.3, 3)], [('Brightness', 0.0, 8), ('Color', 0.8, 8)]] exp1_2 = [ [('Solarize', 0.2, 6), ('Color', 0.8, 6)], [('Solarize', 0.2, 6), ('AutoContrast', 0.8, 1)], [('Solarize', 0.4, 1), ('Equalize', 0.6, 5)], [('Brightness', 0.0, 0), ('Solarize', 0.5, 2)], [('AutoContrast', 0.9, 5), ('Brightness', 0.5, 3)]] exp1_3 = [ [('Contrast', 0.7, 5), ('Brightness', 0.0, 2)], [('Solarize', 0.2, 8), ('Solarize', 0.1, 5)], [('Contrast', 0.5, 1), ('TranslateYAbs', 0.2, 9)], [('AutoContrast', 0.6, 5), ('TranslateYAbs', 0.0, 9)], [('AutoContrast', 0.9, 4), ('Equalize', 0.8, 4)]] exp1_4 = [ [('Brightness', 0.0, 7), ('Equalize', 0.4, 7)], [('Solarize', 0.2, 5), ('Equalize', 0.7, 5)], [('Equalize', 0.6, 8), ('Color', 0.6, 2)], [('Color', 0.3, 7), ('Color', 0.2, 4)], [('AutoContrast', 0.5, 2), ('Solarize', 0.7, 2)]] exp1_5 = [ [('AutoContrast', 0.2, 0), ('Equalize', 0.1, 0)], [('ShearY', 0.6, 5), ('Equalize', 0.6, 5)], [('Brightness', 0.9, 3), ('AutoContrast', 0.4, 1)], [('Equalize', 0.8, 8), ('Equalize', 0.7, 7)], [('Equalize', 0.7, 7), ('Solarize', 0.5, 0)]] exp1_6 = [ [('Equalize', 0.8, 4), ('TranslateYAbs', 0.8, 9)], [('TranslateYAbs', 0.8, 9), ('TranslateYAbs', 0.6, 9)], [('TranslateYAbs', 0.9, 0), ('TranslateYAbs', 0.5, 9)], [('AutoContrast', 0.5, 3), ('Solarize', 0.3, 4)], [('Solarize', 0.5, 3), ('Equalize', 0.4, 4)]] exp2_0 = [ [('Color', 0.7, 7), ('TranslateXAbs', 0.5, 8)], [('Equalize', 0.3, 7), ('AutoContrast', 0.4, 8)], [('TranslateYAbs', 0.4, 3), ('Sharpness', 0.2, 6)], [('Brightness', 0.9, 6), ('Color', 0.2, 8)], [('Solarize', 0.5, 2), ('Invert', 0.0, 3)]] exp2_1 = [ [('AutoContrast', 0.1, 5), ('Brightness', 0.0, 0)], [('CutoutAbs', 0.2, 4), ('Equalize', 0.1, 1)], [('Equalize', 0.7, 7), ('AutoContrast', 0.6, 4)], [('Color', 0.1, 8), ('ShearY', 0.2, 3)], [('ShearY', 0.4, 2), ('Rotate', 0.7, 0)]] exp2_2 = [ [('ShearY', 0.1, 3), ('AutoContrast', 0.9, 5)], [('TranslateYAbs', 0.3, 6), ('CutoutAbs', 0.3, 3)], [('Equalize', 0.5, 0), ('Solarize', 0.6, 6)], [('AutoContrast', 0.3, 5), ('Rotate', 0.2, 7)], [('Equalize', 0.8, 2), ('Invert', 0.4, 0)]] exp2_3 = [ [('Equalize', 0.9, 5), ('Color', 0.7, 0)], [('Equalize', 0.1, 1), ('ShearY', 0.1, 3)], [('AutoContrast', 0.7, 3), ('Equalize', 0.7, 0)], [('Brightness', 0.5, 1), ('Contrast', 0.1, 7)], [('Contrast', 0.1, 4), ('Solarize', 0.6, 5)]] exp2_4 = [ [('Solarize', 0.2, 3), ('ShearX', 0.0, 0)], [('TranslateXAbs', 0.3, 0), ('TranslateXAbs', 0.6, 0)], [('Equalize', 0.5, 9), ('TranslateYAbs', 0.6, 7)], [('ShearX', 0.1, 0), ('Sharpness', 0.5, 1)], [('Equalize', 0.8, 6), ('Invert', 0.3, 6)]] exp2_5 = [ [('AutoContrast', 0.3, 9), ('CutoutAbs', 0.5, 3)], [('ShearX', 0.4, 4), ('AutoContrast', 0.9, 2)], [('ShearX', 0.0, 3), ('Posterize2', 0.0, 3)], [('Solarize', 0.4, 3), ('Color', 0.2, 4)], [('Equalize', 0.1, 4), ('Equalize', 0.7, 6)]] exp2_6 = [ [('Equalize', 0.3, 8), ('AutoContrast', 0.4, 3)], [('Solarize', 0.6, 4), ('AutoContrast', 0.7, 6)], [('AutoContrast', 0.2, 9), ('Brightness', 0.4, 8)], [('Equalize', 0.1, 0), ('Equalize', 0.0, 6)], [('Equalize', 0.8, 4), ('Equalize', 0.0, 4)]] exp2_7 = [ [('Equalize', 0.5, 5), ('AutoContrast', 0.1, 2)], [('Solarize', 0.5, 5), ('AutoContrast', 0.9, 5)], [('AutoContrast', 0.6, 1), ('AutoContrast', 0.7, 8)], [('Equalize', 0.2, 0), ('AutoContrast', 0.1, 2)], [('Equalize', 0.6, 9), ('Equalize', 0.4, 4)]] exp0s = exp0_0 + exp0_1 + exp0_2 + exp0_3 exp1s = exp1_0 + exp1_1 + exp1_2 + exp1_3 + exp1_4 + exp1_5 + exp1_6 exp2s = exp2_0 + exp2_1 + exp2_2 + exp2_3 + exp2_4 + exp2_5 + exp2_6 + exp2_7 return exp0s + exp1s + exp2s PARAMETER_MAX = 10 def float_parameter(level, maxval): return float(level) * maxval / PARAMETER_MAX def int_parameter(level, maxval): return int(float_parameter(level, maxval)) def no_duplicates(f): def wrap_remove_duplicates(): policies = f() return remove_deplicates(policies) return wrap_remove_duplicates def remove_deplicates(policies): s = set() new_policies = [] for ops in policies: key = [] for op in ops: key.append(op[0]) key = '_'.join(key) if key in s: continue else: s.add(key) new_policies.append(ops) return new_policies def fa_reduced_cifar10(): p = [[["Contrast", 0.8320659688593578, 0.49884310562180767], ["TranslateX", 0.41849883971249136, 0.394023086494538]], [["Color", 0.3500483749890918, 0.43355143929883955], ["Color", 0.5120716140300229, 0.7508299643325016]], [["Rotate", 0.9447932604389472, 0.29723465088990375], ["Sharpness", 0.1564936149799504, 0.47169309978091745]], [["Rotate", 0.5430015349185097, 0.6518626678905443], ["Color", 0.5694844928020679, 0.3494533005430269]], [["AutoContrast", 0.5558922032451064, 0.783136004977799], ["TranslateY", 0.683914191471972, 0.7597025305860181]], [["TranslateX", 0.03489224481658926, 0.021025488042663354], ["Equalize", 0.4788637403857401, 0.3535481281496117]], [["Sharpness", 0.6428916269794158, 0.22791511918580576], ["Contrast", 0.016014045073950323, 0.26811312269487575]], [["Rotate", 0.2972727228410451, 0.7654251516829896], ["AutoContrast", 0.16005809254943348, 0.5380523650108116]], [["Contrast", 0.5823671057717301, 0.7521166301398389], ["TranslateY", 0.9949449214751978, 0.9612671341689751]], [["Equalize", 0.8372126687702321, 0.6944127225621206], ["Rotate", 0.25393282929784755, 0.3261658365286546]], [["Invert", 0.8222011603194572, 0.6597915864008403], ["Posterize", 0.31858707654447327, 0.9541013715579584]], [["Sharpness", 0.41314621282107045, 0.9437344470879956], ["Cutout", 0.6610495837889337, 0.674411664255093]], [["Contrast", 0.780121736705407, 0.40826152397463156], ["Color", 0.344019192125256, 0.1942922781355767]], [["Rotate", 0.17153139555621344, 0.798745732456474], ["Invert", 0.6010555860501262, 0.320742172554767]], [["Invert", 0.26816063450777416, 0.27152062163148327], ["Equalize", 0.6786829200236982, 0.7469412443514213]], [["Contrast", 0.3920564414367518, 0.7493644582838497], ["TranslateY", 0.8941657805606704, 0.6580846856375955]], [["Equalize", 0.875509207399372, 0.9061130537645283], ["Cutout", 0.4940280679087308, 0.7896229623628276]], [["Contrast", 0.3331423298065147, 0.7170041362529597], ["ShearX", 0.7425484291842793, 0.5285117152426109]], [["Equalize", 0.97344237365026, 0.4745759720473106], ["TranslateY", 0.055863458430295276, 0.9625142022954672]], [["TranslateX", 0.6810614083109192, 0.7509937355495521], ["TranslateY", 0.3866463019475701, 0.5185481505576112]], [["Sharpness", 0.4751529944753671, 0.550464012488733], ["Cutout", 0.9472914750534814, 0.5584925992985023]], [["Contrast", 0.054606784909375095, 0.17257080196712182], ["Cutout", 0.6077026782754803, 0.7996504165944938]], [["ShearX", 0.328798428243695, 0.2769563264079157], ["Cutout", 0.9037632437023772, 0.4915809476763595]], [["Cutout", 0.6891202672363478, 0.9951490996172914], ["Posterize", 0.06532762462628705, 0.4005246609075227]], [["TranslateY", 0.6908583592523334, 0.725612120376128], ["Rotate", 0.39907735501746666, 0.36505798032223147]], [["TranslateX", 0.10398364107399072, 0.5913918470536627], ["Rotate", 0.7169811539340365, 0.8283850670648724]], [["ShearY", 0.9526373530768361, 0.4482347365639251], ["Contrast", 0.4203947336351471, 0.41526799558953864]], [["Contrast", 0.24894431199700073, 0.09578870500994707], ["Solarize", 0.2273713345927395, 0.6214942914963707]], [["TranslateX", 0.06331228870032912, 0.8961907489444944], ["Cutout", 0.5110007859958743, 0.23704875994050723]], [["Cutout", 0.3769183548846172, 0.6560944580253987], ["TranslateY", 0.7201924599434143, 0.4132476526938319]], [["Invert", 0.6707431156338866, 0.11622795952464149], ["Posterize", 0.12075972752370845, 0.18024933294172307]], [["Color", 0.5010057264087142, 0.5277767327434318], ["Rotate", 0.9486115946366559, 0.31485546630220784]], [["ShearX", 0.31741302466630406, 0.1991215806270692], ["Invert", 0.3744727015523084, 0.6914113986757578]], [["Brightness", 0.40348479064392617, 0.8924182735724888], ["Brightness", 0.1973098763857779, 0.3939288933689655]], [["Color", 0.01208688664030888, 0.6055693000885217], ["Equalize", 0.433259451147881, 0.420711137966155]], [["Cutout", 0.2620018360076487, 0.11594468278143644], ["Rotate", 0.1310401567856766, 0.7244318146544101]], [["ShearX", 0.15249651845933576, 0.35277277071866986], ["Contrast", 0.28221794032094016, 0.42036586509397444]], [["Brightness", 0.8492912150468908, 0.26386920887886056], ["Solarize", 0.8764208056263386, 0.1258195122766067]], [["ShearX", 0.8537058239675831, 0.8415101816171269], ["AutoContrast", 0.23958568830416294, 0.9889049529564014]], [["Rotate", 0.6463207930684552, 0.8750192129056532], ["Contrast", 0.6865032211768652, 0.8564981333033417]], [["Equalize", 0.8877190311811044, 0.7370995897848609], ["TranslateX", 0.9979660314391368, 0.005683998913244781]], [["Color", 0.6420017551677819, 0.6225337265571229], ["Solarize", 0.8344504978566362, 0.8332856969941151]], [["ShearX", 0.7439332981992567, 0.9747608698582039], ["Equalize", 0.6259189804002959, 0.028017478098245174]], [["TranslateY", 0.39794770293366843, 0.8482966537902709], ["Rotate", 0.9312935630405351, 0.5300586925826072]], [["Cutout", 0.8904075572021911, 0.3522934742068766], ["Equalize", 0.6431186289473937, 0.9930577962126151]], [["Contrast", 0.9183553386089476, 0.44974266209396685], ["TranslateY", 0.8193684583123862, 0.9633741156526566]], [["ShearY", 0.616078299924283, 0.19219314358924766], ["Solarize", 0.1480945914138868, 0.05922109541654652]], [["Solarize", 0.25332455064128157, 0.18853037431947994], ["ShearY", 0.9518390093954243, 0.14603930044061142]], [["Color", 0.8094378664335412, 0.37029830225408433], ["Contrast", 0.29504113617467465, 0.065096365468442]], [["AutoContrast", 0.7075167558685455, 0.7084621693458267], ["Sharpness", 0.03555539453323875, 0.5651948313888351]], [["TranslateY", 0.5969982600930229, 0.9857264201029572], ["Rotate", 0.9898628564873607, 0.1985685534926911]], [["Invert", 0.14915939942810352, 0.6595839632446547], ["Posterize", 0.768535289994361, 0.5997358684618563]], [["Equalize", 0.9162691815967111, 0.3331035307653627], ["Color", 0.8169118187605557, 0.7653910258006366]], [["Rotate", 0.43489185299530897, 0.752215269135173], ["Brightness", 0.1569828560334806, 0.8002808712857853]], [["Invert", 0.931876215328345, 0.029428644395760872], ["Equalize", 0.6330036052674145, 0.7235531014288485]], [["ShearX", 0.5216138393704968, 0.849272958911589], ["AutoContrast", 0.19572688655120263, 0.9786551568639575]], [["ShearX", 0.9899586208275011, 0.22580547500610293], ["Brightness", 0.9831311903178727, 0.5055159610855606]], [["Brightness", 0.29179117009211486, 0.48003584672937294], ["Solarize", 0.7544252317330058, 0.05806581735063043]], [["AutoContrast", 0.8919800329537786, 0.8511261613698553], ["Contrast", 0.49199446084551035, 0.7302297140181429]], [["Cutout", 0.7079723710644835, 0.032565015538375874], ["AutoContrast", 0.8259782090388609, 0.7860708789468442]], [["Posterize", 0.9980262659801914, 0.6725084224935673], ["ShearY", 0.6195568269664682, 0.5444170291816751]], [["Posterize", 0.8687351834713217, 0.9978004914422602], ["Equalize", 0.4532646848325955, 0.6486748015710573]], [["Contrast", 0.2713928776950594, 0.15255249557027806], ["ShearY", 0.9276834387970199, 0.5266542862333478]], [["AutoContrast", 0.5240786618055582, 0.9325642258930253], ["Cutout", 0.38448627892037357, 0.21219415055662394]], [["TranslateX", 0.4299517937295352, 0.20133751201386152], ["TranslateX", 0.6753468310276597, 0.6985621035400441]], [["Rotate", 0.4006472499103597, 0.6704748473357586], ["Equalize", 0.674161668148079, 0.6528530101705237]], [["Equalize", 0.9139902833674455, 0.9015103149680278], ["Sharpness", 0.7289667720691948, 0.7623606352376232]], [["Cutout", 0.5911267429414259, 0.5953141187177585], ["Rotate", 0.5219064817468504, 0.11085141355857986]], [["TranslateX", 0.3620095133946267, 0.26194039409492476], ["Rotate", 0.3929841359545597, 0.4913406720338047]], [["Invert", 0.5175298901458896, 0.001661410821811482], ["Invert", 0.004656581318332242, 0.8157622192213624]], [["AutoContrast", 0.013609693335051465, 0.9318651749409604], ["Invert", 0.8980844358979592, 0.2268511862780368]], [["ShearY", 0.7717126261142194, 0.09975547983707711], ["Equalize", 0.7808494401429572, 0.4141412091009955]], [["TranslateX", 0.5878675721341552, 0.29813268038163376], ["Posterize", 0.21257276051591356, 0.2837285296666412]], [["Brightness", 0.4268335108566488, 0.4723784991635417], ["Cutout", 0.9386262901570471, 0.6597686851494288]], [["ShearX", 0.8259423807590159, 0.6215304795389204], ["Invert", 0.6663365779667443, 0.7729669184580387]], [["ShearY", 0.4801338723951297, 0.5220145420100984], ["Solarize", 0.9165803796596582, 0.04299335502862134]], [["Color", 0.17621114853558817, 0.7092601754635434], ["ShearX", 0.9014406936728542, 0.6028711944367818]], [["Rotate", 0.13073284972300658, 0.9088831512880851], ["ShearX", 0.4228105332316806, 0.7985249783662675]], [["Brightness", 0.9182753692730031, 0.0063635477774044436], ["Color", 0.4279825602663798, 0.28727149118585327]], [["Equalize", 0.578218285372267, 0.9611758542158054], ["Contrast", 0.5471552264150691, 0.8819635504027596]], [["Brightness", 0.3208589067274543, 0.45324733565167497], ["Solarize", 0.5218455808633233, 0.5946097503647126]], [["Equalize", 0.3790381278653, 0.8796082535775276], ["Solarize", 0.4875526773149246, 0.5186585878052613]], [["ShearY", 0.12026461479557571, 0.1336953429068397], ["Posterize", 0.34373988646025766, 0.8557727670803785]], [["Cutout", 0.2396745247507467, 0.8123036135209865], ["Equalize", 0.05022807681008945, 0.6648492261984383]], [["Brightness", 0.35226676470748264, 0.5950011514888855], ["Rotate", 0.27555076067000894, 0.9170063321486026]], [["ShearX", 0.320224630647278, 0.9683584649071976], ["Invert", 0.6905585196648905, 0.5929115667894518]], [["Color", 0.9941395717559652, 0.7474441679798101], ["Sharpness", 0.7559998478658021, 0.6656052889626682]], [["ShearY", 0.4004220568345669, 0.5737646992826074], ["Equalize", 0.9983495213746147, 0.8307907033362303]], [["Color", 0.13726809242038207, 0.9378850119950549], ["Equalize", 0.9853362454752445, 0.42670264496554156]], [["Invert", 0.13514636153298576, 0.13516363849081958], ["Sharpness", 0.2031189356693901, 0.6110226359872745]], [["TranslateX", 0.7360305209630797, 0.41849698571655614], ["Contrast", 0.8972161549144564, 0.7820296625565641]], [["Color", 0.02713118828682548, 0.717110684828096], ["TranslateY", 0.8118759006836348, 0.9120098002024992]], [["Sharpness", 0.2915428949403711, 0.7630303724396518], ["Solarize", 0.22030536162851078, 0.38654526772661757]], [["Equalize", 0.9949114839538582, 0.7193630656062793], ["AutoContrast", 0.00889496657931299, 0.2291400476524672]], [["Rotate", 0.7120948976490488, 0.7804359309791055], ["Cutout", 0.10445418104923654, 0.8022999156052766]], [["Equalize", 0.7941710117902707, 0.8648170634288153], ["Invert", 0.9235642581144047, 0.23810725859722381]], [["Cutout", 0.3669397998623156, 0.42612815083245004], ["Solarize", 0.5896322046441561, 0.40525016166956795]], [["Color", 0.8389858785714184, 0.4805764176488667], ["Rotate", 0.7483931487048825, 0.4731174601400677]], [["Sharpness", 0.19006538611394763, 0.9480745790240234], ["TranslateY", 0.13904429049439282, 0.04117685330615939]], [["TranslateY", 0.9958097661701637, 0.34853788612580905], ["Cutout", 0.2235829624082113, 0.3737887095480745]], [["ShearX", 0.635453761342424, 0.6063917273421382], ["Posterize", 0.8738297843709666, 0.4893042590265556]], [["Brightness", 0.7907245198402727, 0.7082189713070691], ["Color", 0.030313003541849737, 0.6927897798493439]], [["Cutout", 0.6965622481073525, 0.8103522907758203], ["ShearY", 0.6186794303078708, 0.28640671575703547]], [["ShearY", 0.43734910588450226, 0.32549342535621517], ["ShearX", 0.08154980987651872, 0.3286764923112455]], [["AutoContrast", 0.5262462005050853, 0.8175584582465848], ["Contrast", 0.8683217097363655, 0.548776281479276]], [["ShearY", 0.03957878500311707, 0.5102350637943197], ["Rotate", 0.13794708520303778, 0.38035687712954236]], [["Sharpness", 0.634288567312677, 0.6387948309075822], ["AutoContrast", 0.13437288694693272, 0.7150448869023095]], [["Contrast", 0.5198339640088544, 0.9409429390321714], ["Cutout", 0.09489154903321972, 0.6228488803821982]], [["Equalize", 0.8955909061806043, 0.7727336527163008], ["AutoContrast", 0.6459479564441762, 0.7065467781139214]], [["Invert", 0.07214420843537739, 0.15334721382249505], ["ShearX", 0.9242027778363903, 0.5809187849982554]], [["Equalize", 0.9144084379856188, 0.9457539278608998], ["Sharpness", 0.14337499858300173, 0.5978054365425495]], [["Posterize", 0.18894269796951202, 0.14676331276539045], ["Equalize", 0.846204299950047, 0.0720601838168885]], [["Contrast", 0.47354445405741163, 0.1793650330107468], ["Solarize", 0.9086106327264657, 0.7578807802091502]], [["AutoContrast", 0.11805466892967886, 0.6773620948318575], ["TranslateX", 0.584222568299264, 0.9475693349391936]], [["Brightness", 0.5833017701352768, 0.6892593824176294], ["AutoContrast", 0.9073141314561828, 0.5823085733964589]], [["TranslateY", 0.5711231614144834, 0.6436240447620021], ["Contrast", 0.21466964050052473, 0.8042843954486391]], [["Contrast", 0.22967904487976765, 0.2343103109298762], ["Invert", 0.5502897289159286, 0.386181060792375]], [["Invert", 0.7008423439928628, 0.4234003051405053], ["Rotate", 0.77270460187611, 0.6650852696828039]], [["Invert", 0.050618322309703534, 0.24277027926683614], ["TranslateX", 0.789703489736613, 0.5116446685339312]], [["Color", 0.363898083076868, 0.7870323584210503], ["ShearY", 0.009608425513626617, 0.6188625018465327]], [["TranslateY", 0.9447601615216088, 0.8605867115798349], ["Equalize", 0.24139180127003634, 0.9587337957930782]], [["Equalize", 0.3968589440144503, 0.626206375426996], ["Solarize", 0.3215967960673186, 0.826785464835443]], [["TranslateX", 0.06947339047121326, 0.016705969558222122], ["Contrast", 0.6203392406528407, 0.6433525559906872]], [["Solarize", 0.2479835265518212, 0.6335009955617831], ["Sharpness", 0.6260191862978083, 0.18998095149428562]], [["Invert", 0.9818841924943431, 0.03252098144087934], ["TranslateY", 0.9740718042586802, 0.32038951753031475]], [["Solarize", 0.8795784664090814, 0.7014953994354041], ["AutoContrast", 0.8508018319577783, 0.09321935255338443]], [["Color", 0.8067046326105318, 0.13732893832354054], ["Contrast", 0.7358549680271418, 0.7880588355974301]], [["Posterize", 0.5005885536838065, 0.7152229305267599], ["ShearX", 0.6714249591308944, 0.7732232697859908]], [["TranslateY", 0.5657943483353953, 0.04622399873706862], ["AutoContrast", 0.2787442688649845, 0.567024378767143]], [["ShearY", 0.7589839214283295, 0.041071003934029404], ["Equalize", 0.3719852873722692, 0.43285778682687326]], [["Posterize", 0.8841266183653291, 0.42441306955476366], ["Cutout", 0.06578801759412933, 0.5961125797961526]], [["Rotate", 0.4057875004314082, 0.20241115848366442], ["AutoContrast", 0.19331542807918067, 0.7175484678480565]], [["Contrast", 0.20331327116693088, 0.17135387852218742], ["Cutout", 0.6282459410351067, 0.6690015305529187]], [["ShearX", 0.4309850328306535, 0.99321178125828], ["AutoContrast", 0.01809604030453338, 0.693838277506365]], [["Rotate", 0.24343531125298268, 0.5326412444169899], ["Sharpness", 0.8663989992597494, 0.7643990609130789]], [["Rotate", 0.9785019204622459, 0.8941922576710696], ["ShearY", 0.3823185048761075, 0.9258854046017292]], [["ShearY", 0.5502613342963388, 0.6193478797355644], ["Sharpness", 0.2212116534610532, 0.6648232390110979]], [["TranslateY", 0.43222920981513757, 0.5657636397633089], ["ShearY", 0.9153733286073634, 0.4868521171273169]], [["Posterize", 0.12246560519738336, 0.9132288825898972], ["Cutout", 0.6058471327881816, 0.6426901876150983]], [["Color", 0.3693970222695844, 0.038929141432555436], ["Equalize", 0.6228052875653781, 0.05064436511347281]], [["Color", 0.7172600331356893, 0.2824542634766688], ["Color", 0.425293116261649, 0.1796441283313972]], [["Cutout", 0.7539608428122959, 0.9896141728228921], ["Solarize", 0.17811081117364758, 0.9064195503634402]], [["AutoContrast", 0.6761242607012717, 0.6484842446399923], ["AutoContrast", 0.1978135076901828, 0.42166879492601317]], [["ShearY", 0.25901666379802524, 0.4770778270322449], ["Solarize", 0.7640963173407052, 0.7548463227094349]], [["TranslateY", 0.9222487731783499, 0.33658389819616463], ["Equalize", 0.9159112511468139, 0.8877136302394797]], [["TranslateX", 0.8994836977137054, 0.11036053676846591], ["Sharpness", 0.9040333410652747, 0.007266095214664592]], [["Invert", 0.627758632524958, 0.8075245097227242], ["Color", 0.7525387912148516, 0.05950239294733184]], [["TranslateX", 0.43505193292761857, 0.38108822876120796], ["TranslateY", 0.7432578052364004, 0.685678116134759]], [["Contrast", 0.9293507582470425, 0.052266842951356196], ["Posterize", 0.45187123977747456, 0.8228290399726782]], [["ShearX", 0.07240786542746291, 0.8945667925365756], ["Brightness", 0.5305443506561034, 0.12025274552427578]], [["Invert", 0.40157564448143335, 0.5364745514006678], ["Posterize", 0.3316124671813876, 0.43002413237035997]], [["ShearY", 0.7152314630009072, 0.1938339083417453], ["Invert", 0.14102478508140615, 0.41047623580174253]], [["Equalize", 0.19862832613849246, 0.5058521685279254], ["Sharpness", 0.16481208629549782, 0.29126323102770557]], [["Equalize", 0.6951591703541872, 0.7294822018800076], ["ShearX", 0.8726656726111219, 0.3151484225786487]], [["Rotate", 0.17234370554263745, 0.9356543193000078], ["TranslateX", 0.4954374070084091, 0.05496727345849217]], [["Contrast", 0.347405480122842, 0.831553005022885], ["ShearX", 0.28946367213071134, 0.11905898704394013]], [["Rotate", 0.28096672507990683, 0.16181284050307398], ["Color", 0.6554918515385365, 0.8739728050797386]], [["Solarize", 0.05408073374114053, 0.5357087283758337], ["Posterize", 0.42457175211495335, 0.051807130609045515]], [["TranslateY", 0.6216669362331361, 0.9691341207381867], ["Rotate", 0.9833579358130944, 0.12227426932415297]], [["AutoContrast", 0.7572619475282892, 0.8062834082727393], ["Contrast", 0.1447865402875591, 0.40242646573228436]], [["Rotate", 0.7035658783466086, 0.9840285268256428], ["Contrast", 0.04613961510519471, 0.7666683217450163]], [["TranslateX", 0.4580462177951252, 0.6448678609474686], ["AutoContrast", 0.14845695613708987, 0.1581134188537895]], [["Color", 0.06795037145259564, 0.9115552821158709], ["TranslateY", 0.9972953449677655, 0.6791016521791214]], [["Cutout", 0.3586908443690823, 0.11578558293480945], ["Color", 0.49083981719164294, 0.6924851425917189]], [["Brightness", 0.7994717831637873, 0.7887316255321768], ["Posterize", 0.01280463502435425, 0.2799086732858721]], [["ShearY", 0.6733451536131859, 0.8122332639516706], ["AutoContrast", 0.20433889615637357, 0.29023346867819966]], [["TranslateY", 0.709913512385177, 0.6538196931503809], ["Invert", 0.06629795606579203, 0.40913219547548296]], [["Sharpness", 0.4704559834362948, 0.4235993305308414], ["Equalize", 0.7578132044306966, 0.9388824249397175]], [["AutoContrast", 0.5281702802395268, 0.8077253610116979], ["Equalize", 0.856446858814119, 0.0479755681647559]], [["Color", 0.8244145826797791, 0.038409264586238945], ["Equalize", 0.4933123249234237, 0.8251940933672189]], [["TranslateX", 0.23949314158035084, 0.13576027004706692], ["ShearX", 0.8547563771688399, 0.8309262160483606]], [["Cutout", 0.4655680937486001, 0.2819807000622825], ["Contrast", 0.8439552665937905, 0.4843617871587037]], [["TranslateX", 0.19142454476784831, 0.7516148119169537], ["AutoContrast", 0.8677128351329768, 0.34967990912346336]], [["Contrast", 0.2997868299880966, 0.919508054854469], ["AutoContrast", 0.3003418493384957, 0.812314984368542]], [["Invert", 0.1070424236198183, 0.614674386498809], ["TranslateX", 0.5010973510899923, 0.20828478805259465]], [["Contrast", 0.6775882415611454, 0.6938564815591685], ["Cutout", 0.4814634264207498, 0.3086844939744179]], [["TranslateY", 0.939427105020265, 0.02531043619423201], ["Contrast", 0.793754257944812, 0.6676072472565451]], [["Sharpness", 0.09833672397575444, 0.5937214638292085], ["Rotate", 0.32530675291753763, 0.08302275740932441]], [["Sharpness", 0.3096455511562728, 0.6726732004553959], ["TranslateY", 0.43268997648796537, 0.8755012330217743]], [["ShearY", 0.9290771880324833, 0.22114736271319912], ["Equalize", 0.5520199288501478, 0.34269650332060553]], [["AutoContrast", 0.39763980746649374, 0.4597414582725454], ["Contrast", 0.941507852412761, 0.24991270562477041]], [["Contrast", 0.19419400547588095, 0.9127524785329233], ["Invert", 0.40544905179551727, 0.770081532844878]], [["Invert", 0.30473757368608334, 0.23534811781828846], ["Cutout", 0.26090722356706686, 0.5478390909877727]], [["Posterize", 0.49434361308057373, 0.05018423270527428], ["Color", 0.3041910676883317, 0.2603810415446437]], [["Invert", 0.5149061746764011, 0.9507449210221298], ["TranslateY", 0.4458076521892904, 0.8235358255774426]], [["Cutout", 0.7900006753351625, 0.905578861382507], ["Cutout", 0.6707153655762056, 0.8236715672258502]], [["Solarize", 0.8750534386579575, 0.10337670467100568], ["Posterize", 0.6102379615481381, 0.9264503915416868]], [["ShearY", 0.08448689377082852, 0.13981233725811626], ["TranslateX", 0.13979689669329498, 0.768774869872818]], [["TranslateY", 0.35752572266759985, 0.22827299847812488], ["Solarize", 0.3906957174236011, 0.5663314388307709]], [["ShearY", 0.29155240367061563, 0.8427516352971683], ["ShearX", 0.988825367441916, 0.9371258864857649]], [["Posterize", 0.3470780859769458, 0.5467686612321239], ["Rotate", 0.5758606274160093, 0.8843838082656007]], [["Cutout", 0.07825368363221841, 0.3230799425855425], ["Equalize", 0.2319163865298529, 0.42133965674727325]], [["Invert", 0.41972172597448654, 0.34618622513582953], ["ShearX", 0.33638469398198834, 0.9098575535928108]], [["Invert", 0.7322652233340448, 0.7747502957687412], ["Cutout", 0.9643121397298106, 0.7983335094634907]], [["TranslateY", 0.30039942808098496, 0.229018798182827], ["TranslateY", 0.27009499739380194, 0.6435577237846236]], [["Color", 0.38245274994070644, 0.7030758568461645], ["ShearX", 0.4429321461666281, 0.6963787864044149]], [["AutoContrast", 0.8432798685515605, 0.5775214369578088], ["Brightness", 0.7140899735355927, 0.8545854720117658]], [["Rotate", 0.14418935535613786, 0.5637968282213426], ["Color", 0.7115231912479835, 0.32584796564566776]], [["Sharpness", 0.4023501062807533, 0.4162097130412771], ["Brightness", 0.5536372686153666, 0.03004023273348777]], [["TranslateX", 0.7526053265574295, 0.5365938133399961], ["Cutout", 0.07914142706557492, 0.7544953091603148]], [["TranslateY", 0.6932934644882822, 0.5302211727137424], ["Invert", 0.5040606028391255, 0.6074863635108957]], [["Sharpness", 0.5013938602431629, 0.9572417724333157], ["TranslateY", 0.9160516359783026, 0.41798927975391675]], [["ShearY", 0.5130018836722556, 0.30209438428424185], ["Color", 0.15017170588500262, 0.20653495360587826]], [["TranslateX", 0.5293300090022314, 0.6407011888285266], ["Rotate", 0.4809817860439001, 0.3537850070371702]], [["Equalize", 0.42243081336551014, 0.13472721311046565], ["Posterize", 0.4700309639484068, 0.5197704360874883]], [["AutoContrast", 0.40674959899687235, 0.7312824868168921], ["TranslateX", 0.7397527975920833, 0.7068339877944815]], [["TranslateY", 0.5880995184787206, 0.41294111378078946], ["ShearX", 0.3181387627799316, 0.4810010147143413]], [["Color", 0.9898680233928507, 0.13241525577655167], ["Contrast", 0.9824932511238534, 0.5081145010853807]], [["Invert", 0.1591854062582687, 0.9760371953250404], ["Color", 0.9913399302056851, 0.8388709501056177]], [["Rotate", 0.6427451962231163, 0.9486793975292853], ["AutoContrast", 0.8501937877930463, 0.021326757974406196]], [["Contrast", 0.13611684531087598, 0.3050858709483848], ["Posterize", 0.06618644756084646, 0.8776928511951034]], [["TranslateX", 0.41021065663839407, 0.4965319749091702], ["Rotate", 0.07088831484595115, 0.4435516708223345]], [["Sharpness", 0.3151707977154323, 0.28275482520179296], ["Invert", 0.36980384682133804, 0.20813616084536624]], [["Cutout", 0.9979060206661017, 0.39712948644725854], ["Brightness", 0.42451052896163466, 0.942623075649937]], [["Equalize", 0.5300853308425644, 0.010183500830128867], ["AutoContrast", 0.06930788523716991, 0.5403125318991522]], [["Contrast", 0.010385458959237814, 0.2588311035539086], ["ShearY", 0.9347048553928764, 0.10439028366854963]], [["ShearY", 0.9867649486508592, 0.8409258132716434], ["ShearX", 0.48031199530836444, 0.7703375364614137]], [["ShearY", 0.04835889473136512, 0.2671081675890492], ["Brightness", 0.7856432618509617, 0.8032169570159564]], [["Posterize", 0.11112884927351185, 0.7116956530752987], ["TranslateY", 0.7339151092128607, 0.3331241226029017]], [["Invert", 0.13527036207875454, 0.8425980515358883], ["Color", 0.7836395778298139, 0.5517059252678862]], [["Sharpness", 0.012541163521491816, 0.013197550692292892], ["Invert", 0.6295957932861318, 0.43276521236056054]], [["AutoContrast", 0.7681480991225756, 0.3634284648496289], ["Brightness", 0.09708289828517969, 0.45016725043529726]], [["Brightness", 0.5839450499487329, 0.47525965678316795], ["Posterize", 0.43096581990183735, 0.9332382960125196]], [["Contrast", 0.9725334964552795, 0.9142902966863341], ["Contrast", 0.12376116410622995, 0.4355916974126801]], [["TranslateX", 0.8572708473690132, 0.02544522678265526], ["Sharpness", 0.37902120723460364, 0.9606092969833118]], [["TranslateY", 0.8907359001296927, 0.8011363927236099], ["Color", 0.7693777154407178, 0.0936768686746503]], [["Equalize", 0.0002657688243309364, 0.08190798535970034], ["Rotate", 0.5215478065240905, 0.5773519995038368]], [["TranslateY", 0.3383007813932477, 0.5733428274739165], ["Sharpness", 0.2436110797174722, 0.4757790814590501]], [["Cutout", 0.0957402176213592, 0.8914395928996034], ["Cutout", 0.4959915628586883, 0.25890349461645246]], [["AutoContrast", 0.594787300189186, 0.9627455357634459], ["ShearY", 0.5136027621132064, 0.10419602450259002]], [["Solarize", 0.4684077211553732, 0.6592850629431414], ["Sharpness", 0.2382385935956325, 0.6589291408243176]], [["Cutout", 0.4478786947325877, 0.6893616643143388], ["TranslateX", 0.2761781720270474, 0.21750622627277727]], [["Sharpness", 0.39476077929016484, 0.930902796668923], ["Cutout", 0.9073012208742808, 0.9881122386614257]], [["TranslateY", 0.0933719180021565, 0.7206252503441172], ["ShearX", 0.5151400441789256, 0.6307540083648309]], [["AutoContrast", 0.7772689258806401, 0.8159317013156503], ["AutoContrast", 0.5932793713915097, 0.05262217353927168]], [["Equalize", 0.38017352056118914, 0.8084724050448412], ["ShearY", 0.7239725628380852, 0.4246314890359326]], [["Cutout", 0.741157483503503, 0.13244380646497977], ["Invert", 0.03395378056675935, 0.7140036618098844]], [["Rotate", 0.0662727247460636, 0.7099861732415447], ["Rotate", 0.3168532707508249, 0.3553167425022127]], [["AutoContrast", 0.7429303516734129, 0.07117444599776435], ["Posterize", 0.5379537435918104, 0.807221330263993]], [["TranslateY", 0.9788586874795164, 0.7967243851346594], ["Invert", 0.4479103376922362, 0.04260360776727545]], [["Cutout", 0.28318121763188997, 0.7748680701406292], ["AutoContrast", 0.9109258369403016, 0.17126397858002085]], [["Color", 0.30183727885272027, 0.46718354750112456], ["TranslateX", 0.9628952256033627, 0.10269543754135535]], [["AutoContrast", 0.6316709389784041, 0.84287698792044], ["Brightness", 0.5544761629904337, 0.025264772745200004]], [["Rotate", 0.08803313299532567, 0.306059720523696], ["Invert", 0.5222165872425064, 0.045935208620454304]], [["TranslateY", 0.21912346831923835, 0.48529224559004436], ["TranslateY", 0.15466734731903942, 0.8929485418495068]], [["ShearX", 0.17141022847016563, 0.8607600402165531], ["ShearX", 0.6890511341106859, 0.7540899265679949]], [["Invert", 0.9417455522972059, 0.9021733684991224], ["Solarize", 0.7693107057723746, 0.7268007946568782]], [["Posterize", 0.02376991543373752, 0.6768442864453844], ["Rotate", 0.7736875065112697, 0.6706331753139825]], [["Contrast", 0.3623841610390669, 0.15023657344457686], ["Equalize", 0.32975472189318666, 0.05629246869510651]], [["Sharpness", 0.7874882420165824, 0.49535778020457066], ["Posterize", 0.09485578893387558, 0.6170768580482466]], [["Brightness", 0.7099280202949585, 0.021523012961427335], ["Posterize", 0.2076371467666719, 0.17168118578815206]], [["Color", 0.8546367645761538, 0.832011891505731], ["Equalize", 0.6429734783051777, 0.2618995960561532]], [["Rotate", 0.8780793721476224, 0.5920897827664297], ["ShearX", 0.5338303685064825, 0.8605424531336439]], [["Sharpness", 0.7504493806631884, 0.9723552387375258], ["Sharpness", 0.3206385634203266, 0.45127845905824693]], [["ShearX", 0.23794709526711355, 0.06257530645720066], ["Solarize", 0.9132374030587093, 0.6240819934824045]], [["Sharpness", 0.790583587969259, 0.28551171786655405], ["Contrast", 0.39872982844590554, 0.09644706751019538]], [["Equalize", 0.30681999237432944, 0.5645045018157916], ["Posterize", 0.525966242669736, 0.7360106111256014]], [["TranslateX", 0.4881014179825114, 0.6317220208872226], ["ShearX", 0.2935158995550958, 0.23104608987381758]], [["Rotate", 0.49977116738568395, 0.6610761068306319], ["TranslateY", 0.7396566602715687, 0.09386747830045217]], [["ShearY", 0.5909773790018789, 0.16229529902832718], ["Equalize", 0.06461394468918358, 0.6661349001143908]], [["TranslateX", 0.7218443721851834, 0.04435720302810153], ["Cutout", 0.986686540951642, 0.734771197038724]], [["ShearX", 0.5353800096911666, 0.8120139502148365], ["Equalize", 0.4613239578449774, 0.5159528929124512]], [["Color", 0.0871713897628631, 0.7708895183198486], ["Solarize", 0.5811386808912219, 0.35260648120785887]], [["Posterize", 0.3910857927477053, 0.4329219555775561], ["Color", 0.9115983668789468, 0.6043069944145293]], [["Posterize", 0.07493067637060635, 0.4258000066006725], ["AutoContrast", 0.4740957581389772, 0.49069587151651295]], [["Rotate", 0.34086200894268937, 0.9812149332288828], ["Solarize", 0.6801012471371733, 0.17271491146753837]], [["Color", 0.20542270872895207, 0.5532087457727624], ["Contrast", 0.2718692536563381, 0.20313287569510108]], [["Equalize", 0.05199827210980934, 0.0832859890912212], ["AutoContrast", 0.8092395764794107, 0.7778945136511004]], [["Sharpness", 0.1907689513066838, 0.7705754572256907], ["Color", 0.3911178658498049, 0.41791326933095485]], [["Solarize", 0.19611855804748257, 0.2407807485604081], ["AutoContrast", 0.5343964972940493, 0.9034209455548394]], [["Color", 0.43586520148538865, 0.4711164626521439], ["ShearY", 0.28635408186820555, 0.8417816793020271]], [["Cutout", 0.09818482420382535, 0.1649767430954796], ["Cutout", 0.34582392911178494, 0.3927982995799828]], [["ShearX", 0.001253882705272269, 0.48661629027584596], ["Solarize", 0.9229221435457137, 0.44374894836659073]], [["Contrast", 0.6829734655718668, 0.8201750485099037], ["Cutout", 0.7886756837648936, 0.8423285219631946]], [["TranslateY", 0.857017093561528, 0.3038537151773969], ["Invert", 0.12809228606383538, 0.23637166191748027]], [["Solarize", 0.9829027723424164, 0.9723093910674763], ["Color", 0.6346495302126811, 0.5405494753107188]], [["AutoContrast", 0.06868643520377715, 0.23758659417688077], ["AutoContrast", 0.6648225411500879, 0.5618315648260103]], [["Invert", 0.44202305603311676, 0.9945938909685547], ["Equalize", 0.7991650497684454, 0.16014142656347097]], [["AutoContrast", 0.8778631604769588, 0.03951977631894088], ["ShearY", 0.8495160088963707, 0.35771447321250416]], [["Color", 0.5365078341001592, 0.21102444169782308], ["ShearX", 0.7168869678248874, 0.3904298719872734]], [["TranslateX", 0.6517203786101899, 0.6467598990650437], ["Invert", 0.26552491504364517, 0.1210812827294625]], [["Posterize", 0.35196021684368994, 0.8420648319941891], ["Invert", 0.7796829363930631, 0.9520895999240896]], [["Sharpness", 0.7391572148971984, 0.4853940393452846], ["TranslateX", 0.7641915295592839, 0.6351349057666782]], [["Posterize", 0.18485880221115913, 0.6117603277356728], ["Rotate", 0.6541660490605724, 0.5704041108375348]], [["TranslateY", 0.27517423188070533, 0.6610080904072458], ["Contrast", 0.6091250547289317, 0.7702443247557892]], [["Equalize", 0.3611798581067118, 0.6623615672642768], ["TranslateX", 0.9537265090885917, 0.06352772509358584]], [["ShearX", 0.09720029389103535, 0.7800423126320308], ["Invert", 0.30314352455858884, 0.8519925470889914]], [["Brightness", 0.06931529763458055, 0.57760829499712], ["Cutout", 0.637251974467394, 0.7184346129191052]], [["AutoContrast", 0.5026722100286064, 0.32025257156541886], ["Contrast", 0.9667478703047919, 0.14178519432669368]], [["Equalize", 0.5924463845816984, 0.7187610262181517], ["TranslateY", 0.7059479079159405, 0.06551471830655187]], [["Sharpness", 0.18161164512332928, 0.7576138481173385], ["Brightness", 0.19191138767695282, 0.7865880269424701]], [["Brightness", 0.36780861866078696, 0.0677855546737901], ["AutoContrast", 0.8491446654142264, 0.09217782099938121]], [["TranslateY", 0.06011399855120858, 0.8374487034710264], ["TranslateY", 0.8373922962070498, 0.1991295720254297]], [["Posterize", 0.702559916122481, 0.30257509683007755], ["Rotate", 0.249899495398891, 0.9370437251176267]], [["ShearX", 0.9237874098232075, 0.26241907483351146], ["Brightness", 0.7221766836146657, 0.6880749752986671]], [["Cutout", 0.37994098189193104, 0.7836874473657957], ["ShearX", 0.9212861960976824, 0.8140948561570449]], [["Posterize", 0.2584098274786417, 0.7990847652004848], ["Invert", 0.6357731737590063, 0.1066304859116326]], [["Sharpness", 0.4412790857539922, 0.9692465283229825], ["Color", 0.9857401617339051, 0.26755393929808713]], [["Equalize", 0.22348671644912665, 0.7370019910830038], ["Posterize", 0.5396106339575417, 0.5559536849843303]], [["Equalize", 0.8742967663495852, 0.2797122599926307], ["Rotate", 0.4697322053105951, 0.8769872942579476]], [["Sharpness", 0.44279911640509206, 0.07729581896071613], ["Cutout", 0.3589177366154631, 0.2704031551235969]], [["TranslateX", 0.614216412574085, 0.47929659784170453], ["Brightness", 0.6686234118438007, 0.05700784068205689]], [["ShearY", 0.17920614630857634, 0.4699685075827862], ["Color", 0.38251870810870003, 0.7262706923005887]], [["Solarize", 0.4951799001144561, 0.212775278026479], ["TranslateX", 0.8666105646463097, 0.6750496637519537]], [["Color", 0.8110864170849051, 0.5154263861958484], ["Sharpness", 0.2489044083898776, 0.3763372541462343]], [["Cutout", 0.04888193613483871, 0.06041664638981603], ["Color", 0.06438587718683708, 0.5797881428892969]], [["Rotate", 0.032427448352152166, 0.4445797818376559], ["Posterize", 0.4459357828482998, 0.5879865187630777]], [["ShearX", 0.1617179557693058, 0.050796802246318884], ["Cutout", 0.8142465452060423, 0.3836391305618707]], [["TranslateY", 0.1806857249209416, 0.36697730355422675], ["Rotate", 0.9897576550818276, 0.7483432452225264]], [["Brightness", 0.18278016458098223, 0.952352527690299], ["Cutout", 0.3269735224453044, 0.3924869905012752]], [["ShearX", 0.870832707718742, 0.3214743207190739], ["Cutout", 0.6805560681792573, 0.6984188155282459]], [["TranslateX", 0.4157118388833776, 0.3964216288135384], ["TranslateX", 0.3253012682285006, 0.624835513104391]], [["Contrast", 0.7678168037628158, 0.31033802162621793], ["ShearX", 0.27022424855977134, 0.3773245605126201]], [["TranslateX", 0.37812621869017593, 0.7657993810740699], ["Rotate", 0.18081890120092914, 0.8893511219618171]], [["Posterize", 0.8735859716088367, 0.18243793043074286], ["TranslateX", 0.90435994250313, 0.24116383818819453]], [["Invert", 0.06666709253664793, 0.3881076083593933], ["TranslateX", 0.3783333964963522, 0.14411014979589543]], [["Equalize", 0.8741147867162096, 0.14203839235846816], ["TranslateX", 0.7801536758037405, 0.6952401607812743]], [["Cutout", 0.6095335117944475, 0.5679026063718094], ["Posterize", 0.06433868172233115, 0.07139559616012303]], [["TranslateY", 0.3020364047315408, 0.21459810361176246], ["Cutout", 0.7097677414888889, 0.2942144632587549]], [["Brightness", 0.8223662419048653, 0.195700694016108], ["Invert", 0.09345407040803999, 0.779843655582099]], [["TranslateY", 0.7353462929356228, 0.0468520680237382], ["Cutout", 0.36530918247940425, 0.3897292909049672]], [["Invert", 0.9676896451721213, 0.24473302189463453], ["Invert", 0.7369271521408992, 0.8193267003356975]], [["Sharpness", 0.8691871972054326, 0.4441713912682772], ["ShearY", 0.47385584832119887, 0.23521684584675429]], [["ShearY", 0.9266946026184021, 0.7611986713358834], ["TranslateX", 0.6195820760253926, 0.14661428669483678]], [["Sharpness", 0.08470870576026868, 0.3380219099907229], ["TranslateX", 0.3062343307496658, 0.7135777338095889]], [["Sharpness", 0.5246448204194909, 0.3193061215236702], ["ShearX", 0.8160637208508432, 0.9720697396582731]], [["Posterize", 0.5249259956549405, 0.3492042382504774], ["Invert", 0.8183138799547441, 0.11107271762524618]], [["TranslateY", 0.210869733350744, 0.7138905840721885], ["Sharpness", 0.7773226404450125, 0.8005353621959782]], [["Posterize", 0.33067522385556025, 0.32046239220630124], ["AutoContrast", 0.18918147708798405, 0.4646281070474484]], [["TranslateX", 0.929502026131094, 0.8029128121556285], ["Invert", 0.7319794306118105, 0.5421878712623392]], [["ShearX", 0.25645940834182723, 0.42754710760160963], ["ShearX", 0.44640695310173306, 0.8132185532296811]], [["Color", 0.018436846416536312, 0.8439313862001113], ["Sharpness", 0.3722867661453415, 0.5103570873163251]], [["TranslateX", 0.7285989086776543, 0.4809027697099264], ["TranslateY", 0.9740807004893643, 0.8241085438636939]], [["Posterize", 0.8721868989693397, 0.5700907310383815], ["Posterize", 0.4219074410577852, 0.8032643572845402]], [["Contrast", 0.9811380092558266, 0.8498397471632105], ["Sharpness", 0.8380884329421594, 0.18351306571903125]], [["TranslateY", 0.3878939366762001, 0.4699103438753077], ["Invert", 0.6055556353233807, 0.8774727658400134]], [["TranslateY", 0.052317005261018346, 0.39471450378745787], ["ShearX", 0.8612486845942395, 0.28834103278807466]], [["Color", 0.511993351208063, 0.07251427040525904], ["Solarize", 0.9898097047354855, 0.299761565689576]], [["Equalize", 0.2721248231619904, 0.6870975927455507], ["Cutout", 0.8787327242363994, 0.06228061428917098]], [["Invert", 0.8931880335225408, 0.49720931867378193], ["Posterize", 0.9619698792159256, 0.17859639696940088]], [["Posterize", 0.0061688075074411985, 0.08082938731035938], ["Brightness", 0.27745128028826993, 0.8638528796903816]], [["ShearY", 0.9140200609222026, 0.8240421430867707], ["Invert", 0.651734417415332, 0.08871906369930926]], [["Color", 0.45585010413511196, 0.44705070078574316], ["Color", 0.26394624901633146, 0.11242877788650807]], [["ShearY", 0.9200278466372522, 0.2995901331149652], ["Cutout", 0.8445407215116278, 0.7410524214287446]], [["ShearY", 0.9950483746990132, 0.112964468262847], ["ShearY", 0.4118332303218585, 0.44839613407553636]], [["Contrast", 0.7905821952255192, 0.23360046159385106], ["Posterize", 0.8611787233956044, 0.8984260048943528]], [["TranslateY", 0.21448061359312853, 0.8228112806838331], ["Contrast", 0.8992297266152983, 0.9179231590570998]], [["Invert", 0.3924194798946006, 0.31830516468371495], ["Rotate", 0.8399556845248508, 0.3764892022932781]], [["Cutout", 0.7037916990046816, 0.9214620769502728], ["AutoContrast", 0.02913794613018239, 0.07808607528954048]], [["ShearY", 0.6041490474263381, 0.6094184590800105], ["Equalize", 0.2932954517354919, 0.5840888946081727]], [["ShearX", 0.6056801676269449, 0.6948580442549543], ["Cutout", 0.3028001021044615, 0.15117101733894078]], [["Brightness", 0.8011486803860253, 0.18864079729374195], ["Solarize", 0.014965327213230961, 0.8842620292527029]], [["Invert", 0.902244007904273, 0.5634673798052033], ["Equalize", 0.13422913507398349, 0.4110956745883727]], [["TranslateY", 0.9981773319103838, 0.09568550987216096], ["Color", 0.7627662124105109, 0.8494409737419493]], [["Cutout", 0.3013527640416782, 0.03377226729898486], ["ShearX", 0.5727964831614619, 0.8784196638222834]], [["TranslateX", 0.6050722426803684, 0.3650103962378708], ["TranslateX", 0.8392084589130886, 0.6479816470292911]], [["Rotate", 0.5032806606500023, 0.09276980118866307], ["TranslateY", 0.7800234515261191, 0.18896454379343308]], [["Invert", 0.9266027256244017, 0.8246111062199752], ["Contrast", 0.12112023357797697, 0.33870762271759436]], [["Brightness", 0.8688784756993134, 0.17263759696106606], ["ShearX", 0.5133700431071326, 0.6686811994542494]], [["Invert", 0.8347840440941976, 0.03774897445901726], ["Brightness", 0.24925057499276548, 0.04293631677355758]], [["Color", 0.5998145279485104, 0.4820093200092529], ["TranslateY", 0.6709586184077769, 0.07377334081382858]], [["AutoContrast", 0.7898846202957984, 0.325293526672498], ["Contrast", 0.5156435596826767, 0.2889223168660645]], [["ShearX", 0.08147389674998307, 0.7978924681113669], ["Contrast", 0.7270003309106291, 0.009571215234092656]], [["Sharpness", 0.417607614440786, 0.9532566433338661], ["Posterize", 0.7186586546796782, 0.6936509907073302]], [["ShearX", 0.9555300215926675, 0.1399385550263872], ["Color", 0.9981041061848231, 0.5037462398323248]], [["Equalize", 0.8003487831375474, 0.5413759363796945], ["ShearY", 0.0026607045117773565, 0.019262273030984933]], [["TranslateY", 0.04845391502469176, 0.10063445212118283], ["Cutout", 0.8273170186786745, 0.5045257728554577]], [["TranslateX", 0.9690985344978033, 0.505202991815533], ["TranslateY", 0.7255326592928096, 0.02103609500701631]], [["Solarize", 0.4030771176836736, 0.8424237871457034], ["Cutout", 0.28705805963928965, 0.9601617893682582]], [["Sharpness", 0.16865290353070606, 0.6899673563468826], ["Posterize", 0.3985430034869616, 0.6540651997730774]], [["ShearY", 0.21395578485362032, 0.09519358818949009], ["Solarize", 0.6692821708524135, 0.6462523623552485]], [["AutoContrast", 0.912360598054091, 0.029800239085051583], ["Invert", 0.04319256403746308, 0.7712501517098587]], [["ShearY", 0.9081969961839055, 0.4581560239984739], ["AutoContrast", 0.5313894814729159, 0.5508393335751848]], [["ShearY", 0.860528568424097, 0.8196987216301588], ["Posterize", 0.41134650331494205, 0.3686632018978778]], [["AutoContrast", 0.8753670810078598, 0.3679438326304749], ["Invert", 0.010444228965415858, 0.9581244779208277]], [["Equalize", 0.07071836206680682, 0.7173594756186462], ["Brightness", 0.06111434312497388, 0.16175064669049277]], [["AutoContrast", 0.10522219073562122, 0.9768776621069855], ["TranslateY", 0.2744795945215529, 0.8577967957127298]], [["AutoContrast", 0.7628146493166175, 0.996157376418147], ["Contrast", 0.9255565598518469, 0.6826126662976868]], [["TranslateX", 0.017225816199011312, 0.2470332491402908], ["Solarize", 0.44048494909493807, 0.4492422515972162]], [["ShearY", 0.38885252627795064, 0.10272256704901939], ["Equalize", 0.686154959829183, 0.8973517148655337]], [["Rotate", 0.29628991573592967, 0.16639926575004715], ["ShearX", 0.9013782324726413, 0.0838318162771563]], [["Color", 0.04968391374688563, 0.6138600739645352], ["Invert", 0.11177127838716283, 0.10650198522261578]], [["Invert", 0.49655016367624016, 0.8603374164829688], ["ShearY", 0.40625439617553727, 0.4516437918820778]], [["TranslateX", 0.15015718916062992, 0.13867777502116208], ["Brightness", 0.3374464418810188, 0.7613355669536931]], [["Invert", 0.644644393321966, 0.19005804481199562], ["AutoContrast", 0.2293259789431853, 0.30335723256340186]], [["Solarize", 0.004968793254801596, 0.5370892072646645], ["Contrast", 0.9136902637865596, 0.9510587477779084]], [["Rotate", 0.38991518440867123, 0.24796987467455756], ["Sharpness", 0.9911180315669776, 0.5265657122981591]], [["Solarize", 0.3919646484436238, 0.6814994037194909], ["Sharpness", 0.4920838987787103, 0.023425724294012018]], [["TranslateX", 0.25107587874378867, 0.5414936560189212], ["Cutout", 0.7932919623814599, 0.9891303444820169]], [["Brightness", 0.07863012174272999, 0.045175652208389594], ["Solarize", 0.889609658064552, 0.8228793315963948]], [["Cutout", 0.20477096178169596, 0.6535063675027364], ["ShearX", 0.9216318577173639, 0.2908690977359947]], [["Contrast", 0.7035118947423187, 0.45982709058312454], ["Contrast", 0.7130268070749464, 0.8635123354235471]], [["Sharpness", 0.26319477541228997, 0.7451278726847078], ["Rotate", 0.8170499362173754, 0.13998593411788207]], [["Rotate", 0.8699365715164192, 0.8878057721750832], ["Equalize", 0.06682350555715044, 0.7164702080630689]], [["ShearY", 0.3137466057521987, 0.6747433496011368], ["Rotate", 0.42118828936218133, 0.980121180104441]], [["Solarize", 0.8470375049950615, 0.15287589264139223], ["Cutout", 0.14438435054693055, 0.24296463267973512]], [["TranslateY", 0.08822241792224905, 0.36163911974799356], ["TranslateY", 0.11729726813270003, 0.6230889726445291]], [["ShearX", 0.7720112337718541, 0.2773292905760122], ["Sharpness", 0.756290929398613, 0.27830353710507705]], [["Color", 0.33825031007968287, 0.4657590047522816], ["ShearY", 0.3566628994713067, 0.859750504071925]], [["TranslateY", 0.06830147433378053, 0.9348778582086664], ["TranslateX", 0.15509346516378553, 0.26320778885339435]], [["Posterize", 0.20266751150740858, 0.008351463842578233], ["Sharpness", 0.06506971109417259, 0.7294471760284555]], [["TranslateY", 0.6278911394418829, 0.8702181892620695], ["Invert", 0.9367073860264247, 0.9219230428944211]], [["Sharpness", 0.1553425337673321, 0.17601557714491345], ["Solarize", 0.7040449681338888, 0.08764313147327729]], [["Equalize", 0.6082233904624664, 0.4177428549911376], ["AutoContrast", 0.04987405274618151, 0.34516208204700916]], [["Brightness", 0.9616085936167699, 0.14561237331885468], ["Solarize", 0.8927707736296572, 0.31176907850205704]], [["Brightness", 0.6707778304730988, 0.9046457117525516], ["Brightness", 0.6801448953060988, 0.20015313057149042]], [["Color", 0.8292680845499386, 0.5181603879593888], ["Brightness", 0.08549161770369762, 0.6567870536463203]], [["ShearY", 0.267802208078051, 0.8388133819588173], ["Sharpness", 0.13453409120796123, 0.10028351311149486]], [["Posterize", 0.775796593610272, 0.05359034561289766], ["Cutout", 0.5067360625733027, 0.054451986840317934]], [["TranslateX", 0.5845238647690084, 0.7507147553486293], ["Brightness", 0.2642051786121197, 0.2578358927056452]], [["Cutout", 0.10787517610922692, 0.8147986902794228], ["Contrast", 0.2190149206329539, 0.902210615462459]], [["TranslateX", 0.5663614214181296, 0.05309965916414028], ["ShearX", 0.9682797885154938, 0.41791929533938466]], [["ShearX", 0.2345325577621098, 0.383780128037189], ["TranslateX", 0.7298083748149163, 0.644325797667087]], [["Posterize", 0.5138725709682734, 0.7901809917259563], ["AutoContrast", 0.7966018627776853, 0.14529337543427345]], [["Invert", 0.5973031989249785, 0.417399314592829], ["Solarize", 0.9147539948653116, 0.8221272315548086]], [["Posterize", 0.601596043336383, 0.18969646160963938], ["Color", 0.7527275484079655, 0.431793831326888]], [["Equalize", 0.6731483454430538, 0.7866786558207602], ["TranslateX", 0.97574396899191, 0.5970255778044692]], [["Cutout", 0.15919495850169718, 0.8916094305850562], ["Invert", 0.8351348834751027, 0.4029937360314928]], [["Invert", 0.5894085405226027, 0.7283806854157764], ["Brightness", 0.3973976860470554, 0.949681121498567]], [["AutoContrast", 0.3707914135327408, 0.21192068592079616], ["ShearX", 0.28040127351140676, 0.6754553511344856]], [["Solarize", 0.07955132378694896, 0.15073572961927306], ["ShearY", 0.5735850168851625, 0.27147326850217746]], [["Equalize", 0.678653949549764, 0.8097796067861455], ["Contrast", 0.2283048527510083, 0.15507804874474185]], [["Equalize", 0.286013868374536, 0.186785848694501], ["Posterize", 0.16319021740810458, 0.1201304443285659]], [["Sharpness", 0.9601590830563757, 0.06267915026513238], ["AutoContrast", 0.3813920685124327, 0.294224403296912]], [["Brightness", 0.2703246632402241, 0.9168405377492277], ["ShearX", 0.6156009855831097, 0.4955986055846403]], [["Color", 0.9065504424987322, 0.03393612216080133], ["ShearY", 0.6768595880405884, 0.9981068127818191]], [["Equalize", 0.28812842368483904, 0.300387487349145], ["ShearY", 0.28812248704858345, 0.27105076231533964]], [["Brightness", 0.6864882730513477, 0.8205553299102412], ["Cutout", 0.45995236371265424, 0.5422030370297759]], [["Color", 0.34941404877084326, 0.25857961830158516], ["AutoContrast", 0.3451390878441899, 0.5000938249040454]], [["Invert", 0.8268247541815854, 0.6691380821226468], ["Cutout", 0.46489193601530476, 0.22620873109485895]], [["Rotate", 0.17879730528062376, 0.22670425330593935], ["Sharpness", 0.8692795688221834, 0.36586055020855723]], [["Brightness", 0.31203975139659634, 0.6934046293010939], ["Cutout", 0.31649437872271236, 0.08078625004157935]], [["Cutout", 0.3119482836150119, 0.6397160035509996], ["Contrast", 0.8311248624784223, 0.22897510169718616]], [["TranslateX", 0.7631157841429582, 0.6482890521284557], ["Brightness", 0.12681196272427664, 0.3669813784257344]], [["TranslateX", 0.06027722649179801, 0.3101104512201861], ["Sharpness", 0.5652076706249394, 0.05210008400968136]], [["AutoContrast", 0.39213552101583127, 0.5047021194355596], ["ShearY", 0.7164003055682187, 0.8063370761002899]], [["Solarize", 0.9574307011238342, 0.21472064809226854], ["AutoContrast", 0.8102612285047174, 0.716870148067014]], [["Rotate", 0.3592634277567387, 0.6452602893051465], ["AutoContrast", 0.27188430331411506, 0.06003099168464854]], [["Cutout", 0.9529536554825503, 0.5285505311027461], ["Solarize", 0.08478231903311029, 0.15986449762728216]], [["TranslateY", 0.31176130458018936, 0.5642853506158253], ["Equalize", 0.008890883901317648, 0.5146121040955942]], [["Color", 0.40773645085566157, 0.7110398926612682], ["Color", 0.18233100156439364, 0.7830036002758337]], [["Posterize", 0.5793809197821732, 0.043748553135581236], ["Invert", 0.4479962016131668, 0.7349663010359488]], [["TranslateX", 0.1994882312299382, 0.05216859488899439], ["Rotate", 0.48288726352035416, 0.44713829026777585]], [["Posterize", 0.22122838185154603, 0.5034546841241283], ["TranslateX", 0.2538745835410222, 0.6129055170893385]], [["Color", 0.6786559960640814, 0.4529749369803212], ["Equalize", 0.30215879674415336, 0.8733394611096772]], [["Contrast", 0.47316062430673456, 0.46669538897311447], ["Invert", 0.6514906551984854, 0.3053339444067804]], [["Equalize", 0.6443202625334524, 0.8689731394616441], ["Color", 0.7549183794057628, 0.8889001426329578]], [["Solarize", 0.616709740662654, 0.7792180816399313], ["ShearX", 0.9659155537406062, 0.39436937531179495]], [["Equalize", 0.23694011299406226, 0.027711152164392128], ["TranslateY", 0.1677339686527083, 0.3482126536808231]], [["Solarize", 0.15234175951790285, 0.7893840414281341], ["TranslateX", 0.2396395768284183, 0.27727219214979715]], [["Contrast", 0.3792017455380605, 0.32323660409845334], ["Contrast", 0.1356037413846466, 0.9127772969992305]], [["ShearX", 0.02642732222284716, 0.9184662576502115], ["Equalize", 0.11504884472142995, 0.8957638893097964]], [["TranslateY", 0.3193812913345325, 0.8828100030493128], ["ShearY", 0.9374975727563528, 0.09909415611083694]], [["AutoContrast", 0.025840721736048122, 0.7941037581373024], ["TranslateY", 0.498518003323313, 0.5777122846572548]], [["ShearY", 0.6042199307830248, 0.44809668754508836], ["Cutout", 0.3243978207701482, 0.9379740926294765]], [["ShearY", 0.6858549297583574, 0.9993252035788924], ["Sharpness", 0.04682428732773203, 0.21698099707915652]], [["ShearY", 0.7737469436637263, 0.8810127181224531], ["ShearY", 0.8995655445246451, 0.4312416220354539]], [["TranslateY", 0.4953094136709374, 0.8144161580138571], ["Solarize", 0.26301211718928097, 0.518345311180405]], [["Brightness", 0.8820246486031275, 0.571075863786249], ["ShearX", 0.8586669146703955, 0.0060476383595142735]], [["Sharpness", 0.20519233710982254, 0.6144574759149729], ["Posterize", 0.07976625267460813, 0.7480145046726968]], [["ShearY", 0.374075419680195, 0.3386105402023202], ["ShearX", 0.8228083637082115, 0.5885174783155361]], [["Brightness", 0.3528780713814561, 0.6999884884306623], ["Sharpness", 0.3680348120526238, 0.16953358258959617]], [["Brightness", 0.24891223104442084, 0.7973853494920095], ["TranslateX", 0.004256803835524736, 0.0470216343108546]], [["Posterize", 0.1947344282646012, 0.7694802711054367], ["Cutout", 0.9594385534844785, 0.5469744140592429]], [["Invert", 0.19012504762806026, 0.7816140211434693], ["TranslateY", 0.17479746932338402, 0.024249345245078602]], [["Rotate", 0.9669262055946796, 0.510166180775991], ["TranslateX", 0.8990602034610352, 0.6657802719304693]], [["ShearY", 0.5453049050407278, 0.8476872739603525], ["Cutout", 0.14226529093962592, 0.15756960661106634]], [["Equalize", 0.5895291156113004, 0.6797218994447763], ["TranslateY", 0.3541442192192753, 0.05166001155849864]], [["Equalize", 0.39530681662726097, 0.8448335365081087], ["Brightness", 0.6785483272734143, 0.8805568647038574]], [["Cutout", 0.28633258271917905, 0.7750870268336066], ["Equalize", 0.7221097824537182, 0.5865506280531162]], [["Posterize", 0.9044429629421187, 0.4620266401793388], ["Invert", 0.1803008045494473, 0.8073190766288534]], [["Sharpness", 0.7054649148075851, 0.3877207948962055], ["TranslateX", 0.49260224225927285, 0.8987462620731029]], [["Sharpness", 0.11196934729294483, 0.5953704422694938], ["Contrast", 0.13969334315069737, 0.19310569898434204]], [["Posterize", 0.5484346101051778, 0.7914140118600685], ["Brightness", 0.6428044691630473, 0.18811316670808076]], [["Invert", 0.22294834094984717, 0.05173157689962704], ["Cutout", 0.6091129168510456, 0.6280845506243643]], [["AutoContrast", 0.5726444076195267, 0.2799840903601295], ["Cutout", 0.3055752727786235, 0.591639807512993]], [["Brightness", 0.3707116723204462, 0.4049175910826627], ["Rotate", 0.4811601625588309, 0.2710760253723644]], [["ShearY", 0.627791719653608, 0.6877498291550205], ["TranslateX", 0.8751753308366824, 0.011164650018719358]], [["Posterize", 0.33832547954522263, 0.7087039872581657], ["Posterize", 0.6247474435007484, 0.7707784192114796]], [["Contrast", 0.17620186308493468, 0.9946224854942095], ["Solarize", 0.5431896088395964, 0.5867904203742308]], [["ShearX", 0.4667959516719652, 0.8938082224109446], ["TranslateY", 0.7311343008292865, 0.6829842246020277]], [["ShearX", 0.6130281467237769, 0.9924010909612302], ["Brightness", 0.41039241699696916, 0.9753218875311392]], [["TranslateY", 0.0747250386427123, 0.34602725521067534], ["Rotate", 0.5902597465515901, 0.361094672021087]], [["Invert", 0.05234890878959486, 0.36914978664919407], ["Sharpness", 0.42140532878231374, 0.19204058551048275]], [["ShearY", 0.11590485361909497, 0.6518540857972316], ["Invert", 0.6482444740361704, 0.48256237896163945]], [["Rotate", 0.4931329446923608, 0.037076242417301675], ["Contrast", 0.9097939772412852, 0.5619594905306389]], [["Posterize", 0.7311032479626216, 0.4796364593912915], ["Color", 0.13912123993932402, 0.03997286439663705]], [["AutoContrast", 0.6196602944085344, 0.2531430457527588], ["Rotate", 0.5583937060431972, 0.9893379795224023]], [["AutoContrast", 0.8847753125072959, 0.19123028952580057], ["TranslateY", 0.494361716097206, 0.14232297727461696]], [["Invert", 0.6212360716340707, 0.033898871473033165], ["AutoContrast", 0.30839896957008295, 0.23603569542166247]], [["Equalize", 0.8255583546605049, 0.613736933157845], ["AutoContrast", 0.6357166629525485, 0.7894617347709095]], [["Brightness", 0.33840706322846814, 0.07917167871493658], ["ShearY", 0.15693175752528676, 0.6282773652129153]], [["Cutout", 0.7550520024859294, 0.08982367300605598], ["ShearX", 0.5844942417320858, 0.36051195083380105]]] return p def fa_resnet50_rimagenet(): p = [[["ShearY", 0.14143816458479197, 0.513124791615952], ["Sharpness", 0.9290316227291179, 0.9788406212603302]], [["Color", 0.21502874228385338, 0.3698477943880306], ["TranslateY", 0.49865058747734736, 0.4352676987103321]], [["Brightness", 0.6603452126485386, 0.6990174510500261], ["Cutout", 0.7742953773992511, 0.8362550883640804]], [["Posterize", 0.5188375788270497, 0.9863648925446865], ["TranslateY", 0.8365230108655313, 0.6000972236440252]], [["ShearY", 0.9714994964711299, 0.2563663552809896], ["Equalize", 0.8987567223581153, 0.1181761775609772]], [["Sharpness", 0.14346409304565366, 0.5342189791746006], ["Sharpness", 0.1219714162835897, 0.44746801278319975]], [["TranslateX", 0.08089260772173967, 0.028011721602479833], ["TranslateX", 0.34767877352421406, 0.45131294688688794]], [["Brightness", 0.9191164585327378, 0.5143232242627864], ["Color", 0.9235247849934283, 0.30604586249462173]], [["Contrast", 0.4584173187505879, 0.40314219914942756], ["Rotate", 0.550289356406774, 0.38419022293237126]], [["Posterize", 0.37046156420799325, 0.052693291117634544], ["Cutout", 0.7597581409366909, 0.7535799791937421]], [["Color", 0.42583964114658746, 0.6776641859552079], ["ShearY", 0.2864805671096011, 0.07580175477739545]], [["Brightness", 0.5065952125552232, 0.5508640233704984], ["Brightness", 0.4760021616081475, 0.3544313318097987]], [["Posterize", 0.5169630851995185, 0.9466018906715961], ["Posterize", 0.5390336503396841, 0.1171015788193209]], [["Posterize", 0.41153170909576176, 0.7213063942615204], ["Rotate", 0.6232230424824348, 0.7291984098675746]], [["Color", 0.06704687234714028, 0.5278429246040438], ["Sharpness", 0.9146652195810183, 0.4581415618941407]], [["ShearX", 0.22404644446773492, 0.6508620171913467], ["Brightness", 0.06421961538672451, 0.06859528721039095]], [["Rotate", 0.29864103693134797, 0.5244313199644495], ["Sharpness", 0.4006161706584276, 0.5203708477368657]], [["AutoContrast", 0.5748186910788027, 0.8185482599354216], ["Posterize", 0.9571441684265188, 0.1921474117448481]], [["ShearY", 0.5214786760436251, 0.8375629059785009], ["Invert", 0.6872393349333636, 0.9307694335024579]], [["Contrast", 0.47219838080793364, 0.8228524484275648], ["TranslateY", 0.7435518856840543, 0.5888865560614439]], [["Posterize", 0.10773482839638836, 0.6597021018893648], ["Contrast", 0.5218466423129691, 0.562985661685268]], [["Rotate", 0.4401753067886466, 0.055198255925702475], ["Rotate", 0.3702153509335602, 0.5821574425474759]], [["TranslateY", 0.6714729117832363, 0.7145542887432927], ["Equalize", 0.0023263758097700205, 0.25837341854887885]], [["Cutout", 0.3159707561240235, 0.19539664199170742], ["TranslateY", 0.8702824829864558, 0.5832348977243467]], [["AutoContrast", 0.24800812729140026, 0.08017301277245716], ["Brightness", 0.5775505849482201, 0.4905904775616114]], [["Color", 0.4143517886294533, 0.8445937742921498], ["ShearY", 0.28688910858536587, 0.17539366839474402]], [["Brightness", 0.6341134194059947, 0.43683815933640435], ["Brightness", 0.3362277685899835, 0.4612826163288225]], [["Sharpness", 0.4504035748829761, 0.6698294470467474], ["Posterize", 0.9610055612671645, 0.21070714173174876]], [["Posterize", 0.19490421920029832, 0.7235798208354267], ["Rotate", 0.8675551331308305, 0.46335565746433094]], [["Color", 0.35097958351003306, 0.42199181561523186], ["Invert", 0.914112788087429, 0.44775583211984815]], [["Cutout", 0.223575616055454, 0.6328591417299063], ["TranslateY", 0.09269465212259387, 0.5101073959070608]], [["Rotate", 0.3315734525975911, 0.9983593458299167], ["Sharpness", 0.12245416662856974, 0.6258689139914664]], [["ShearY", 0.696116760180471, 0.6317805202283014], ["Color", 0.847501151593963, 0.4440116609830195]], [["Solarize", 0.24945891607225948, 0.7651150206105561], ["Cutout", 0.7229677092930331, 0.12674657348602494]], [["TranslateX", 0.43461945065713675, 0.06476571036747841], ["Color", 0.6139316940180952, 0.7376264330632316]], [["Invert", 0.1933003530637138, 0.4497819016184308], ["Invert", 0.18391634069983653, 0.3199769100951113]], [["Color", 0.20418296626476137, 0.36785101882029814], ["Posterize", 0.624658293920083, 0.8390081535735991]], [["Sharpness", 0.5864963540530814, 0.586672446690273], ["Posterize", 0.1980280647652339, 0.222114611452575]], [["Invert", 0.3543654961628104, 0.5146369635250309], ["Equalize", 0.40751271919434434, 0.4325310837291978]], [["ShearY", 0.22602859359451877, 0.13137880879778158], ["Posterize", 0.7475029061591305, 0.803900538461099]], [["Sharpness", 0.12426276165599924, 0.5965912716602046], ["Invert", 0.22603903038966913, 0.4346802001255868]], [["TranslateY", 0.010307035630661765, 0.16577665156754046], ["Posterize", 0.4114319141395257, 0.829872913683949]], [["TranslateY", 0.9353069865746215, 0.5327821671247214], ["Color", 0.16990443486261103, 0.38794866007484197]], [["Cutout", 0.1028174322829021, 0.3955952903458266], ["ShearY", 0.4311995281335693, 0.48024695395374734]], [["Posterize", 0.1800334334284686, 0.0548749478418862], ["Brightness", 0.7545808536793187, 0.7699080551646432]], [["Color", 0.48695305373084197, 0.6674269768464615], ["ShearY", 0.4306032279086781, 0.06057690550239343]], [["Brightness", 0.4919399683825053, 0.677338905806407], ["Brightness", 0.24112708387760828, 0.42761103121157656]], [["Posterize", 0.4434818644882532, 0.9489450593207714], ["Posterize", 0.40957675116385955, 0.015664946759584186]], [["Posterize", 0.41307949855153797, 0.6843276552020272], ["Rotate", 0.8003545094091291, 0.7002300783416026]], [["Color", 0.7038570031770905, 0.4697612983649519], ["Sharpness", 0.9700016496081002, 0.25185103545948884]], [["AutoContrast", 0.714641656154856, 0.7962423001719023], ["Sharpness", 0.2410097684093468, 0.5919171048019731]], [["TranslateX", 0.8101567644494714, 0.7156447005337443], ["Solarize", 0.5634727831229329, 0.8875158446846]], [["Sharpness", 0.5335258857303261, 0.364743126378182], ["Color", 0.453280875871377, 0.5621962714743068]], [["Cutout", 0.7423678127672542, 0.7726370777867049], ["Invert", 0.2806161382641934, 0.6021111986900146]], [["TranslateY", 0.15190341320343761, 0.3860373175487939], ["Cutout", 0.9980805818665679, 0.05332384819400854]], [["Posterize", 0.36518675678786605, 0.2935819027397963], ["TranslateX", 0.26586180351840005, 0.303641300745208]], [["Brightness", 0.19994509744377761, 0.90813953707639], ["Equalize", 0.8447217761297836, 0.3449396603478335]], [["Sharpness", 0.9294773669936768, 0.999713346583839], ["Brightness", 0.1359744825665662, 0.1658489221872924]], [["TranslateX", 0.11456529257659381, 0.9063795878367734], ["Equalize", 0.017438134319894553, 0.15776887259743755]], [["ShearX", 0.9833726383270114, 0.5688194948373335], ["Equalize", 0.04975615490994345, 0.8078130016227757]], [["Brightness", 0.2654654830488695, 0.8989789725280538], ["TranslateX", 0.3681535065952329, 0.36433345713161036]], [["Rotate", 0.04956524209892327, 0.5371942433238247], ["ShearY", 0.0005527499145153714, 0.56082571605602]], [["Rotate", 0.7918337108932019, 0.5906896260060501], ["Posterize", 0.8223967034091191, 0.450216998388943]], [["Color", 0.43595106766978337, 0.5253013785221605], ["Sharpness", 0.9169421073531799, 0.8439997639348893]], [["TranslateY", 0.20052300197155504, 0.8202662448307549], ["Sharpness", 0.2875792108435686, 0.6997181624527842]], [["Color", 0.10568089980973616, 0.3349467065132249], ["Brightness", 0.13070947282207768, 0.5757725013960775]], [["AutoContrast", 0.3749999712869779, 0.6665578760607657], ["Brightness", 0.8101178402610292, 0.23271946112218125]], [["Color", 0.6473605933679651, 0.7903409763232029], ["ShearX", 0.588080941572581, 0.27223524148254086]], [["Cutout", 0.46293361616697304, 0.7107761001833921], ["AutoContrast", 0.3063766931658412, 0.8026114219854579]], [["Brightness", 0.7884854981520251, 0.5503669863113797], ["Brightness", 0.5832456158675261, 0.5840349298921661]], [["Solarize", 0.4157539625058916, 0.9161905834309929], ["Sharpness", 0.30628197221802017, 0.5386291658995193]], [["Sharpness", 0.03329610069672856, 0.17066672983670506], ["Invert", 0.9900547302690527, 0.6276238841220477]], [["Solarize", 0.551015648982762, 0.6937104775938737], ["Color", 0.8838491591064375, 0.31596634380795385]], [["AutoContrast", 0.16224182418148447, 0.6068227969351896], ["Sharpness", 0.9599468096118623, 0.4885289719905087]], [["TranslateY", 0.06576432526133724, 0.6899544605400214], ["Posterize", 0.2177096480169678, 0.9949164789616582]], [["Solarize", 0.529820544480292, 0.7576047224165541], ["Sharpness", 0.027047878909321643, 0.45425231553970685]], [["Sharpness", 0.9102526010473146, 0.8311987141993857], ["Invert", 0.5191838751826638, 0.6906136644742229]], [["Solarize", 0.4762773516008588, 0.7703654263842423], ["Color", 0.8048437792602289, 0.4741523094238038]], [["Sharpness", 0.7095055508594206, 0.7047344238075169], ["Sharpness", 0.5059623654132546, 0.6127255499234886]], [["TranslateY", 0.02150725921966186, 0.3515764519224378], ["Posterize", 0.12482170119714735, 0.7829851754051393]], [["Color", 0.7983830079184816, 0.6964694521670339], ["Brightness", 0.3666527856286296, 0.16093151636495978]], [["AutoContrast", 0.6724982375829505, 0.536777706678488], ["Sharpness", 0.43091754837597646, 0.7363240924241439]], [["Brightness", 0.2889770401966227, 0.4556557902380539], ["Sharpness", 0.8805303296690755, 0.6262218017754902]], [["Sharpness", 0.5341939854581068, 0.6697109101429343], ["Rotate", 0.6806606655137529, 0.4896914517968317]], [["Sharpness", 0.5690509737059344, 0.32790632371915096], ["Posterize", 0.7951894258661069, 0.08377850335209162]], [["Color", 0.6124132978216081, 0.5756485920709012], ["Brightness", 0.33053544654445344, 0.23321841707002083]], [["TranslateX", 0.0654795026615917, 0.5227246924310244], ["ShearX", 0.2932320531132063, 0.6732066478183716]], [["Cutout", 0.6226071187083615, 0.01009274433736012], ["ShearX", 0.7176799968189801, 0.3758780240463811]], [["Rotate", 0.18172339508029314, 0.18099184896819184], ["ShearY", 0.7862658331645667, 0.295658135767252]], [["Contrast", 0.4156099177015862, 0.7015784500878446], ["Sharpness", 0.6454135310009, 0.32335858947955287]], [["Color", 0.6215885089922037, 0.6882673235388836], ["Brightness", 0.3539881732605379, 0.39486736455795496]], [["Invert", 0.8164816716866418, 0.7238192000817796], ["Sharpness", 0.3876355847343607, 0.9870077619731956]], [["Brightness", 0.1875628712629315, 0.5068115936257], ["Sharpness", 0.8732419122060423, 0.5028019258530066]], [["Sharpness", 0.6140734993408259, 0.6458239834366959], ["Rotate", 0.5250107862824867, 0.533419456933602]], [["Sharpness", 0.5710893143725344, 0.15551651073007305], ["ShearY", 0.6548487860151722, 0.021365083044319146]], [["Color", 0.7610250354649954, 0.9084452893074055], ["Brightness", 0.6934611792619156, 0.4108071412071374]], [["ShearY", 0.07512550098923898, 0.32923768385754293], ["ShearY", 0.2559588911696498, 0.7082337365398496]], [["Cutout", 0.5401319018926146, 0.004750568603408445], ["ShearX", 0.7473354415031975, 0.34472481968368773]], [["Rotate", 0.02284154583679092, 0.1353450082435801], ["ShearY", 0.8192458031684238, 0.2811653613473772]], [["Contrast", 0.21142896718139154, 0.7230739568811746], ["Sharpness", 0.6902690582665707, 0.13488436112901683]], [["Posterize", 0.21701219600958138, 0.5900695769640687], ["Rotate", 0.7541095031505971, 0.5341162375286219]], [["Posterize", 0.5772853064792737, 0.45808311743269936], ["Brightness", 0.14366050177823675, 0.4644871239446629]], [["Cutout", 0.8951718842805059, 0.4970074074310499], ["Equalize", 0.3863835903119882, 0.9986531042150006]], [["Equalize", 0.039411354473938925, 0.7475477254908457], ["Sharpness", 0.8741966378291861, 0.7304822679596362]], [["Solarize", 0.4908704265218634, 0.5160677350249471], ["Color", 0.24961813832742435, 0.09362352627360726]], [["Rotate", 7.870457075154214e-05, 0.8086950025500952], ["Solarize", 0.10200484521793163, 0.12312889222989265]], [["Contrast", 0.8052564975559727, 0.3403813036543645], ["Solarize", 0.7690158533600184, 0.8234626822018851]], [["AutoContrast", 0.680362728854513, 0.9415320040873628], ["TranslateY", 0.5305871824686941, 0.8030609611614028]], [["Cutout", 0.1748050257378294, 0.06565343731910589], ["TranslateX", 0.1812738872339903, 0.6254461448344308]], [["Brightness", 0.4230502644722749, 0.3346463682905031], ["ShearX", 0.19107198973659312, 0.6715789128604919]], [["ShearX", 0.1706528684548394, 0.7816570201200446], ["TranslateX", 0.494545185948171, 0.4710810058360291]], [["TranslateX", 0.42356251508933324, 0.23865307292867322], ["TranslateX", 0.24407503619326745, 0.6013778508137331]], [["AutoContrast", 0.7719512185744232, 0.3107905373009763], ["ShearY", 0.49448082925617176, 0.5777951230577671]], [["Cutout", 0.13026983827940525, 0.30120438757485657], ["Brightness", 0.8857896834516185, 0.7731541459513939]], [["AutoContrast", 0.6422800349197934, 0.38637401090264556], ["TranslateX", 0.25085431400995084, 0.3170642592664873]], [["Sharpness", 0.22336654455367122, 0.4137774852324138], ["ShearY", 0.22446851054920894, 0.518341735882535]], [["Color", 0.2597579403253848, 0.7289643913060193], ["Sharpness", 0.5227416670468619, 0.9239943674030637]], [["Cutout", 0.6835337711563527, 0.24777620448593812], ["AutoContrast", 0.37260245353051846, 0.4840361183247263]], [["Posterize", 0.32756602788628375, 0.21185124493743707], ["ShearX", 0.25431504951763967, 0.19585996561416225]], [["AutoContrast", 0.07930627591849979, 0.5719381348340309], ["AutoContrast", 0.335512380071304, 0.4208050118308541]], [["Rotate", 0.2924360268257798, 0.5317629242879337], ["Sharpness", 0.4531050021499891, 0.4102650087199528]], [["Equalize", 0.5908862210984079, 0.468742362277498], ["Brightness", 0.08571766548550425, 0.5629320703375056]], [["Cutout", 0.52751122383816, 0.7287774744737556], ["Equalize", 0.28721628275296274, 0.8075179887475786]], [["AutoContrast", 0.24208377391366226, 0.34616549409607644], ["TranslateX", 0.17454707403766834, 0.5278055700078459]], [["Brightness", 0.5511881924749478, 0.999638675514418], ["Equalize", 0.14076197797220913, 0.2573030693317552]], [["ShearX", 0.668731433926434, 0.7564253049646743], ["Color", 0.63235486543845, 0.43954436063340785]], [["ShearX", 0.40511960873276237, 0.5710419512142979], ["Contrast", 0.9256769948746423, 0.7461350716211649]], [["Cutout", 0.9995917204023061, 0.22908419326246265], ["TranslateX", 0.5440902956629469, 0.9965570051216295]], [["Color", 0.22552987172228894, 0.4514558960849747], ["Sharpness", 0.638058150559443, 0.9987829481002615]], [["Contrast", 0.5362775837534763, 0.7052133185951871], ["ShearY", 0.220369845547023, 0.7593922994775721]], [["ShearX", 0.0317785822935219, 0.775536785253455], ["TranslateX", 0.7939510227015061, 0.5355620618496535]], [["Cutout", 0.46027969917602196, 0.31561199122527517], ["Color", 0.06154066467629451, 0.5384660000729091]], [["Sharpness", 0.7205483743301113, 0.552222392539886], ["Posterize", 0.5146496404711752, 0.9224333144307473]], [["ShearX", 0.00014547730356910538, 0.3553954298642108], ["TranslateY", 0.9625736029090676, 0.57403418640424]], [["Posterize", 0.9199917903297341, 0.6690259107633706], ["Posterize", 0.0932558110217602, 0.22279303372106138]], [["Invert", 0.25401453476874863, 0.3354329544078385], ["Posterize", 0.1832673201325652, 0.4304718799821412]], [["TranslateY", 0.02084122674367607, 0.12826181437197323], ["ShearY", 0.655862534043703, 0.3838330909470975]], [["Contrast", 0.35231797644104523, 0.3379356652070079], ["Cutout", 0.19685599014304822, 0.1254328595280942]], [["Sharpness", 0.18795594984191433, 0.09488678946484895], ["ShearX", 0.33332876790679306, 0.633523782574133]], [["Cutout", 0.28267175940290246, 0.7901991550267817], ["Contrast", 0.021200195312951198, 0.4733128702798515]], [["ShearX", 0.966231043411256, 0.7700673327786812], ["TranslateX", 0.7102390777763321, 0.12161245817120675]], [["Cutout", 0.5183324259533826, 0.30766086003013055], ["Color", 0.48399078150128927, 0.4967477809069189]], [["Sharpness", 0.8160855187385873, 0.47937658961644], ["Posterize", 0.46360395447862535, 0.7685454058155061]], [["ShearX", 0.10173571421694395, 0.3987290690178754], ["TranslateY", 0.8939980277379345, 0.5669994143735713]], [["Posterize", 0.6768089584801844, 0.7113149244621721], ["Posterize", 0.054896856043358935, 0.3660837250743921]], [["AutoContrast", 0.5915576211896306, 0.33607718177676493], ["Contrast", 0.3809408206617828, 0.5712201773913784]], [["AutoContrast", 0.012321347472748323, 0.06379072432796573], ["Rotate", 0.0017964439160045656, 0.7598026295973337]], [["Contrast", 0.6007100085192627, 0.36171972473370206], ["Invert", 0.09553573684975913, 0.12218510774295901]], [["AutoContrast", 0.32848604643836266, 0.2619457656206414], ["Invert", 0.27082113532501784, 0.9967965642293485]], [["AutoContrast", 0.6156282120903395, 0.9422706516080884], ["Sharpness", 0.4215509247379262, 0.4063347716503587]], [["Solarize", 0.25059210436331264, 0.7215305521159305], ["Invert", 0.1654465185253614, 0.9605851884186778]], [["AutoContrast", 0.4464438610980994, 0.685334175815482], ["Cutout", 0.24358625461158645, 0.4699066834058694]], [["Rotate", 0.5931657741857909, 0.6813978655574067], ["AutoContrast", 0.9259100547738681, 0.4903201223870492]], [["Color", 0.8203976071280751, 0.9777824466585101], ["Posterize", 0.4620669369254169, 0.2738895968716055]], [["Contrast", 0.13754352055786848, 0.3369433962088463], ["Posterize", 0.48371187792441916, 0.025718004361451302]], [["Rotate", 0.5208233630704999, 0.1760188899913535], ["TranslateX", 0.49753461392937226, 0.4142935276250922]], [["Cutout", 0.5967418240931212, 0.8028675552639539], ["Cutout", 0.20021854152659121, 0.19426330549590076]], [["ShearY", 0.549583567386676, 0.6601326640171705], ["Cutout", 0.6111813470383047, 0.4141935587984994]], [["Brightness", 0.6354891977535064, 0.31591459747846745], ["AutoContrast", 0.7853952208711621, 0.6555861906702081]], [["AutoContrast", 0.7333725370546154, 0.9919410576081586], ["Cutout", 0.9984177877923588, 0.2938253683694291]], [["Color", 0.33219296307742263, 0.6378995578424113], ["AutoContrast", 0.15432820754183288, 0.7897899838932103]], [["Contrast", 0.5905289460222578, 0.8158577207653422], ["Cutout", 0.3980284381203051, 0.43030531250317217]], [["TranslateX", 0.452093693346745, 0.5251475931559115], ["Rotate", 0.991422504871258, 0.4556503729269001]], [["Color", 0.04560406292983776, 0.061574671308480766], ["Brightness", 0.05161079440128734, 0.6718398142425688]], [["Contrast", 0.02913302416506853, 0.14402056093217708], ["Rotate", 0.7306930378774588, 0.47088249057922094]], [["Solarize", 0.3283072384190169, 0.82680847744367], ["Invert", 0.21632614168418854, 0.8792241691482687]], [["Equalize", 0.4860808352478527, 0.9440534949023064], ["Cutout", 0.31395897639184694, 0.41805859306017523]], [["Rotate", 0.2816043232522335, 0.5451282807926706], ["Color", 0.7388520447173302, 0.7706503658143311]], [["Color", 0.9342776719536201, 0.9039981381514299], ["Rotate", 0.6646389177840164, 0.5147917008383647]], [["Cutout", 0.08929430082050335, 0.22416445996932374], ["Posterize", 0.454485751267457, 0.500958345348237]], [["TranslateX", 0.14674201106374488, 0.7018633472428202], ["Sharpness", 0.6128796723832848, 0.743535235614809]], [["TranslateX", 0.5189900164469432, 0.6491132403587601], ["Contrast", 0.26309555778227806, 0.5976857969656114]], [["Solarize", 0.23569808291972655, 0.3315781686591778], ["ShearY", 0.07292078937544964, 0.7460326987587573]], [["ShearY", 0.7090542757477153, 0.5246437008439621], ["Sharpness", 0.9666919148538443, 0.4841687888767071]], [["Solarize", 0.3486952615189488, 0.7012877201721799], ["Invert", 0.1933387967311534, 0.9535472742828175]], [["AutoContrast", 0.5393460721514914, 0.6924005011697713], ["Cutout", 0.16988156769247176, 0.3667207571712882]], [["Rotate", 0.5815329514554719, 0.5390406879316949], ["AutoContrast", 0.7370538341589625, 0.7708822194197815]], [["Color", 0.8463701017918459, 0.9893491045831084], ["Invert", 0.06537367901579016, 0.5238468509941635]], [["Contrast", 0.8099771812443645, 0.39371603893945184], ["Posterize", 0.38273629875646487, 0.46493786058573966]], [["Color", 0.11164686537114032, 0.6771450570033168], ["Posterize", 0.27921361289661406, 0.7214300893597819]], [["Contrast", 0.5958265906571906, 0.5963959447666958], ["Sharpness", 0.2640889223630885, 0.3365870842641453]], [["Color", 0.255634146724125, 0.5610029792926452], ["ShearY", 0.7476893976084721, 0.36613194760395557]], [["ShearX", 0.2167581882130063, 0.022978065071245002], ["TranslateX", 0.1686864409720319, 0.4919575435512007]], [["Solarize", 0.10702753776284957, 0.3954707963684698], ["Contrast", 0.7256100635368403, 0.48845259655719686]], [["Sharpness", 0.6165615058519549, 0.2624079463213861], ["ShearX", 0.3804820351860919, 0.4738994677544202]], [["TranslateX", 0.18066394808448177, 0.8174509422318228], ["Solarize", 0.07964569396290502, 0.45495935736800974]], [["Sharpness", 0.2741884021129658, 0.9311045302358317], ["Cutout", 0.0009101326429323388, 0.5932102256756948]], [["Rotate", 0.8501796375826188, 0.5092564038282137], ["Brightness", 0.6520146983999912, 0.724091283316938]], [["Brightness", 0.10079744898900078, 0.7644088017429471], ["AutoContrast", 0.33540215138213575, 0.1487538541758792]], [["ShearY", 0.10632545944757177, 0.9565164562996977], ["Rotate", 0.275833816849538, 0.6200731548023757]], [["Color", 0.6749819274397422, 0.41042188598168844], ["AutoContrast", 0.22396590966461932, 0.5048018491863738]], [["Equalize", 0.5044277111650255, 0.2649182381110667], ["Brightness", 0.35715133289571355, 0.8653260893016869]], [["Cutout", 0.49083594426355326, 0.5602781291093129], ["Posterize", 0.721795488514384, 0.5525847430754974]], [["Sharpness", 0.5081835448947317, 0.7453323423804428], ["TranslateX", 0.11511932212234266, 0.4337766796030984]], [["Solarize", 0.3817050641766593, 0.6879004573473403], ["Invert", 0.0015041436267447528, 0.9793134066888262]], [["AutoContrast", 0.5107410439697935, 0.8276720355454423], ["Cutout", 0.2786270701864015, 0.43993387208414564]], [["Rotate", 0.6711202569428987, 0.6342930903972932], ["Posterize", 0.802820231163559, 0.42770002619222053]], [["Color", 0.9426854321337312, 0.9055431782458764], ["AutoContrast", 0.3556422423506799, 0.2773922428787449]], [["Contrast", 0.10318991257659992, 0.30841372533347416], ["Posterize", 0.4202264962677853, 0.05060395018085634]], [["Invert", 0.549305630337048, 0.886056156681853], ["Cutout", 0.9314157033373055, 0.3485836940307909]], [["ShearX", 0.5642891775895684, 0.16427372934801418], ["Invert", 0.228741164726475, 0.5066345406806475]], [["ShearY", 0.5813123201003086, 0.33474363490586106], ["Equalize", 0.11803439432255824, 0.8583936440614798]], [["Sharpness", 0.1642809706111211, 0.6958675237301609], ["ShearY", 0.5989560762277414, 0.6194018060415276]], [["Rotate", 0.05092104774529638, 0.9358045394527796], ["Cutout", 0.6443254331615441, 0.28548414658857657]], [["Brightness", 0.6986036769232594, 0.9618046340942727], ["Sharpness", 0.5564490243465492, 0.6295231286085622]], [["Brightness", 0.42725649792574105, 0.17628028916784244], ["Equalize", 0.4425109360966546, 0.6392872650036018]], [["ShearY", 0.5758622795525444, 0.8773349286588288], ["ShearX", 0.038525646435423666, 0.8755366512394268]], [["Sharpness", 0.3704459924265827, 0.9236361456197351], ["Color", 0.6379842432311235, 0.4548767717224531]], [["Contrast", 0.1619523824549347, 0.4506528800882731], ["AutoContrast", 0.34513874426188385, 0.3580290330996726]], [["Contrast", 0.728699731513527, 0.6932238009822878], ["Brightness", 0.8602917375630352, 0.5341445123280423]], [["Equalize", 0.3574552353044203, 0.16814745124536548], ["Rotate", 0.24191717169379262, 0.3279497108179034]], [["ShearY", 0.8567478695576244, 0.37746117240238164], ["ShearX", 0.9654125389830487, 0.9283047610798827]], [["ShearY", 0.4339052480582405, 0.5394548246617406], ["Cutout", 0.5070570647967001, 0.7846286976687882]], [["AutoContrast", 0.021620100406875065, 0.44425839772845227], ["AutoContrast", 0.33978157614075183, 0.47716564815092244]], [["Contrast", 0.9727600659025666, 0.6651758819229426], ["Brightness", 0.9893133904996626, 0.39176397622636105]], [["Equalize", 0.283428620586305, 0.18727922861893637], ["Rotate", 0.3556063466797136, 0.3722839913107821]], [["ShearY", 0.7276172841941864, 0.4834188516302227], ["ShearX", 0.010783217950465884, 0.9756458772142235]], [["ShearY", 0.2901753295101581, 0.5684700238749064], ["Cutout", 0.655585564610337, 0.9490071307790201]], [["AutoContrast", 0.008507193981450278, 0.4881150103902877], ["AutoContrast", 0.6561989723231185, 0.3715071329838596]], [["Contrast", 0.7702505530948414, 0.6961371266519999], ["Brightness", 0.9953051630261895, 0.3861962467326121]], [["Equalize", 0.2805270012472756, 0.17715406116880994], ["Rotate", 0.3111256593947474, 0.15824352183820073]], [["Brightness", 0.9888680802094193, 0.4856236485253163], ["ShearX", 0.022370252047332284, 0.9284975906226682]], [["ShearY", 0.4065719044318099, 0.7468528006921563], ["AutoContrast", 0.19494427109708126, 0.8613186475174786]], [["AutoContrast", 0.023296727279367765, 0.9170949567425306], ["AutoContrast", 0.11663051100921168, 0.7908646792175343]], [["AutoContrast", 0.7335191671571732, 0.4958357308292425], ["Color", 0.7964964008349845, 0.4977687544324929]], [["ShearX", 0.19905221600021472, 0.3033081933150046], ["Equalize", 0.9383410219319321, 0.3224669877230161]], [["ShearX", 0.8265450331466404, 0.6509091423603757], ["Sharpness", 0.7134181178748723, 0.6472835976443643]], [["ShearY", 0.46962439525486044, 0.223433110541722], ["Rotate", 0.7749806946212373, 0.5337060376916906]], [["Posterize", 0.1652499695106796, 0.04860659068586126], ["Brightness", 0.6644577712782511, 0.4144528269429337]], [["TranslateY", 0.6220449565731829, 0.4917495676722932], ["Posterize", 0.6255000355409635, 0.8374266890984867]], [["AutoContrast", 0.4887160797052227, 0.7106426020530529], ["Sharpness", 0.7684218571497236, 0.43678474722954763]], [["Invert", 0.13178101535845366, 0.8301141976359813], ["Color", 0.002820877424219378, 0.49444413062487075]], [["TranslateX", 0.9920683666478188, 0.5862245842588877], ["Posterize", 0.5536357075855376, 0.5454300367281468]], [["Brightness", 0.8150181219663427, 0.1411060258870707], ["Sharpness", 0.8548823004164599, 0.77008691072314]], [["Brightness", 0.9580478020413399, 0.7198667636628974], ["ShearY", 0.8431585033377366, 0.38750016565010803]], [["Solarize", 0.2331505347152334, 0.25754361489084787], ["TranslateY", 0.447431373734262, 0.5782399531772253]], [["TranslateY", 0.8904927998691309, 0.25872872455072315], ["AutoContrast", 0.7129888139716263, 0.7161603231650524]], [["ShearY", 0.6336216800247362, 0.5247508616674911], ["Cutout", 0.9167315119726633, 0.2060557387978919]], [["ShearX", 0.001661782345968199, 0.3682225725445044], ["Solarize", 0.12303352043754572, 0.5014989548584458]], [["Brightness", 0.9723625105116246, 0.6555444729681099], ["Contrast", 0.5539208721135375, 0.7819973409318487]], [["Equalize", 0.3262607499912611, 0.0006745572802121513], ["Contrast", 0.35341551623767103, 0.36814689398886347]], [["ShearY", 0.7478539900243613, 0.37322078030129185], ["TranslateX", 0.41558847793529247, 0.7394615158544118]], [["Invert", 0.13735541232529067, 0.5536403864332143], ["Cutout", 0.5109718190377135, 0.0447509485253679]], [["AutoContrast", 0.09403602327274725, 0.5909250807862687], ["ShearY", 0.53234060616395, 0.5316981359469398]], [["ShearX", 0.5651922367876323, 0.6794110241313183], ["Posterize", 0.7431624856363638, 0.7896861463783287]], [["Brightness", 0.30949179379286806, 0.7650569096019195], ["Sharpness", 0.5461629122105034, 0.6814369444005866]], [["Sharpness", 0.28459340191768434, 0.7802208350806028], ["Rotate", 0.15097973114238117, 0.5259683294104645]], [["ShearX", 0.6430803693700531, 0.9333735880102375], ["Contrast", 0.7522209520030653, 0.18831747966185058]], [["Contrast", 0.4219455937915647, 0.29949769435499646], ["Color", 0.6925322933509542, 0.8095523885795443]], [["ShearX", 0.23553236193043048, 0.17966207900468323], ["AutoContrast", 0.9039700567886262, 0.21983629944639108]], [["ShearX", 0.19256223146671514, 0.31200739880443584], ["Sharpness", 0.31962196883294713, 0.6828107668550425]], [["Cutout", 0.5947690279080912, 0.21728220253899178], ["Rotate", 0.6757188879871141, 0.489460599679474]], [["ShearY", 0.18365897125470526, 0.3988571115918058], ["Brightness", 0.7727489489504, 0.4790369956329955]], [["Contrast", 0.7090301084131432, 0.5178303607560537], ["ShearX", 0.16749258277688506, 0.33061773301592356]], [["ShearX", 0.3706690885419934, 0.38510677124319415], ["AutoContrast", 0.8288356276501032, 0.16556487668770264]], [["TranslateY", 0.16758043046445614, 0.30127092823893986], ["Brightness", 0.5194636577132354, 0.6225165310621702]], [["Cutout", 0.6087289363049726, 0.10439287037803044], ["Rotate", 0.7503452083033819, 0.7425316019981433]], [["ShearY", 0.24347189588329932, 0.5554979486672325], ["Brightness", 0.9468115239174161, 0.6132449358023568]], [["Brightness", 0.7144508395807994, 0.4610594769966929], ["ShearX", 0.16466683833092968, 0.3382903812375781]], [["Sharpness", 0.27743648684265465, 0.17200038071656915], ["Color", 0.47404262107546236, 0.7868991675614725]], [["Sharpness", 0.8603993513633618, 0.324604728411791], ["TranslateX", 0.3331597130403763, 0.9369586812977804]], [["Color", 0.1535813630595832, 0.4700116846558207], ["Color", 0.5435647971896318, 0.7639291483525243]], [["Brightness", 0.21486188101947656, 0.039347277341450576], ["Cutout", 0.7069526940684954, 0.39273934115015696]], [["ShearY", 0.7267130888840517, 0.6310800726389485], ["AutoContrast", 0.662163190824139, 0.31948540372237766]], [["ShearX", 0.5123132117185981, 0.1981015909438834], ["AutoContrast", 0.9009347363863067, 0.26790399126924036]], [["Brightness", 0.24245061453231648, 0.2673478678291436], ["ShearX", 0.31707976089283946, 0.6800582845544948]], [["Cutout", 0.9257780138367764, 0.03972673526848819], ["Rotate", 0.6807858944518548, 0.46974332280612097]], [["ShearY", 0.1543443071262312, 0.6051682587030671], ["Brightness", 0.9758203119828304, 0.4941406868162414]], [["Contrast", 0.07578049236491124, 0.38953819133407647], ["ShearX", 0.20194918288164293, 0.4141510791947318]], [["Color", 0.27826402243792286, 0.43517491081531157], ["AutoContrast", 0.6159269026143263, 0.2021846783488046]], [["AutoContrast", 0.5039377966534692, 0.19241507605941105], ["Invert", 0.5563931144385394, 0.7069728937319112]], [["Sharpness", 0.19031632433810566, 0.26310171056096743], ["Color", 0.4724537593175573, 0.6715201448387876]], [["ShearY", 0.2280910467786642, 0.33340559088059313], ["ShearY", 0.8858560034869303, 0.2598627441471076]], [["ShearY", 0.07291814128021593, 0.5819462692986321], ["Cutout", 0.27605696060512147, 0.9693427371868695]], [["Posterize", 0.4249871586563321, 0.8256952014328607], ["Posterize", 0.005907466926447169, 0.8081353382152597]], [["Brightness", 0.9071305290601128, 0.4781196213717954], ["Posterize", 0.8996214311439275, 0.5540717376630279]], [["Brightness", 0.06560728936236392, 0.9920627849065685], ["TranslateX", 0.04530789794044952, 0.5318568944702607]], [["TranslateX", 0.6800263601084814, 0.4611536772507228], ["Rotate", 0.7245888375283157, 0.0914772551375381]], [["Sharpness", 0.879556061897963, 0.42272481462067535], ["TranslateX", 0.4600350422524085, 0.5742175429334919]], [["AutoContrast", 0.5005776243176145, 0.22597121331684505], ["Invert", 0.10763286370369299, 0.6841782704962373]], [["Sharpness", 0.7422908472000116, 0.6850324203882405], ["TranslateX", 0.3832914614128403, 0.34798646673324896]], [["ShearY", 0.31939465302679326, 0.8792088167639516], ["Brightness", 0.4093604352811235, 0.21055483197261338]], [["AutoContrast", 0.7447595860998638, 0.19280222555998586], ["TranslateY", 0.317754779431227, 0.9983454520593591]], [["Equalize", 0.27706973689750847, 0.6447455020660622], ["Contrast", 0.5626579126863761, 0.7920049962776781]], [["Rotate", 0.13064369451773816, 0.1495367590684905], ["Sharpness", 0.24893941981801215, 0.6295943894521504]], [["ShearX", 0.6856269993063254, 0.5167938584189854], ["Sharpness", 0.24835352574609537, 0.9990550493102627]], [["AutoContrast", 0.461654115871693, 0.43097388896245004], ["Cutout", 0.366359682416437, 0.08011826474215511]], [["AutoContrast", 0.993892672935951, 0.2403608711236933], ["ShearX", 0.6620817870694181, 0.1744814077869482]], [["ShearY", 0.6396747719986443, 0.15031017143644265], ["Brightness", 0.9451954879495629, 0.26490678840264714]], [["Color", 0.19311480787397262, 0.15712300697448575], ["Posterize", 0.05391448762015258, 0.6943963643155474]], [["Sharpness", 0.6199669674684085, 0.5412492335319072], ["Invert", 0.14086213450149815, 0.2611850277919339]], [["Posterize", 0.5533129268803405, 0.5332478159319912], ["ShearX", 0.48956244029096635, 0.09223930853562916]], [["ShearY", 0.05871590849449765, 0.19549715278943228], ["TranslateY", 0.7208521362741379, 0.36414003004659434]], [["ShearY", 0.7316263417917531, 0.0629747985768501], ["Contrast", 0.036359793501448245, 0.48658745414898386]], [["Rotate", 0.3301497610942963, 0.5686622043085637], ["ShearX", 0.40581487555676843, 0.5866127743850192]], [["ShearX", 0.6679039628249283, 0.5292270693200821], ["Sharpness", 0.25901391739310703, 0.9778360586541461]], [["AutoContrast", 0.27373222012596854, 0.14456771405730712], ["Contrast", 0.3877220783523938, 0.7965158941894336]], [["Solarize", 0.29440905483979096, 0.06071633809388455], ["Equalize", 0.5246736285116214, 0.37575084834661976]], [["TranslateY", 0.2191269464520395, 0.7444942293988484], ["Posterize", 0.3840878524812771, 0.31812671711741247]], [["Solarize", 0.25159267140731356, 0.5833264622559661], ["Brightness", 0.07552262572348738, 0.33210648549288435]], [["AutoContrast", 0.9770099298399954, 0.46421915310428197], ["AutoContrast", 0.04707358934642503, 0.24922048012183493]], [["Cutout", 0.5379685806621965, 0.02038212605928355], ["Brightness", 0.5900728303717965, 0.28807872931416956]], [["Sharpness", 0.11596624872886108, 0.6086947716949325], ["AutoContrast", 0.34876470059667525, 0.22707897759730578]], [["Contrast", 0.276545513135698, 0.8822580384226156], ["Rotate", 0.04874027684061846, 0.6722214281612163]], [["ShearY", 0.595839851757025, 0.4389866852785822], ["Equalize", 0.5225492356128832, 0.2735290854063459]], [["Sharpness", 0.9918029636732927, 0.9919926583216121], ["Sharpness", 0.03672376137997366, 0.5563865980047012]], [["AutoContrast", 0.34169589759999847, 0.16419911552645738], ["Invert", 0.32995953043129234, 0.15073174739720568]], [["Posterize", 0.04600255098477292, 0.2632612790075844], ["TranslateY", 0.7852153329831825, 0.6990722310191976]], [["AutoContrast", 0.4414653815356372, 0.2657468780017082], ["Posterize", 0.30647061536763337, 0.3688222724948656]], [["Contrast", 0.4239361091421837, 0.6076562806342001], ["Cutout", 0.5780707784165284, 0.05361325256745192]], [["Sharpness", 0.7657895907855394, 0.9842407321667671], ["Sharpness", 0.5416352696151596, 0.6773681575200902]], [["AutoContrast", 0.13967381098331305, 0.10787258006315015], ["Posterize", 0.5019536507897069, 0.9881978222469807]], [["Brightness", 0.030528346448984903, 0.31562058762552847], ["TranslateY", 0.0843808140595676, 0.21019213305350526]], [["AutoContrast", 0.6934579165006736, 0.2530484168209199], ["Rotate", 0.0005751408130693636, 0.43790043943210005]], [["TranslateX", 0.611258547664328, 0.25465240215894935], ["Sharpness", 0.5001446909868196, 0.36102204109889413]], [["Contrast", 0.8995127327150193, 0.5493190695343996], ["Brightness", 0.242708780669213, 0.5461116653329015]], [["AutoContrast", 0.3751825351022747, 0.16845985803896962], ["Cutout", 0.25201103287363663, 0.0005893331783358435]], [["ShearX", 0.1518985779435941, 0.14768180777304504], ["Color", 0.85133530274324, 0.4006641163378305]], [["TranslateX", 0.5489668255504668, 0.4694591826554948], ["Rotate", 0.1917354490155893, 0.39993269385802177]], [["ShearY", 0.6689267479532809, 0.34304285013663577], ["Equalize", 0.24133154048883143, 0.279324043138247]], [["Contrast", 0.3412544002099494, 0.20217358823930232], ["Color", 0.8606984790510235, 0.14305503544676373]], [["Cutout", 0.21656155695311988, 0.5240101349572595], ["Brightness", 0.14109877717636352, 0.2016827341210295]], [["Sharpness", 0.24764371218833872, 0.19655480259925423], ["Posterize", 0.19460398862039913, 0.4975414350200679]], [["Brightness", 0.6071850094982323, 0.7270716448607151], ["Solarize", 0.111786402398499, 0.6325641684614275]], [["Contrast", 0.44772949532200856, 0.44267502710695955], ["AutoContrast", 0.360117506402693, 0.2623958228760273]], [["Sharpness", 0.8888131688583053, 0.936897400764746], ["Sharpness", 0.16080674198274894, 0.5681119841445879]], [["AutoContrast", 0.8004456226590612, 0.1788600469525269], ["Brightness", 0.24832285390647374, 0.02755350284841604]], [["ShearY", 0.06910320102646594, 0.26076407321544054], ["Contrast", 0.8633703022354964, 0.38968514704043056]], [["AutoContrast", 0.42306251382780613, 0.6883260271268138], ["Rotate", 0.3938724346852023, 0.16740881249086037]], [["Contrast", 0.2725343884286728, 0.6468194318074759], ["Sharpness", 0.32238942646494745, 0.6721149242783824]], [["AutoContrast", 0.942093919956842, 0.14675331481712853], ["Posterize", 0.5406276708262192, 0.683901182218153]], [["Cutout", 0.5386811894643584, 0.04498833938429728], ["Posterize", 0.17007257321724775, 0.45761177118620633]], [["Contrast", 0.13599408935104654, 0.53282738083886], ["Solarize", 0.26941667995081114, 0.20958261079465895]], [["Color", 0.6600788518606634, 0.9522228302165842], ["Invert", 0.0542722262516899, 0.5152431169321683]], [["Contrast", 0.5328934819727553, 0.2376220512388278], ["Posterize", 0.04890422575781711, 0.3182233123739474]], [["AutoContrast", 0.9289628064340965, 0.2976678437448435], ["Color", 0.20936893798507963, 0.9649612821434217]], [["Cutout", 0.9019423698575457, 0.24002036989728096], ["Brightness", 0.48734445615892974, 0.047660899809176316]], [["Sharpness", 0.09347824275711591, 0.01358686275590612], ["Posterize", 0.9248539660538934, 0.4064232632650468]], [["Brightness", 0.46575675383704634, 0.6280194775484345], ["Invert", 0.17276207634499413, 0.21263495428839635]], [["Brightness", 0.7238014711679732, 0.6178946027258592], ["Equalize", 0.3815496086340364, 0.07301281068847276]], [["Contrast", 0.754557393588416, 0.895332753570098], ["Color", 0.32709957750707447, 0.8425486003491515]], [["Rotate", 0.43406698081696576, 0.28628263254953723], ["TranslateY", 0.43949548709125374, 0.15927082198238685]], [["Brightness", 0.0015838339831640708, 0.09341692553352654], ["AutoContrast", 0.9113966907329718, 0.8345900469751112]], [["ShearY", 0.46698796308585017, 0.6150701348176804], ["Invert", 0.14894062704815722, 0.2778388046184728]], [["Color", 0.30360499169455957, 0.995713092016834], ["Contrast", 0.2597016288524961, 0.8654420870658932]], [["Brightness", 0.9661642031891435, 0.7322006407169436], ["TranslateY", 0.4393502786333408, 0.33934762664274265]], [["Color", 0.9323638351992302, 0.912776309755293], ["Brightness", 0.1618274755371618, 0.23485741708056307]], [["Color", 0.2216470771158821, 0.3359240197334976], ["Sharpness", 0.6328691811471494, 0.6298393874452548]], [["Solarize", 0.4772769142265505, 0.7073470698713035], ["ShearY", 0.2656114148206966, 0.31343097010487253]], [["Solarize", 0.3839017339304234, 0.5985505779429036], ["Equalize", 0.002412059429196589, 0.06637506181196245]], [["Contrast", 0.12751196553017863, 0.46980311434237976], ["Sharpness", 0.3467487455865491, 0.4054907610444406]], [["AutoContrast", 0.9321813669127206, 0.31328471589533274], ["Rotate", 0.05801738717432747, 0.36035756254444273]], [["TranslateX", 0.52092390458353, 0.5261722561643886], ["Contrast", 0.17836804476171306, 0.39354333443158535]], [["Posterize", 0.5458100909925713, 0.49447244994482603], ["Brightness", 0.7372536822363605, 0.5303409097463796]], [["Solarize", 0.1913974941725724, 0.5582966653986761], ["Equalize", 0.020733669175727026, 0.9377467166472878]], [["Equalize", 0.16265732137763889, 0.5206282340874929], ["Sharpness", 0.2421533133595281, 0.506389065871883]], [["AutoContrast", 0.9787324801448523, 0.24815051941486466], ["Rotate", 0.2423487151245957, 0.6456493129745148]], [["TranslateX", 0.6809867726670327, 0.6949687002397612], ["Contrast", 0.16125673359747458, 0.7582679978218987]], [["Posterize", 0.8212000950994955, 0.5225012157831872], ["Brightness", 0.8824891856626245, 0.4499216779709508]], [["Solarize", 0.12061313332505218, 0.5319371283368052], ["Equalize", 0.04120865969945108, 0.8179402157299602]], [["Rotate", 0.11278256686005855, 0.4022686554165438], ["ShearX", 0.2983451019112792, 0.42782525461812604]], [["ShearY", 0.8847385513289983, 0.5429227024179573], ["Rotate", 0.21316428726607445, 0.6712120087528564]], [["TranslateX", 0.46448081241068717, 0.4746090648963252], ["Brightness", 0.19973580961271142, 0.49252862676553605]], [["Posterize", 0.49664100539481526, 0.4460713166484651], ["Brightness", 0.6629559985581529, 0.35192346529003693]], [["Color", 0.22710733249173676, 0.37943185764616194], ["ShearX", 0.015809774971472595, 0.8472080190835669]], [["Contrast", 0.4187366322381491, 0.21621979869256666], ["AutoContrast", 0.7631045030367304, 0.44965231251615134]], [["Sharpness", 0.47240637876720515, 0.8080091811749525], ["Cutout", 0.2853425420104144, 0.6669811510150936]], [["Posterize", 0.7830320527127324, 0.2727062685529881], ["Solarize", 0.527834000867504, 0.20098218845222998]], [["Contrast", 0.366380535288225, 0.39766001659663075], ["Cutout", 0.8708808878088891, 0.20669525734273086]], [["ShearX", 0.6815427281122932, 0.6146858582671569], ["AutoContrast", 0.28330622372053493, 0.931352024154997]], [["AutoContrast", 0.8668174463154519, 0.39961453880632863], ["AutoContrast", 0.5718557712359253, 0.6337062930797239]], [["ShearY", 0.8923152519411871, 0.02480062504737446], ["Cutout", 0.14954159341231515, 0.1422219808492364]], [["Rotate", 0.3733718175355636, 0.3861928572224287], ["Sharpness", 0.5651126520194574, 0.6091103847442831]], [["Posterize", 0.8891714191922857, 0.29600154265251016], ["TranslateY", 0.7865351723963945, 0.5664998548985523]], [["TranslateX", 0.9298214806998273, 0.729856565052017], ["AutoContrast", 0.26349082482341846, 0.9638882609038888]], [["Sharpness", 0.8387378377527128, 0.42146721129032494], ["AutoContrast", 0.9860522000876452, 0.4200699464169384]], [["ShearY", 0.019609159303115145, 0.37197835936879514], ["Cutout", 0.22199340461754258, 0.015932573201085848]], [["Rotate", 0.43871085583928443, 0.3283504258860078], ["Sharpness", 0.6077702068037776, 0.6830305349618742]], [["Contrast", 0.6160211756538094, 0.32029451083389626], ["Cutout", 0.8037631428427006, 0.4025688837399259]], [["TranslateY", 0.051637820936985435, 0.6908417834391846], ["Sharpness", 0.7602756948473368, 0.4927111506643095]], [["Rotate", 0.4973618638052235, 0.45931479729281227], ["TranslateY", 0.04701789716427618, 0.9408779705948676]], [["Rotate", 0.5214194592768602, 0.8371249272013652], ["Solarize", 0.17734812472813338, 0.045020798970228315]], [["ShearX", 0.7457999920079351, 0.19025612553075893], ["Sharpness", 0.5994846101703786, 0.5665094068864229]], [["Contrast", 0.6172655452900769, 0.7811432139704904], ["Cutout", 0.09915620454670282, 0.3963692287596121]], [["TranslateX", 0.2650112299235817, 0.7377261946165307], ["AutoContrast", 0.5019539734059677, 0.26905046992024506]], [["Contrast", 0.6646299821370135, 0.41667784809592945], ["Cutout", 0.9698457154992128, 0.15429001887703997]], [["Sharpness", 0.9467079029475773, 0.44906457469098204], ["Cutout", 0.30036908747917396, 0.4766149689663106]], [["Equalize", 0.6667517691051055, 0.5014839828447363], ["Solarize", 0.4127890336820831, 0.9578274770236529]], [["Cutout", 0.6447384874120834, 0.2868806107728985], ["Cutout", 0.4800990488106021, 0.4757538246206956]], [["Solarize", 0.12560195032363236, 0.5557473475801568], ["Equalize", 0.019957161871490228, 0.5556797187823773]], [["Contrast", 0.12607637375759484, 0.4300633627435161], ["Sharpness", 0.3437273670109087, 0.40493203127714417]], [["AutoContrast", 0.884353334807183, 0.5880138314357569], ["Rotate", 0.9846032404597116, 0.3591877296622974]], [["TranslateX", 0.6862295865975581, 0.5307482119690076], ["Contrast", 0.19439251187251982, 0.3999195825722808]], [["Posterize", 0.4187641835025246, 0.5008988942651585], ["Brightness", 0.6665805605402482, 0.3853288204214253]], [["Posterize", 0.4507470690013903, 0.4232437206624681], ["TranslateX", 0.6054107416317659, 0.38123828040922203]], [["AutoContrast", 0.29562338573283276, 0.35608605102687474], ["TranslateX", 0.909954785390274, 0.20098894888066549]], [["Contrast", 0.6015278411777212, 0.6049140992035096], ["Cutout", 0.47178713636517855, 0.5333747244651914]], [["TranslateX", 0.490851976691112, 0.3829593925141144], ["Sharpness", 0.2716675173824095, 0.5131696240367152]], [["Posterize", 0.4190558294646337, 0.39316689077269873], ["Rotate", 0.5018526072725914, 0.295712490156129]], [["AutoContrast", 0.29624715560691617, 0.10937329832409388], ["Posterize", 0.8770505275992637, 0.43117765012206943]], [["Rotate", 0.6649970092751698, 0.47767131373391974], ["ShearX", 0.6257923540490786, 0.6643337040198358]], [["Sharpness", 0.5553620705849509, 0.8467799429696928], ["Cutout", 0.9006185811918932, 0.3537270716262]], [["ShearY", 0.0007619678283789788, 0.9494591850536303], ["Invert", 0.24267733654007673, 0.7851608409575828]], [["Contrast", 0.9730916198112872, 0.404670123321921], ["Sharpness", 0.5923587793251186, 0.7405792404430281]], [["Cutout", 0.07393909593373034, 0.44569630026328344], ["TranslateX", 0.2460593252211425, 0.4817527814541055]], [["Brightness", 0.31058654119340867, 0.7043749950260936], ["ShearX", 0.7632161538947713, 0.8043681264908555]], [["AutoContrast", 0.4352334371415373, 0.6377550087204297], ["Rotate", 0.2892714673415678, 0.49521052050510556]], [["Equalize", 0.509071051375276, 0.7352913414974414], ["ShearX", 0.5099959429711828, 0.7071566714593619]], [["Posterize", 0.9540506532512889, 0.8498853304461906], ["ShearY", 0.28199061357155397, 0.3161715627214629]], [["Posterize", 0.6740855359097433, 0.684004694936616], ["Posterize", 0.6816720350737863, 0.9654766942980918]], [["Solarize", 0.7149344531717328, 0.42212789795181643], ["Brightness", 0.686601460864528, 0.4263050070610551]], [["Cutout", 0.49577164991501, 0.08394890892056037], ["Rotate", 0.5810369852730606, 0.3320732965776973]], [["TranslateY", 0.1793755480490623, 0.6006520265468684], ["Brightness", 0.3769016576438939, 0.7190746300828186]], [["TranslateX", 0.7226363597757153, 0.3847027238123509], ["Brightness", 0.7641713191794035, 0.36234003077512544]], [["TranslateY", 0.1211227055347106, 0.6693523474608023], ["Brightness", 0.13011180247738063, 0.5126647617294864]], [["Equalize", 0.1501070550869129, 0.0038548909451806557], ["Posterize", 0.8266535939653881, 0.5502199643499207]], [["Sharpness", 0.550624117428359, 0.2023044586648523], ["Brightness", 0.06291556314780017, 0.7832635398703937]], [["Color", 0.3701578205508141, 0.9051537973590863], ["Contrast", 0.5763972727739397, 0.4905511239739898]], [["Rotate", 0.7678527224046323, 0.6723066265307555], ["Solarize", 0.31458533097383207, 0.38329324335154524]], [["Brightness", 0.292050127929522, 0.7047582807953063], ["ShearX", 0.040541891910333805, 0.06639328601282746]], [["TranslateY", 0.4293891393238555, 0.6608516902234284], ["Sharpness", 0.7794685477624004, 0.5168044063408147]], [["Color", 0.3682450402286552, 0.17274523597220048], ["ShearY", 0.3936056470397763, 0.5702597289866161]], [["Equalize", 0.43436990310624657, 0.9207072627823626], ["Contrast", 0.7608688260846083, 0.4759023148841439]], [["Brightness", 0.7926088966143935, 0.8270093925674497], ["ShearY", 0.4924174064969461, 0.47424347505831244]], [["Contrast", 0.043917555279430476, 0.15861903591675125], ["ShearX", 0.30439480405505853, 0.1682659341098064]], [["TranslateY", 0.5598255583454538, 0.721352536005039], ["Posterize", 0.9700921973303752, 0.6882015184440126]], [["AutoContrast", 0.3620887415037668, 0.5958176322317132], ["TranslateX", 0.14213781552733287, 0.6230799786459947]], [["Color", 0.490366889723972, 0.9863152892045195], ["Color", 0.817792262022319, 0.6755656429452775]], [["Brightness", 0.7030707021937771, 0.254633187122679], ["Color", 0.13977318232688843, 0.16378180123959793]], [["AutoContrast", 0.2933247831326118, 0.6283663376211102], ["Sharpness", 0.85430478154147, 0.9753613184208796]], [["Rotate", 0.6674299955457268, 0.48571208708018976], ["Contrast", 0.47491370175907016, 0.6401079552479657]], [["Sharpness", 0.37589579644127863, 0.8475131989077025], ["TranslateY", 0.9985149867598191, 0.057815729375099975]], [["Equalize", 0.0017194373841596389, 0.7888361311461602], ["Contrast", 0.6779293670669408, 0.796851411454113]], [["TranslateY", 0.3296782119072306, 0.39765117357271834], ["Sharpness", 0.5890554357001884, 0.6318339473765834]], [["Posterize", 0.25423810893163856, 0.5400430289894207], ["Sharpness", 0.9273643918988342, 0.6480913470982622]], [["Cutout", 0.850219975768305, 0.4169812455601289], ["Solarize", 0.5418755745870089, 0.5679666650495466]], [["Brightness", 0.008881361977310959, 0.9282562314720516], ["TranslateY", 0.7736066471553994, 0.20041167606029642]], [["Brightness", 0.05382537581401925, 0.6405265501035952], ["Contrast", 0.30484329473639593, 0.5449338155734242]], [["Color", 0.613257119787967, 0.4541503912724138], ["Brightness", 0.9061572524724674, 0.4030159294447347]], [["Brightness", 0.02739111568942537, 0.006028056532326534], ["ShearX", 0.17276751958646486, 0.05967365780621859]], [["TranslateY", 0.4376298213047888, 0.7691816164456199], ["Sharpness", 0.8162292718857824, 0.6054926462265117]], [["Color", 0.37963069679121214, 0.5946919433483344], ["Posterize", 0.08485417284005387, 0.5663580913231766]], [["Equalize", 0.49785780226818316, 0.9999137109183761], ["Sharpness", 0.7685879484682496, 0.6260846154212211]], [["AutoContrast", 0.4190931409670763, 0.2374852525139795], ["Posterize", 0.8797422264608563, 0.3184738541692057]], [["Rotate", 0.7307269024632872, 0.41523609600701106], ["ShearX", 0.6166685870692289, 0.647133807748274]], [["Sharpness", 0.5633713231039904, 0.8276694754755876], ["Cutout", 0.8329340776895764, 0.42656043027424073]], [["ShearY", 0.14934828370884312, 0.8622510773680372], ["Invert", 0.25925989086863277, 0.8813283584888576]], [["Contrast", 0.9457071292265932, 0.43228655518614034], ["Sharpness", 0.8485316947644338, 0.7590298998732413]], [["AutoContrast", 0.8386103589399184, 0.5859583131318076], ["Solarize", 0.466758711343543, 0.9956215363818983]], [["Rotate", 0.9387133710926467, 0.19180564509396503], ["Rotate", 0.5558247609706255, 0.04321698692007105]], [["ShearX", 0.3608716600695567, 0.15206159451532864], ["TranslateX", 0.47295292905710146, 0.5290760596129888]], [["TranslateX", 0.8357685981547495, 0.5991305115727084], ["Posterize", 0.5362929404188211, 0.34398525441943373]], [["ShearY", 0.6751984031632811, 0.6066293622133011], ["Contrast", 0.4122723990263818, 0.4062467515095566]], [["Color", 0.7515349936021702, 0.5122124665429213], ["Contrast", 0.03190514292904123, 0.22903520154660545]], [["Contrast", 0.5448962625054385, 0.38655673938910545], ["AutoContrast", 0.4867400684894492, 0.3433111101096984]], [["Rotate", 0.0008372434310827959, 0.28599951781141714], ["Equalize", 0.37113686925530087, 0.5243929348114981]], [["Color", 0.720054993488857, 0.2010177651701808], ["TranslateX", 0.23036196506059398, 0.11152764304368781]], [["Cutout", 0.859134208332423, 0.6727345740185254], ["ShearY", 0.02159833505865088, 0.46390076266538544]], [["Sharpness", 0.3428232157391428, 0.4067874527486514], ["Brightness", 0.5409415136577347, 0.3698432231874003]], [["Solarize", 0.27303978936454776, 0.9832186173589548], ["ShearY", 0.08831127213044043, 0.4681870331149774]], [["TranslateY", 0.2909309268736869, 0.4059460811623174], ["Sharpness", 0.6425125139803729, 0.20275737203293587]], [["Contrast", 0.32167626214661627, 0.28636162794046977], ["Invert", 0.4712405253509603, 0.7934644799163176]], [["Color", 0.867993060896951, 0.96574321666213], ["Color", 0.02233897320328512, 0.44478933557303063]], [["AutoContrast", 0.1841254751814967, 0.2779992148017741], ["Color", 0.3586283093530607, 0.3696246850445087]], [["Posterize", 0.2052935984046965, 0.16796913860308244], ["ShearX", 0.4807226832843722, 0.11296747254563266]], [["Cutout", 0.2016411266364791, 0.2765295444084803], ["Brightness", 0.3054112810424313, 0.695924264931216]], [["Rotate", 0.8405872184910479, 0.5434142541450815], ["Cutout", 0.4493615138203356, 0.893453735250007]], [["Contrast", 0.8433310507685494, 0.4915423577963278], ["ShearX", 0.22567799557913246, 0.20129892537008834]], [["Contrast", 0.045954277103674224, 0.5043900167190442], ["Cutout", 0.5552992473054611, 0.14436447810888237]], [["AutoContrast", 0.7719296115130478, 0.4440417544621306], ["Sharpness", 0.13992809206158283, 0.7988278670709781]], [["Color", 0.7838574233513952, 0.5971351401625151], ["TranslateY", 0.13562290583925385, 0.2253039635819158]], [["Cutout", 0.24870301109385806, 0.6937886690381568], ["TranslateY", 0.4033400068952813, 0.06253378991880915]], [["TranslateX", 0.0036059390486775644, 0.5234723884081843], ["Solarize", 0.42724862530733526, 0.8697702564187633]], [["Equalize", 0.5446026737834311, 0.9367992979112202], ["ShearY", 0.5943478903735789, 0.42345889214100046]], [["ShearX", 0.18611885697957506, 0.7320849092947314], ["ShearX", 0.3796416430900566, 0.03817761920009881]], [["Posterize", 0.37636778506979124, 0.26807924785236537], ["Brightness", 0.4317372554383255, 0.5473346211870932]], [["Brightness", 0.8100436240916665, 0.3817612088285007], ["Brightness", 0.4193974619003253, 0.9685902764026623]], [["Contrast", 0.701776402197012, 0.6612786008858009], ["Color", 0.19882787177960912, 0.17275597188875483]], [["Color", 0.9538303302832989, 0.48362384535228686], ["ShearY", 0.2179980837345602, 0.37027290936457313]], [["TranslateY", 0.6068028691503798, 0.3919346523454841], ["Cutout", 0.8228303342563138, 0.18372280287814613]], [["Equalize", 0.016416758802906828, 0.642838949194916], ["Cutout", 0.5761717838655257, 0.7600661153497648]], [["Color", 0.9417761826818639, 0.9916074035986558], ["Equalize", 0.2524209308597042, 0.6373703468715077]], [["Brightness", 0.75512589439513, 0.6155072321007569], ["Contrast", 0.32413476940254515, 0.4194739830159837]], [["Sharpness", 0.3339450765586968, 0.9973297539194967], ["AutoContrast", 0.6523930242124429, 0.1053482471037186]], [["ShearX", 0.2961391955838801, 0.9870036064904368], ["ShearY", 0.18705025965909403, 0.4550895821154484]], [["TranslateY", 0.36956447983807883, 0.36371471767143543], ["Sharpness", 0.6860051967688487, 0.2850190720087796]], [["Cutout", 0.13017742151902967, 0.47316674150067195], ["Invert", 0.28923829959551883, 0.9295585654924601]], [["Contrast", 0.7302368472279086, 0.7178974949876642], ["TranslateY", 0.12589674152030433, 0.7485392909494947]], [["Color", 0.6474693117772619, 0.5518269515590674], ["Contrast", 0.24643004970708016, 0.3435581358079418]], [["Contrast", 0.5650327855750835, 0.4843031798040887], ["Brightness", 0.3526684005761239, 0.3005305004600969]], [["Rotate", 0.09822284968122225, 0.13172798244520356], ["Equalize", 0.38135066977857157, 0.5135129123554154]], [["Contrast", 0.5902590645585712, 0.2196062383730596], ["ShearY", 0.14188379126120954, 0.1582612142182743]], [["Cutout", 0.8529913814417812, 0.89734031211874], ["Color", 0.07293767043078672, 0.32577659205278897]], [["Equalize", 0.21401668971453247, 0.040015259500028266], ["ShearY", 0.5126400895338797, 0.4726484828276388]], [["Brightness", 0.8269430025954498, 0.9678362841865166], ["ShearY", 0.17142069814830432, 0.4726727848289514]], [["Brightness", 0.699707089334018, 0.2795501395789335], ["ShearX", 0.5308818178242845, 0.10581814221896294]], [["Equalize", 0.32519644258946145, 0.15763390340309183], ["TranslateX", 0.6149090364414208, 0.7454832565718259]], [["AutoContrast", 0.5404508567155423, 0.7472387762067986], ["Equalize", 0.05649876539221024, 0.5628180219887216]]] return p def fa_reduced_svhn(): p = [[["TranslateX", 0.001576965129744562, 0.43180488809874773], ["Invert", 0.7395307279252639, 0.7538444307982558]], [["Contrast", 0.5762062225409211, 0.7532431872873473], ["TranslateX", 0.45212523461624615, 0.02451684483019846]], [["Contrast", 0.18962433143225088, 0.29481185671147325], ["Contrast", 0.9998112218299271, 0.813015355163255]], [["Posterize", 0.9633391295905683, 0.4136786222304747], ["TranslateY", 0.8011655496664203, 0.44102126789970797]], [["Color", 0.8231185187716968, 0.4171602946893402], ["TranslateX", 0.8684965619113907, 0.36514568324909674]], [["Color", 0.904075230324581, 0.46319140331093767], ["Contrast", 0.4115196534764559, 0.7773329158740563]], [["Sharpness", 0.6600262774093967, 0.8045637700026345], ["TranslateY", 0.5917663766021198, 0.6844241908520602]], [["AutoContrast", 0.16223989311434306, 0.48169653554195924], ["ShearX", 0.5433173232860344, 0.7460278151912152]], [["ShearX", 0.4913604762760715, 0.83391837859561], ["Color", 0.5580367056511908, 0.2961512691312932]], [["Color", 0.18567091721211237, 0.9296983204905286], ["Cutout", 0.6074026199060156, 0.03303273406448193]], [["Invert", 0.8049054771963224, 0.1340792344927909], ["Color", 0.4208839940504979, 0.7096454840962345]], [["ShearX", 0.7997786664546294, 0.6492629575700173], ["AutoContrast", 0.3142777134084793, 0.6526010594925064]], [["TranslateX", 0.2581027144644976, 0.6997433332894101], ["Rotate", 0.45490480973606834, 0.238620570022944]], [["Solarize", 0.837397161027719, 0.9311141273136286], ["Contrast", 0.640364826293148, 0.6299761518677469]], [["Brightness", 0.3782457347141744, 0.7085036717054278], ["Brightness", 0.5346150083208507, 0.5858930737867671]], [["Invert", 0.48780391510474086, 0.610086407879722], ["Color", 0.5601999247616932, 0.5393836220423195]], [["Brightness", 0.00250086643283564, 0.5003355864896979], ["Brightness", 0.003922153283353616, 0.41107110154584925]], [["TranslateX", 0.4073069009685957, 0.9843435292693372], ["Invert", 0.38837085318721926, 0.9298542033875989]], [["ShearY", 0.05479740443795811, 0.9113983424872698], ["AutoContrast", 0.2181108114232728, 0.713996037012164]], [["Brightness", 0.27747508429413903, 0.3217467607288693], ["ShearX", 0.02715239061946995, 0.5430731635396449]], [["Sharpness", 0.08994432959374538, 0.004706443546453831], ["Posterize", 0.10768206853226996, 0.39020299239900236]], [["Cutout", 0.37498679037853905, 0.20784809761469553], ["Color", 0.9825516352194511, 0.7654155662756019]], [["Color", 0.8899349124453552, 0.7797700766409008], ["Rotate", 0.1370222187174981, 0.2622119295138398]], [["Cutout", 0.7088223332663685, 0.7884456023190028], ["Solarize", 0.5362257505160836, 0.6426837537811545]], [["Invert", 0.15686225694987552, 0.5500563899117913], ["Rotate", 0.16315224193260078, 0.4246854030170752]], [["Rotate", 0.005266247922433631, 0.06612026206223394], ["Contrast", 0.06494357829209037, 0.2738420319474947]], [["Cutout", 0.30200619566806275, 0.06558008068236942], ["Rotate", 0.2168576483823022, 0.878645566986328]], [["Color", 0.6358930679444622, 0.613404714161498], ["Rotate", 0.08733206733004326, 0.4348276574435751]], [["Cutout", 0.8834634887239585, 0.0006853845293474659], ["Solarize", 0.38132051231951847, 0.42558752668491195]], [["ShearY", 0.08830136548479937, 0.5522438878371283], ["Brightness", 0.23816560427834074, 0.3033709051157141]], [["Solarize", 0.9015331490756151, 0.9108788708847556], ["Contrast", 0.2057898014670072, 0.03260096030427456]], [["Equalize", 0.9455978685121174, 0.14850077333434056], ["TranslateY", 0.6888705996522545, 0.5300565492007543]], [["Cutout", 0.16942673959343585, 0.7294197201361826], ["TranslateX", 0.41184830642301534, 0.7060207449376135]], [["Color", 0.30133344118702166, 0.24384417956342314], ["Sharpness", 0.4640904544421743, 0.32431840288061864]], [["Sharpness", 0.5195055033472676, 0.9386677467005835], ["Color", 0.9536519432978372, 0.9624043444556467]], [["Rotate", 0.8689597230556101, 0.23955490826730633], ["Contrast", 0.050071600927462656, 0.1309891556004179]], [["Cutout", 0.5349421090878962, 0.08239510727779054], ["Rotate", 0.46064964710717216, 0.9037689320897339]], [["AutoContrast", 0.5625256909986802, 0.5358003783186498], ["Equalize", 0.09204330691163354, 0.4386906784850649]], [["ShearX", 0.0011061172864470226, 0.07150284682189278], ["AutoContrast", 0.6015956946553209, 0.4375362295530898]], [["ShearY", 0.25294276499800983, 0.7937560397859562], ["Brightness", 0.30834103299704474, 0.21960258701547009]], [["Posterize", 0.7423948904688074, 0.4598609935109695], ["Rotate", 0.5510348811675979, 0.26763724868985933]], [["TranslateY", 0.3208729319318745, 0.945513054853888], ["ShearX", 0.4916473963030882, 0.8743840560039451]], [["ShearY", 0.7557718687011286, 0.3125397104722828], ["Cutout", 0.5565359791865849, 0.5151359251135629]], [["AutoContrast", 0.16652786355571275, 0.1101575800958632], ["Rotate", 0.05108851703032641, 0.2612966401802814]], [["Brightness", 0.380296489835016, 0.0428162454174662], ["ShearX", 0.3911934083168285, 0.18933607362790178]], [["Color", 0.002476250465397678, 0.07795275305347571], ["Posterize", 0.08131841266654188, 0.14843363184306413]], [["Cutout", 0.36664558716104434, 0.20904484995063996], ["Cutout", 0.07986452057223141, 0.9287747671053432]], [["Color", 0.9296812469919231, 0.6634239915141935], ["Rotate", 0.07632463573240006, 0.408624029443747]], [["Cutout", 0.7594470171961278, 0.9834672124229463], ["Solarize", 0.4471371303745053, 0.5751101102286562]], [["Posterize", 0.051186719734032285, 0.5110941294710823], ["Sharpness", 0.040432522797391596, 0.42652298706992164]], [["Sharpness", 0.2645335264327221, 0.8844553189835457], ["Brightness", 0.7229600357932696, 0.16660749270785696]], [["Sharpness", 0.6296376086802589, 0.15564989758083458], ["Sharpness", 0.7913410481400365, 0.7022615408082826]], [["Cutout", 0.5517247347343883, 0.43794888517764674], ["ShearX", 0.6951051782530201, 0.6230992857867065]], [["ShearX", 0.9015708556331022, 0.6322135168527783], ["Contrast", 0.4285629283441831, 0.18158321019502988]], [["Brightness", 0.9014292329524769, 0.3660463325457713], ["Invert", 0.6700729097206592, 0.16502732071917703]], [["AutoContrast", 0.6432764477303431, 0.9998909112400834], ["Invert", 0.8124063975545761, 0.8149683327882365]], [["Cutout", 0.6023944009428617, 0.9630976951918225], ["ShearX", 0.2734723568803071, 0.3080911542121765]], [["Sharpness", 0.048949115014412806, 0.44497866256845164], ["Brightness", 0.5611832867244329, 0.12994217480426257]], [["TranslateY", 0.4619112333002525, 0.47317728091588396], ["Solarize", 0.618638784910472, 0.9508297099190338]], [["Sharpness", 0.9656274391147018, 0.3402622993963962], ["Cutout", 0.8452511174508919, 0.3094717093312621]], [["ShearX", 0.04942201651478659, 0.6910568465705691], ["AutoContrast", 0.7155342517619936, 0.8565418847743523]], [["Brightness", 0.5222290590721783, 0.6462675303633422], ["Sharpness", 0.7756317511341633, 0.05010730683866704]], [["Contrast", 0.17098396012942796, 0.9128908626236187], ["TranslateY", 0.1523815376677518, 0.4269909829886339]], [["Cutout", 0.7679024720089866, 0.22229116396644455], ["Sharpness", 0.47714827844878843, 0.8242815864830401]], [["Brightness", 0.9321772357292445, 0.11339758604001371], ["Invert", 0.7021078495093375, 0.27507749184928154]], [["ShearY", 0.7069449324510433, 0.07262757954730437], ["Cutout", 0.6298690227159313, 0.8866813664859028]], [["ShearX", 0.8153137620199989, 0.8478194179953927], ["ShearX", 0.7519451353411938, 0.3914579556959725]], [["Cutout", 0.07152574469472753, 0.2629935229222503], ["TranslateX", 0.43728405510089485, 0.2610201002449789]], [["AutoContrast", 0.5824529633013098, 0.5619551536261955], ["Rotate", 0.45434137552116965, 0.7567169855140041]], [["TranslateY", 0.9338431187142137, 0.14230481341042783], ["Cutout", 0.744797723251028, 0.4346601666787713]], [["ShearX", 0.3197252560289169, 0.8770408070016171], ["Color", 0.7657013088540465, 0.2685586719812284]], [["ShearY", 0.6542181749801549, 0.8148188744344297], ["Sharpness", 0.5108985661436543, 0.9926016115463769]], [["ShearY", 0.39218730620135694, 0.857769946478945], ["Color", 0.39588355914920886, 0.9910530523789284]], [["Invert", 0.4993610396803735, 0.08449723470758526], ["TranslateX", 0.46267456928508305, 0.46691125646493964]], [["Equalize", 0.8640576819821256, 0.3973808869887604], ["ShearY", 0.5491163877063172, 0.422429328786161]], [["Contrast", 0.6146206387722841, 0.8453559854684094], ["TranslateX", 0.7974333014574718, 0.47395476786951773]], [["Contrast", 0.6828704722015236, 0.6952755697785722], ["Brightness", 0.7903069452567497, 0.8350915035109574]], [["Rotate", 0.1211091761531299, 0.9667702562228727], ["Color", 0.47888534537103344, 0.8298620028065332]], [["Equalize", 0.20009722872711086, 0.21851235854853018], ["Invert", 0.4433641154198673, 0.41902203581091935]], [["AutoContrast", 0.6333190204577053, 0.23965630032835372], ["Color", 0.38651217030044804, 0.06447323778198723]], [["Brightness", 0.378274337541471, 0.5482593116308322], ["Cutout", 0.4856574442608347, 0.8889688535495244]], [["Rotate", 0.8201259323479384, 0.7404525573938633], ["Color", 0.28371236449364595, 0.7866003515933161]], [["Brightness", 0.10053196350009105, 0.18814037089411267], ["Sharpness", 0.5572102497672569, 0.04458217557977126]], [["AutoContrast", 0.6445330112376135, 0.48082049184921843], ["TranslateY", 0.378898917914949, 0.9338102625289362]], [["AutoContrast", 0.08482623401924708, 0.25199930695784384], ["Solarize", 0.5981823550521426, 0.19626357596662092]], [["Solarize", 0.4373030803918095, 0.22907881245285625], ["AutoContrast", 0.6383084635487905, 0.29517603235993883]], [["AutoContrast", 0.922112624726991, 0.29398098144910145], ["AutoContrast", 0.8550184811514672, 0.8030331582292343]], [["ShearX", 0.38761582800913896, 0.06304125015084923], ["Contrast", 0.3225758804984975, 0.7089696696094797]], [["TranslateY", 0.27499498563849206, 0.1917583097241206], ["Color", 0.5845853711746438, 0.5353520071667661]], [["ShearY", 0.530881951424285, 0.47961248148116453], ["ShearX", 0.04666387744533289, 0.275772822690165]], [["Solarize", 0.5727309318844802, 0.02889734544563341], ["AutoContrast", 0.638852434854615, 0.9819440776921611]], [["AutoContrast", 0.9766868312173507, 0.9651796447738792], ["AutoContrast", 0.3489760216898085, 0.3082182741354106]], [["Sharpness", 0.13693510871346704, 0.08297205456926067], ["Contrast", 0.3155812019005854, 0.031402991638917896]], [["TranslateY", 0.2664707540547008, 0.4838091910041236], ["ShearX", 0.5935665395229432, 0.7813088248538167]], [["ShearY", 0.7578577752251343, 0.5116014090216161], ["ShearX", 0.8332831240873545, 0.26781876290841017]], [["TranslateY", 0.473254381651761, 0.4203181582821155], ["ShearY", 0.732848696900726, 0.47895514793728433]], [["Solarize", 0.6922689176672292, 0.36403255869823725], ["AutoContrast", 0.910654040826914, 0.888651414068326]], [["ShearX", 0.37326536936166244, 0.47830923320699525], ["Equalize", 0.4724702976076929, 0.8176108279939023]], [["Contrast", 0.3839906424759326, 0.09109695563933692], ["Invert", 0.36305435543972325, 0.5701589223795499]], [["Invert", 0.5175591137387999, 0.38815675919253867], ["TranslateY", 0.1354848160153554, 0.41734106283245065]], [["Color", 0.829616006981199, 0.18631472346156963], ["Color", 0.2465115448326214, 0.9439365672808333]], [["Contrast", 0.18207939197942158, 0.39841173152850873], ["ShearX", 0.16723588254695632, 0.2868649619006758]], [["Posterize", 0.1941909136988733, 0.6322499882557473], ["Contrast", 0.6109060391509794, 0.27329598688783296]], [["AutoContrast", 0.9148775146158022, 0.09129288311923844], ["Sharpness", 0.4222442287436423, 0.847961820057229]], [["Color", 0.21084007475489852, 0.008218056412554131], ["Contrast", 0.43996934555301637, 0.500680146508504]], [["ShearY", 0.6745287915240038, 0.6120305524405164], ["Equalize", 0.467403794543269, 0.2207148995882467]], [["Color", 0.7712823974371379, 0.2839161885566902], ["Color", 0.8725368489709752, 0.3349470222415115]], [["Solarize", 0.5563976601161562, 0.540446614847802], ["Invert", 0.14228071175107454, 0.2242332811481905]], [["Contrast", 0.34596757983998383, 0.9158971503395041], ["Cutout", 0.6823724203724072, 0.5221518922863516]], [["Posterize", 0.3275475232882672, 0.6520033254468702], ["Color", 0.7434224109271398, 0.0824308188060544]], [["Cutout", 0.7295122229650082, 0.277887573018184], ["Brightness", 0.5303655506515258, 0.28628046739964497]], [["Color", 0.8533293996815943, 0.24909788223027743], ["Color", 0.6915962825167857, 0.33592561040195834]], [["TranslateX", 0.0761441550001345, 0.7043906245420134], ["Equalize", 0.670845297717783, 0.30986063097084215]], [["Contrast", 0.30592723366237995, 0.7365013059287382], ["Color", 0.6173835128817455, 0.6417028717640598]], [["Rotate", 0.05558240682703821, 0.7284722849011761], ["Color", 0.7814801133853666, 0.13335113981884217]], [["ShearY", 0.6521743070190724, 0.6272195913574455], ["Rotate", 0.36278432239870423, 0.2335623679787695]], [["Color", 0.6799351102482663, 0.3850250771244986], ["Brightness", 0.613901077818094, 0.2374900558949702]], [["Color", 0.551451255148252, 0.7284757153447965], ["Solarize", 0.4863815212982878, 0.3857941567681324]], [["Contrast", 0.32516343965159267, 0.689921852601276], ["Cutout", 0.5922142001124506, 0.7709605594115009]], [["Brightness", 0.23760063764495856, 0.6392077018854179], ["Brightness", 0.7288124083714078, 0.4487520490201095]], [["Sharpness", 0.5631112298553713, 0.6803534985114782], ["ShearX", 0.6743791169050775, 0.34039227245151127]], [["AutoContrast", 0.8260911840078349, 0.7705607269534767], ["Rotate", 0.8880749478363638, 0.8182460047684648]], [["ShearY", 0.7037620764408412, 0.5219573160970589], ["Posterize", 0.7186150466761102, 0.6187857686944253]], [["TranslateY", 0.2140494926702246, 0.9104233882669488], ["TranslateX", 0.4096039512896902, 0.9692703030784571]], [["Equalize", 0.5404313549028165, 0.04094078980738014], ["AutoContrast", 0.07870278300673744, 0.841020779977939]], [["ShearY", 0.2684638876128488, 0.5599793678740521], ["Cutout", 0.19537995362704022, 0.2400995206366768]], [["AutoContrast", 0.19366394417090382, 0.4130755503251951], ["Sharpness", 0.11735660606190662, 0.39276612830651914]], [["Cutout", 0.8313266945081518, 0.37171822186374703], ["Contrast", 0.5088549187459019, 0.2956405118511817]], [["Cutout", 0.28375485371479847, 0.37020183949342683], ["Posterize", 0.718761436947423, 0.2278804627251678]], [["ShearY", 0.6625840735667625, 0.5045065697748213], ["Rotate", 0.5175257698523389, 0.39496923901188824]], [["Color", 0.6498154010188212, 0.38674158604408604], ["Brightness", 0.8157804892728057, 0.05660118670560971]], [["Color", 0.5512855420254102, 0.7812054820692542], ["Solarize", 0.8851292984174468, 0.2808951606943277]], [["Contrast", 0.35258433539074363, 0.8085377169629859], ["Cutout", 0.5197965849563265, 0.8657111726930974]], [["Cutout", 0.23650925054419358, 0.746860862983295], ["Brightness", 0.8842190203336139, 0.4389347348156118]], [["Rotate", 0.8651460526861932, 0.0031372441327392753], ["Equalize", 0.3909498933963822, 0.6221687914603954]], [["TranslateX", 0.5793690303540427, 0.37939687327382987], ["Invert", 0.846172545690258, 0.36950442052945853]], [["Invert", 0.5151721602607067, 0.5860134277259832], ["Contrast", 0.6868708526377458, 0.2188104093363727]], [["Contrast", 0.28019632529718025, 0.8403553410328943], ["Cutout", 0.5238340355491738, 0.6948434115725599]], [["Rotate", 0.1592592617684533, 0.5212044951482974], ["Color", 0.42404215473874546, 0.45894052919059103]], [["AutoContrast", 0.21780978427851283, 0.11813011387113281], ["Contrast", 0.14557770349869537, 0.5468616480449002]], [["Cutout", 0.03573873600256905, 0.8747186430368771], ["AutoContrast", 0.4804465018567564, 0.3968185812087325]], [["ShearY", 0.027192162947493492, 0.35923750027515866], ["Sharpness", 0.03207302705814674, 0.25868625346023777]], [["AutoContrast", 0.9111793886013045, 0.33534571661592005], ["ShearY", 0.31365410004768934, 0.37055495208177025]], [["Color", 0.5119732811716222, 0.10635303813092001], ["Solarize", 0.9828759703639677, 0.33302532900783466]], [["Contrast", 0.9652840964645487, 0.9550826002089741], ["ShearY", 0.16934262075572262, 0.35893022906919625]], [["Invert", 0.21526903298837538, 0.5491812432380025], ["TranslateX", 0.27691575128765095, 0.9916365493500338]], [["AutoContrast", 0.7223428288831728, 0.3001506080569529], ["Posterize", 0.28280773693692957, 0.5630226986948541]], [["TranslateY", 0.5334698670580152, 0.4329627064903895], ["Solarize", 0.11621274404555687, 0.38564564358937725]], [["Brightness", 0.9001900081991266, 0.15453762529292236], ["Equalize", 0.6749827304986464, 0.2174408558291521]], [["TranslateY", 0.703293071780793, 0.20371204513522137], ["Invert", 0.7921926919880306, 0.2647654009616249]], [["AutoContrast", 0.32650519442680254, 0.5567514700913352], ["ShearY", 0.7627653627354407, 0.5363510886152073]], [["Rotate", 0.364293676091047, 0.4262321334071656], ["Posterize", 0.7284189361001443, 0.6052618047275847]], [["Contrast", 0.004679138490284229, 0.6985327823420937], ["Posterize", 0.25412559986607497, 0.969098825421215]], [["ShearY", 0.6831738973100172, 0.6916463366962687], ["TranslateY", 0.8744153159733203, 0.3667879549647143]], [["Posterize", 0.39138456188265913, 0.8617909225610128], ["TranslateX", 0.5198303654364824, 0.5518823068009463]], [["Invert", 0.6471155996761706, 0.4793957129423701], ["ShearX", 0.8046274258703997, 0.9711394307595065]], [["Solarize", 0.2442520851809611, 0.5518114414771629], ["Sharpness", 0.02324109511463257, 0.18216585433541427]], [["Cutout", 0.7004457278387007, 0.4904439660213413], ["Contrast", 0.6516622044646659, 0.7324290164242575]], [["Brightness", 0.594212018801632, 0.5624822682300464], ["ShearX", 0.47929863548325596, 0.5610640338380719]], [["TranslateX", 0.20863492063218445, 0.23761872077836552], ["Color", 0.9374148559524687, 0.06390809573246009]], [["AutoContrast", 0.5548946725094693, 0.40547561665765874], ["Equalize", 0.26341425401933344, 0.2763692089379619]], [["Invert", 0.8224614398122034, 0.15547159819315676], ["Rotate", 0.4915912924663281, 0.6995695827608112]], [["Equalize", 0.05752620481520809, 0.80230125774557], ["Rotate", 0.16338857010673558, 0.8066738989167762]], [["ShearY", 0.5437502855505825, 0.252101665309144], ["Contrast", 0.9268450172095902, 0.13437399256747992]], [["TranslateY", 0.6946438457089812, 0.35376889837139813], ["Sharpness", 0.15438234648960253, 0.2668696344562673]], [["Invert", 0.24506516252953542, 0.1939315433476327], ["Sharpness", 0.8921986990130818, 0.21478051316241717]], [["TranslateY", 0.5292829065905086, 0.6896826369723732], ["Invert", 0.4461047865540309, 0.9854416526561315]], [["Posterize", 0.8085062334285464, 0.4538963572040656], ["Brightness", 0.2623572045603854, 0.16723779221170698]], [["Solarize", 0.1618752496191097, 0.6007634864056693], ["TranslateY", 0.07808851801433346, 0.3951252736249746]], [["TranslateX", 0.35426056783145843, 0.8875451782909476], ["Brightness", 0.5537927990151869, 0.3042790536918476]], [["Cutout", 0.9051584028783342, 0.6050507821593669], ["ShearX", 0.31185875057627255, 0.39145181108334876]], [["Brightness", 0.43157388465566776, 0.45511767545129933], ["ShearY", 0.626464342187273, 0.5251031991594401]], [["Contrast", 0.7978520212540166, 0.45088491126800995], ["ShearY", 0.20415027867560143, 0.24369493783350643]], [["ShearX", 0.48152242363853065, 0.001652619381325604], ["Sharpness", 0.6154899720956758, 0.22465778944283568]], [["Posterize", 0.0008092255557418104, 0.8624848793450179], ["Solarize", 0.7580784903978838, 0.4141187863855049]], [["TranslateY", 0.4829597846471378, 0.6077028815706373], ["ShearX", 0.43316420981872894, 0.007119694447608018]], [["Equalize", 0.2914045973615852, 0.6298874433109889], ["Cutout", 0.18663096101056076, 0.20634383363149222]], [["TranslateX", 0.6909947340830737, 0.40843889682671003], ["ShearX", 0.3693105697811625, 0.070573833710386]], [["Rotate", 0.6184027722396339, 0.6483359499288176], ["AutoContrast", 0.8658233903089285, 0.31462524418660626]], [["Brightness", 0.8165837262133947, 0.38138221738335765], ["Contrast", 0.01566790570443702, 0.1250581265407818]], [["Equalize", 0.16745169701901802, 0.9239433721204139], ["ShearY", 0.5535908803004554, 0.35879199699526654]], [["Color", 0.9675880875486578, 0.19745998576077994], ["Posterize", 0.641736196661405, 0.5702363593336868]], [["ShearY", 0.27730895136251943, 0.4730273890919014], ["Posterize", 0.35829530316120517, 0.9040968539551122]], [["Cutout", 0.9989158254302966, 0.3210048366589035], ["Equalize", 0.9226385492886618, 0.21132010337062]], [["Posterize", 0.32861829410989934, 0.7608163668499222], ["TranslateY", 0.528381246453454, 0.6837459631017135]], [["ShearY", 0.6786278797045173, 0.49006792710382946], ["ShearX", 0.7860409944610941, 0.7960317025665418]], [["Solarize", 0.4420731874598513, 0.7163961196254427], ["Sharpness", 0.11927615232343353, 0.3649599343067734]], [["Cutout", 0.4606157449857542, 0.4682141505042986], ["Contrast", 0.8955528913735222, 0.8468556570983498]], [["Brightness", 0.5742349576881501, 0.5633914487991978], ["ShearX", 0.8288987143597276, 0.5937556836469728]], [["Posterize", 0.05362153577922808, 0.40072961361335696], ["Rotate", 0.6681795049585278, 0.5348470042353504]], [["TranslateY", 0.6190833866612555, 0.7338431624993972], ["Color", 0.5352400737236565, 0.1598194251940268]], [["Brightness", 0.9942846465176832, 0.11918348505217388], ["Brightness", 0.0659098729688602, 0.6558077481794591]], [["Equalize", 0.34089122700685126, 0.048940774058585546], ["ShearX", 0.5472987107071652, 0.2965222509150173]], [["Sharpness", 0.3660728361470086, 0.37607120931207433], ["Sharpness", 0.9974987257291261, 0.2483317486035219]], [["Posterize", 0.931283270966942, 0.7525022430475327], ["Cutout", 0.6299208568533524, 0.3313382622423058]], [["Invert", 0.5074998650080915, 0.9722820836624784], ["Solarize", 0.13997049847474802, 0.19340041815763026]], [["AutoContrast", 0.6804950477263457, 0.31675149536227815], ["Solarize", 0.800632422196852, 0.09054278636377117]], [["TranslateY", 0.6886579465517867, 0.549118383513461], ["Brightness", 0.7298771973550124, 0.59421647759784]], [["Equalize", 0.8117050130827859, 0.22494316766261946], ["AutoContrast", 0.5217061631918504, 0.6106946809838144]], [["Equalize", 0.4734718117645248, 0.7746036952254298], ["Posterize", 0.032049205574512685, 0.9681402692267316]], [["Brightness", 0.4724177066851541, 0.7969700024018729], ["Solarize", 0.6930049134926459, 0.3880086567038069]], [["TranslateX", 0.2833979092130342, 0.6873833799104118], ["Rotate", 0.37167767436617366, 0.03249352593350204]], [["Posterize", 0.7080588381354884, 0.03014586990329654], ["Posterize", 0.20883930954891392, 0.1328596635826556]], [["Cutout", 0.1992050307454733, 0.8079881690617468], ["ShearY", 0.3057279570820446, 0.34868823290010564]], [["TranslateY", 0.6204358851346782, 0.24978856155434062], ["ShearX", 0.2403059671388028, 0.6706906799258086]], [["Contrast", 0.5527380063918701, 0.27504242043334765], ["Rotate", 0.37361791978638376, 0.17818567121454373]], [["Cutout", 0.3368229687890997, 0.013512329226772313], ["Contrast", 0.18480406673028238, 0.21653280083721013]], [["AutoContrast", 0.13634047961070397, 0.5322441057075571], ["Posterize", 0.3409948654529233, 0.2562132228604077]], [["Invert", 0.3375636037272626, 0.5417577242453775], ["Sharpness", 0.10271458969925179, 0.5125859420868099]], [["Invert", 0.26465503753231256, 0.7386494688407392], ["AutoContrast", 0.5310106090963371, 0.14699248759273964]], [["Sharpness", 0.8494538270706318, 0.9524607358113082], ["Solarize", 0.21142978953773187, 0.10711867917080763]], [["Equalize", 0.5185117903942263, 0.06342404369282638], ["ShearY", 0.26812877371366156, 0.32386585917978056]], [["TranslateY", 0.42724471339053904, 0.5218262942425845], ["Brightness", 0.7618037699290332, 0.5773256674209075]], [["Solarize", 0.5683461491921462, 0.7988018975591509], ["AutoContrast", 0.21826664523938988, 0.4395073407383595]], [["Posterize", 0.2564295537162734, 0.6778150727248975], ["Equalize", 0.7571361164411801, 0.4281744623444925]], [["Invert", 0.5171620125994946, 0.8719074953677988], ["ShearX", 0.10216776728552601, 0.20888013515457593]], [["Equalize", 0.934033636879294, 0.7724470445507672], ["ShearX", 0.14671590364536757, 0.06500753170863127]], [["Cutout", 0.48433709681747783, 0.8989915985203363], ["ShearY", 0.5161346572684965, 0.3154078452465332]], [["AutoContrast", 0.4337913490682531, 0.8651407398083308], ["AutoContrast", 0.31402168607643444, 0.5001710653814162]], [["Brightness", 0.4805460794016203, 0.8182812769485313], ["Equalize", 0.6811585495672738, 0.25172380097389147]], [["TranslateX", 0.05384872718386273, 0.7854623644701991], ["Color", 0.12583336502656287, 0.08656304042059215]], [["TranslateX", 0.3949348949001942, 0.0668909826131569], ["ShearX", 0.2895255694762277, 0.23998090792480392]], [["TranslateY", 0.3183346601371876, 0.5869865305603826], ["Cutout", 0.38601500458347904, 0.37785641359408184]], [["Sharpness", 0.3676509660134142, 0.6370727445512337], ["Rotate", 0.17589815946040205, 0.912442427082365]], [["Equalize", 0.46427003979798154, 0.7771177715171392], ["Cutout", 0.6622980582423883, 0.47780927252115374]], [["TranslateX", 0.4535588156726688, 0.9548833090146791], ["ShearY", 0.18609208838268262, 0.034329918652624025]], [["Rotate", 0.4896172340987028, 0.4842683413051553], ["Brightness", 0.08416972178617699, 0.2946109607041465]], [["TranslateY", 0.1443363248914217, 0.7352253161146544], ["ShearX", 0.025210952382823004, 0.6249971039957651]], [["Brightness", 0.08771030702840285, 0.5926338109828604], ["Contrast", 0.629121304110493, 0.36114268164347396]], [["Cutout", 0.003318169533990778, 0.984234627407162], ["Color", 0.5656264894233379, 0.9913705503959709]], [["Cutout", 0.17582168928005226, 0.5163176285036686], ["Sharpness", 0.42976684239235224, 0.9936723374147685]], [["Rotate", 0.13343297511611085, 0.730719022391835], ["Cutout", 0.43419793455016154, 0.9802436121876401]], [["ShearX", 0.8761482122895571, 0.11688364945899332], ["Solarize", 0.6071032746712549, 0.9972373138154098]], [["Contrast", 0.2721995133325574, 0.9467839388553563], ["AutoContrast", 0.357368427575824, 0.6530359095247653]], [["Equalize", 0.5334298945812708, 0.7157629957411794], ["Brightness", 0.8885107405370157, 0.2909013041171791]], [["Equalize", 0.4907081744271751, 0.9999203497290372], ["ShearX", 0.0055186544890628575, 0.20501406304441697]], [["Color", 0.4865852751351166, 0.14717278223914915], ["TranslateX", 0.0492335566831905, 0.01654291587484527]], [["Contrast", 0.3753662301521211, 0.866484274102244], ["Color", 0.21148416029328898, 0.37861792266657684]], [["TranslateY", 0.03960047686663052, 0.9948086048192006], ["TranslateX", 0.5802633545422445, 0.7696464344779717]], [["Contrast", 0.6456791961464718, 0.6304663998505495], ["Sharpness", 0.594774521429873, 0.8024138008893688]], [["Equalize", 0.5326123709954759, 0.7361990154971826], ["Invert", 0.5337609996065145, 0.06826577456972233]], [["ShearY", 0.7177596430755101, 0.16672206074906565], ["Equalize", 0.1847132768987843, 0.16186121936769876]], [["ShearY", 0.037342495065949534, 0.7762322168034441], ["Rotate", 0.28731231550023495, 0.4605573565280328]], [["Contrast", 0.6815742688289678, 0.04073638022156048], ["Cutout", 0.20201133153964437, 0.048429819360450654]], [["Color", 0.5295323372448824, 0.8591352159356821], ["Posterize", 0.7743900815037675, 0.8308865010050488]], [["Solarize", 0.9325362059095493, 0.4070769736318192], ["Contrast", 0.09359008071252661, 0.2808191171337515]], [["Sharpness", 0.6413241263332543, 0.5493867784897841], ["Solarize", 0.021951790397463734, 0.1045868634597023]], [["Color", 0.006027943433085061, 0.698043169126901], ["TranslateX", 0.06672167045857719, 0.6096719632236709]], [["TranslateX", 0.42167004878865333, 0.8844171486107537], ["Color", 0.12383835252312375, 0.9559595374068695]], [["Posterize", 0.5382560989047361, 0.6014252438301297], ["Color", 0.26197040526014054, 0.3423981550778665]], [["Cutout", 0.33150268513579584, 0.40828564490879615], ["AutoContrast", 0.6907753092981255, 0.05779246756831708]], [["Equalize", 0.31608006376116865, 0.9958870759781376], ["TranslateY", 0.15842255624921547, 0.5764254535539765]], [["Contrast", 0.19859706438565994, 0.12680764238281503], ["TranslateY", 0.4694115475285127, 0.45831161348904836]], [["TranslateX", 0.18768081492494126, 0.7718605539481094], ["Cutout", 0.2340834739291012, 0.3290460999084155]], [["Posterize", 0.17300123510877463, 0.5276823821218432], ["AutoContrast", 0.5861008799330297, 0.31557924295308126]], [["TranslateX", 0.36140745478517367, 0.4172762477431993], ["Sharpness", 0.6518477061748665, 0.9033991248207786]], [["AutoContrast", 0.1757278990984992, 0.9562490311064124], ["Invert", 0.43712652497757065, 0.26925880337078234]], [["TranslateX", 0.38113274849599377, 0.35742156735271613], ["TranslateY", 0.47708889990018216, 0.7975974044609476]], [["Brightness", 0.39538470887490523, 0.09692156164771923], ["Equalize", 0.876825166573471, 0.0979346217138612]], [["Solarize", 0.07679586061933875, 0.45996163577975313], ["Invert", 0.039726680682847904, 0.23574574397443826]], [["ShearX", 0.9739648414905278, 0.5217986621319772], ["TranslateY", 0.21653455086845896, 0.30415852174016683]], [["TranslateY", 0.26965366633030263, 0.4355259497820251], ["Sharpness", 0.6343493801543757, 0.9337027079656623]], [["Rotate", 0.42301232492240126, 0.07813015342326983], ["AutoContrast", 0.28524730310382906, 0.24127293503900557]], [["Color", 0.826300213905907, 0.008451115447607682], ["Equalize", 0.6770124607838715, 0.2889698349030014]], [["Cutout", 0.3461911530045792, 0.7481322146924341], ["Brightness", 0.1831459184570124, 0.5487074846857195]], [["Brightness", 0.8455429603962046, 0.4838335496721761], ["Cutout", 0.5778222397066808, 0.7789798279724414]], [["Brightness", 0.7859388330361665, 0.5907006126719181], ["Brightness", 0.5299842953874527, 0.008670514958094622]], [["Rotate", 0.9584331504536162, 0.7242692977964363], ["TranslateY", 0.46941406313257866, 0.748911298847083]], [["AutoContrast", 0.5878130357161462, 0.25218818797390996], ["Solarize", 0.815466142337258, 0.20231731395730107]], [["ShearX", 0.15594838773787617, 0.9764784874102524], ["TranslateY", 0.5805369037495945, 0.1412009058745196]], [["Sharpness", 0.7936370935749524, 0.5142489498674206], ["Sharpness", 0.1544307510097193, 0.3678451501088748]], [["TranslateY", 0.29391437860633873, 0.3520843012638746], ["Brightness", 0.5885278199370352, 0.04915265122854349]], [["AutoContrast", 0.3329771519033218, 0.2459852352278583], ["Equalize", 0.8674782697650298, 0.2900192232303214]], [["Cutout", 0.58997726901359, 0.9910393463442352], ["Contrast", 0.09792234559792412, 0.23341828880112486]], [["Cutout", 0.4643317809492098, 0.3224299097542076], ["TranslateY", 0.7998033586490294, 0.27086436352896565]], [["AutoContrast", 0.13138317155414905, 0.3419742927322439], ["TranslateY", 0.05413070060788905, 0.5504283113763994]], [["Posterize", 0.3645493423712921, 0.10684861674653627], ["Color", 0.6343589365592908, 0.9712261380583729]], [["Color", 0.06539862123316142, 0.34370535435837324], ["Equalize", 0.8098077629435421, 0.1272416658849032]], [["Invert", 0.3600258964493429, 0.7455698641930473], ["Color", 0.4118102215241555, 0.4489347750419333]], [["Sharpness", 0.2230673636976691, 0.2240713255305713], ["AutoContrast", 0.5039292091174429, 0.033700713206763835]], [["ShearX", 0.10611028325684749, 0.4235430688519599], ["Brightness", 0.354597328722803, 0.6835155193055997]], [["ShearX", 0.101313662029975, 0.3048854771395032], ["ShearX", 0.39832929626318425, 0.5569152062399838]], [["ShearX", 0.46033087857932264, 0.5976525683159943], ["Color", 0.8117411866929898, 0.22950658046373415]], [["Cutout", 0.04125062306390376, 0.5021647863925347], ["TranslateY", 0.4949139091550513, 0.40234738545601595]], [["TranslateX", 0.9982425877241792, 0.3912268450702254], ["Cutout", 0.8094853705295444, 0.4628037417520003]], [["Contrast", 0.47154787535001147, 0.5116549800625204], ["Invert", 0.4929108509901112, 0.713690694626014]], [["ShearX", 0.3073913369156325, 0.5912409524756753], ["Equalize", 0.5603975982699875, 0.12046838435247365]], [["TranslateY", 0.8622939212850868, 0.057802109037417344], ["Invert", 0.7577173459800602, 0.33727019024447835]], [["Cutout", 0.3646694663986778, 0.6285264075514656], ["Color", 0.5589259087346165, 0.6650676195317845]], [["Invert", 0.8563008117600374, 0.6216056385231019], ["AutoContrast", 0.7575002303510038, 0.6906934785154547]], [["ShearX", 0.4415411885102101, 0.301535484182858], ["TranslateY", 0.779716145113622, 0.5792057745092073]], [["Invert", 0.10736083594024397, 0.10640910911300788], ["Posterize", 0.5923391813408784, 0.5437447559328059]], [["Color", 0.4745215286268124, 0.08046291318852558], ["Rotate", 0.1642897827127771, 0.20754337935267492]], [["Invert", 0.3141086213412405, 0.5865422721808763], ["AutoContrast", 0.7551954144793225, 0.5588044000850431]], [["Equalize", 0.979500405577596, 0.6846916489547885], ["Rotate", 0.11257616752512875, 0.8137724117751907]], [["Equalize", 0.6315666801659133, 0.71548254701219], ["Cutout", 0.38805635642306224, 0.29282906744304604]], [["Posterize", 0.022485702859896456, 0.2794994040845844], ["Color", 0.4554990465860552, 0.5842888808848151]], [["Invert", 0.15787502346886398, 0.5137397924063724], ["TranslateY", 0.487638703473969, 0.6428121360825987]], [["Rotate", 0.20473927977443407, 0.6090899892067203], ["Contrast", 0.3794752343740154, 0.8056548374185936]], [["AutoContrast", 0.35889225269685354, 0.7311496777471619], ["Sharpness", 0.10152796686794396, 0.34768639850633193]], [["Rotate", 0.6298704242033275, 0.09649334401126405], ["Solarize", 0.24713244934163017, 0.4292117526982358]], [["Contrast", 0.9851015107131748, 0.30895068679118054], ["Sharpness", 0.7167845732283787, 0.36269175386392893]], [["Equalize", 0.49699932368219435, 0.21262924430159158], ["Contrast", 0.8497731498354579, 0.672321242252727]], [["ShearX", 0.18955591368056923, 0.47178691165954034], ["Sharpness", 0.17732805705271348, 0.5486957094984023]], [["ShearY", 0.5087926728214892, 0.8236809302978783], ["AutoContrast", 0.9661195881001936, 0.1309360428195535]], [["Rotate", 0.7825835251082691, 0.8292427086033229], ["TranslateX", 0.2034110174253454, 0.4073091408820304]], [["Cutout", 0.33457316681888716, 0.480098511703719], ["Sharpness", 0.8686004956803908, 0.21719357589897192]], [["ShearX", 0.30750577846813, 0.6349236735519613], ["Color", 0.5096781256213182, 0.5367289796478476]], [["Rotate", 0.7881847986981432, 0.846966895144323], ["Posterize", 0.33955649631388407, 0.9484449471562024]], [["Posterize", 0.5154127791998345, 0.8765287012129974], ["Posterize", 0.09621562708431097, 0.42108077474553995]], [["ShearX", 0.5513772653411826, 0.27285892893658015], ["AutoContrast", 0.027608088485522986, 0.1738173285576814]], [["Equalize", 0.7950881609822011, 0.05938388811616446], ["ShearX", 0.7864733097562856, 0.5928584864954718]], [["Equalize", 0.03401947599579436, 0.4936643525799874], ["Solarize", 0.8445332527647407, 0.4695434980914176]], [["AutoContrast", 0.9656295942383031, 0.6330670076537706], ["Brightness", 0.303859679517296, 0.8882002295195086]], [["ShearY", 0.5242765280639856, 0.7977406809732712], ["Rotate", 0.24810823616083127, 0.41392557985700773]], [["Posterize", 0.6824268148168342, 0.21831492475831715], ["ShearY", 0.0008811906288737209, 0.1939566265644924]], [["ShearY", 0.8413370823124643, 0.7075999817793881], ["Brightness", 0.7942266192900009, 0.0384845738170444]], [["ShearY", 0.9003919463843213, 0.5068340457708402], ["AutoContrast", 0.9990937631537938, 0.35323621376481695]], [["Contrast", 0.3266913024108897, 0.5470774782762176], ["Contrast", 0.31235464476196995, 0.5723334696204473]], [["AutoContrast", 0.40137522654585955, 0.4274859892417776], ["Sharpness", 0.6173858127038773, 0.9629236289042568]], [["Sharpness", 0.3728210261025356, 0.7873518787942092], ["Solarize", 0.4319848902062112, 0.799524274852396]], [["Sharpness", 0.009379857090624758, 0.3143858944787348], ["ShearY", 0.20273037650420184, 0.3501104740582885]], [["Color", 0.1837135820716444, 0.5709648984713641], ["Solarize", 0.36312838060628455, 0.3753448575775562]], [["Cutout", 0.3400431457353702, 0.6871688775988243], ["ShearX", 0.42524570507364123, 0.7108865889616602]], [["Sharpness", 0.30703348499729893, 0.885278643437672], ["Cutout", 0.04407034125935705, 0.6821013415071144]], [["Brightness", 0.7164362367177879, 0.3383891625406651], ["Posterize", 0.002136409392137939, 0.5744439712876557]], [["Rotate", 0.757566991428807, 0.41351586654059386], ["TranslateY", 0.6716670812367449, 0.45381701497377025]], [["Color", 0.29554345831738604, 0.5747484938203239], ["Brightness", 0.6495565535422139, 0.38353714282675055]], [["Color", 0.6552239827844064, 0.6396684879350223], ["Rotate", 0.4078437959841622, 0.8229364582618871]], [["ShearX", 0.3325165311431108, 0.99875651917317], ["Cutout", 0.060614087173980605, 0.8655206968462149]], [["ShearY", 0.8591223614020521, 0.47375809606391645], ["ShearY", 0.09964216351993155, 0.7076762087109618]], [["Color", 0.9353968383925787, 0.5171703648813921], ["Cutout", 0.7542267059402566, 0.4591488152776885]], [["ShearX", 0.6832456179177027, 0.6798505733549863], ["Color", 0.7408439718746301, 0.5061967673457707]], [["Equalize", 0.4451729339243929, 0.9242958562575693], ["Posterize", 0.2426742903818478, 0.7914731845374992]], [["Posterize", 0.6241497285503436, 0.6800650930438693], ["Rotate", 0.8212761169895445, 0.42470879405266637]], [["Sharpness", 0.35467334577635123, 0.4150922293649909], ["Color", 0.38988011871489925, 0.08762395748275534]], [["Invert", 0.20231176261188386, 0.34300045056881756], ["Color", 0.6311643386438919, 0.4311911861691113]], [["Contrast", 0.2892223327756343, 0.533349670629816], ["ShearY", 0.6483243327679983, 0.37584367848303185]], [["Contrast", 0.6516401043089397, 0.3801387361685983], ["Contrast", 0.38470661862567795, 0.994720698440467]], [["Contrast", 0.44558087160644655, 0.4234506152228727], ["AutoContrast", 0.30132391715441104, 0.7758068064149011]], [["ShearY", 0.8336612877669443, 0.6961881064757953], ["TranslateX", 0.111182606133131, 0.7138593872015647]], [["Brightness", 0.7252053408816349, 0.6883715819669095], ["Cutout", 0.6664014893052573, 0.5118622737562747]], [["TranslateX", 0.04294623433241698, 0.4737274091618545], ["Solarize", 0.15848056715239178, 0.436678451116009]], [["ShearX", 0.41843604414439584, 0.5571669083243844], ["Solarize", 0.31754187268874345, 0.643294796216908]], [["Cutout", 0.308644829376876, 0.9455913104658791], ["Cutout", 0.04221174396591258, 0.8004389485099825]], [["Invert", 0.7644819805649288, 0.393641460630097], ["Posterize", 0.20832144467525543, 0.6449709932505365]], [["ShearY", 0.60954354330238, 0.45193814135157406], ["Rotate", 0.07564178568434804, 0.5700158941616946]], [["Color", 0.47993653910354905, 0.18770437256254732], ["Equalize", 0.16540989366253533, 0.3295832145751728]], [["Sharpness", 0.773656112445468, 0.899183686347773], ["AutoContrast", 0.6225833171499476, 0.8375805811436356]], [["Brightness", 0.3119630413126101, 0.21694186245727698], ["Cutout", 0.08263220622864997, 0.9910421137289533]], [["TranslateY", 0.5200200210314198, 0.44467464167817444], ["Cutout", 0.3466375681433383, 0.22385957813397142]], [["ShearY", 0.4445374219718209, 0.23917745675733915], ["Equalize", 0.32094329607540717, 0.6286388268054685]], [["Invert", 0.6194633221674505, 0.6219326801360905], ["Color", 0.43219405413154555, 0.5463431710956901]], [["ShearX", 0.5491808798436206, 0.4485147269153593], ["ShearX", 0.9624243432991532, 0.581319457926692]], [["Cutout", 0.8486066390061917, 0.48538785811340557], ["Cutout", 0.15945182827781573, 0.4114259503742423]], [["TranslateX", 0.9845485123667319, 0.7590166645874611], ["Solarize", 0.9920857955871512, 0.33259831689209834]], [["Brightness", 0.3985764491687188, 0.3516086190155328], ["Cutout", 0.13907765098725244, 0.42430309616193995]], [["Color", 0.35877942890428727, 0.363294622757879], ["Equalize", 0.4997709941984466, 0.34475754120666147]], [["Sharpness", 0.5234916035905941, 0.8988480410886609], ["AutoContrast", 0.793554237802939, 0.2575758806963965]], [["Brightness", 0.36998588693418133, 0.24144652775222428], ["Cutout", 0.06610767765334377, 0.9979246311006975]], [["TranslateY", 0.6132425595571164, 0.43952345951359123], ["Cutout", 0.361849532200793, 0.8462247954545264]], [["Posterize", 0.36953849915949677, 0.3144747463577223], ["Equalize", 0.3258985378881982, 0.6314053736452068]], [["TranslateY", 0.35835648104981205, 0.08075066564380576], ["TranslateX", 0.5242389109555177, 0.11959330395816647]], [["ShearX", 0.32773751079554303, 0.9307864751586945], ["Sharpness", 0.006921805496030664, 0.8736511230672348]], [["TranslateY", 0.48202000226401526, 0.7058919195136056], ["ShearY", 0.6998308555145181, 0.21074360071080764]], [["AutoContrast", 0.7615852152325713, 0.24914859158079972], ["Cutout", 0.8270894478252626, 0.5804285538051077]], [["AutoContrast", 0.5391662421077847, 0.5233969710179517], ["Brightness", 0.04205906143049083, 0.382677139318253]], [["Brightness", 0.6904817357054526, 0.9116378156160974], ["Invert", 0.24305250280628815, 0.2384731852843838]], [["TranslateX", 0.2661235046256291, 0.9705982948874188], ["Sharpness", 0.35821873293899625, 0.0030835471296858444]], [["Posterize", 0.39029991982997647, 0.4286238191447004], ["TranslateX", 0.08954883207184736, 0.7263973533121859]], [["Cutout", 0.040284118298638344, 0.0388330236482832], ["Posterize", 0.7807814946471116, 0.5238352731112299]], [["ShearY", 0.43556653451802413, 0.6924037743225071], ["Contrast", 0.001081515338562919, 0.7340363920548519]], [["Sharpness", 0.6966467544442373, 0.10202517317137291], ["Color", 0.18836344735972566, 0.31736252662501935]], [["Contrast", 0.6460000689193517, 0.16242196500430484], ["AutoContrast", 0.6003831047484897, 0.8612141912778188]], [["Brightness", 0.9172874494072921, 0.292364504408795], ["Solarize", 0.344602582555059, 0.7054248176903991]], [["Brightness", 0.020940469451794064, 0.5051042440134866], ["Cutout", 0.569500058123745, 0.9091247933460598]], [["Invert", 0.7367715506799225, 0.636137024500329], ["TranslateY", 0.6186960283294023, 0.37626001619073624]], [["TranslateX", 0.2863246154089121, 0.7454318730628517], ["ShearY", 0.6649909124084395, 0.37639265910774133]], [["Equalize", 0.34603376919062656, 0.9324026002997775], ["Sharpness", 0.8481669261233902, 0.14545759197862507]], [["Contrast", 0.6184370038862784, 0.8074198580702933], ["TranslateX", 0.07036135693949985, 0.46222686847401306]], [["Invert", 0.9304884364616345, 0.26298808050002387], ["Color", 0.8027813156985396, 0.7748486756116594]], [["Posterize", 0.2887993806199106, 0.9576118517235523], ["Contrast", 0.07498577510121784, 0.09131727137211232]], [["Contrast", 0.8110536569461197, 0.051038215841138386], ["Solarize", 0.8799018446258887, 0.25028365826721977]], [["Cutout", 0.006954733791187662, 0.030507696587206496], ["Brightness", 0.45329597160103124, 0.9623148451520953]], [["TranslateX", 0.7436227980344521, 0.45996857241163086], ["Solarize", 0.9682234479355196, 0.70777684485634]], [["Brightness", 0.2080557865889058, 0.025557286020371328], ["AutoContrast", 0.4786039197123853, 0.9271157120589375]], [["Solarize", 0.1822930503108656, 0.8448222682426465], ["ShearX", 0.6221001240196488, 0.207994745014715]], [["Color", 0.27879201870553094, 0.9112278219836276], ["Color", 0.7508664408516654, 0.14885798940641318]], [["ShearX", 0.5496326925552889, 0.7643918760952656], ["AutoContrast", 0.7887459433195374, 0.5993900500657054]], [["ShearY", 0.7182376017241904, 0.7470412126724141], ["Rotate", 0.7644845975844854, 0.38510752407409893]], [["Contrast", 0.7984591239416293, 0.054767400038152704], ["Posterize", 0.7324315466290486, 0.41749946919991243]], [["Contrast", 0.596887781894766, 0.14832691232456097], ["Contrast", 0.05140651977459313, 0.14459348285712803]], [["TranslateX", 0.32766681876233766, 0.5291103977440215], ["Color", 0.6039423443931029, 0.6280077043167083]], [["Invert", 0.5267106136816635, 0.9429838545064784], ["Sharpness", 0.9999053422304087, 0.24764251340211074]], [["Contrast", 0.495767451313242, 0.6744720418896594], ["Brightness", 0.2220993631062378, 0.023842431692152832]], [["Invert", 0.7609399278201697, 0.38010826932678554], ["Color", 0.8454251931688355, 0.5876680099851194]], [["Posterize", 0.24967505238473384, 0.3801835337368412], ["Contrast", 0.15106121477353399, 0.6785384814310887]], [["Invert", 0.49594153211743874, 0.32307787492774986], ["Contrast", 0.46822075688054793, 0.7106858486805577]], [["Sharpness", 0.7204076261101202, 0.5928585438185809], ["Rotate", 0.2922878012111486, 0.2742491027179961]], [["Solarize", 0.2866813728691532, 0.2856363754608978], ["TranslateY", 0.7817609208793659, 0.17156048740523572]], [["Cutout", 0.03345540659323987, 0.30068271036485605], ["ShearY", 0.2556603044234358, 0.32397855468866993]], [["TranslateY", 0.20032231858163152, 0.4577561841994639], ["Cutout", 0.8063563515601337, 0.9224365467344459]], [["TranslateY", 0.27130034613023113, 0.7446375583249849], ["ShearX", 0.8254766023480402, 0.4187078898038131]], [["ShearX", 0.2937536068210411, 0.3864492533047109], ["Contrast", 0.7069611463424469, 0.686695922492015]], [["TranslateX", 0.5869084659063555, 0.7866008068031776], ["Invert", 0.289041613918004, 0.5774431720429087]], [["Posterize", 0.6199250263408456, 0.36010044446077893], ["Color", 0.7216853388297056, 0.18586684958836489]], [["Posterize", 0.16831615585406814, 0.08052519983493259], ["Cutout", 0.7325882891023244, 0.77416439921321]], [["Posterize", 0.3000961100422498, 0.5181759282337892], ["Contrast", 0.40376073196794304, 0.613724714153924]], [["ShearX", 0.32203193464136226, 0.037459860897434916], ["Solarize", 0.961542785512965, 0.5176575408248285]], [["Posterize", 0.8986732529036036, 0.7773257927223327], ["AutoContrast", 0.9765986969928243, 0.2092264330225745]], [["Posterize", 0.7463386563644007, 0.7086671048242543], ["Posterize", 0.6433819807034994, 0.00541136425219968]], [["Contrast", 0.8810746688690078, 0.4821029611474963], ["Invert", 0.5121169325265204, 0.6360694878582249]], [["AutoContrast", 0.457606735372388, 0.6104794570624505], ["Color", 0.0020511991982608124, 0.6488142202778011]], [["Invert", 0.01744463899367027, 0.9799156424364703], ["ShearY", 0.3448213456605478, 0.04437356383800711]], [["Solarize", 0.28511589596283315, 0.283465265528744], ["Rotate", 0.6831807199089897, 0.0617176467316177]], [["Sharpness", 0.329148970281285, 0.398397318402924], ["Color", 0.9125837011914073, 0.4724426676489746]], [["Posterize", 0.05701522811381192, 0.17109014518445975], ["Cutout", 0.785885656821686, 0.39072624694455804]], [["TranslateY", 0.36644251447248277, 0.5818480868136134], ["Equalize", 0.06162286852923926, 0.710929848709861]], [["ShearY", 0.8667124241442813, 0.7556246528256454], ["ShearY", 0.505190335528531, 0.2935701441277698]], [["Brightness", 0.6369570015916268, 0.5131486964430919], ["Color", 0.4887119711633827, 0.9364572089679907]], [["Equalize", 0.06596702627228657, 0.42632445412423303], ["Equalize", 0.583434672187985, 0.045592788478947655]], [["ShearY", 0.12701084021549092, 0.501622939075192], ["Cutout", 0.7948319202684251, 0.5662618207034569]], [["Posterize", 0.24586808377061664, 0.5178008194277262], ["Contrast", 0.1647040530405073, 0.7459410952796975]], [["Solarize", 0.346601298126444, 0.02933266448415553], ["ShearY", 0.9571781647031095, 0.4992610484566735]], [["Brightness", 0.5174960605130408, 0.4387498174634591], ["AutoContrast", 0.6327403754086753, 0.8279630556620247]], [["Posterize", 0.7591448754183128, 0.6265369743070788], ["Posterize", 0.5030300462943854, 0.00401699185532868]], [["Contrast", 0.02643254602183477, 0.44677741300429646], ["Invert", 0.2921779546234399, 0.732876182854368]], [["TranslateY", 0.3516821152310867, 0.7142224211142528], ["Brightness", 0.07382104862245475, 0.45368581543623165]], [["Invert", 0.21382474908836685, 0.8413922690356168], ["Invert", 0.4082563426777157, 0.17018243778787834]], [["Brightness", 0.9533955059573749, 0.8279651051553477], ["Cutout", 0.6730769221406385, 0.07780554260470988]], [["Brightness", 0.6022173063382547, 0.6008500678386571], ["Sharpness", 0.5051909719558138, 0.002298383273851839]], [["Contrast", 0.03373395758348563, 0.3343918835437655], ["Sharpness", 0.8933651164916847, 0.21738300404986516]], [["TranslateX", 0.7095755408419822, 0.26445508146225394], ["Equalize", 0.18255527363432034, 0.38857557766574147]], [["Solarize", 0.4045911117686074, 0.009106925727519921], ["Posterize", 0.9380296936271705, 0.5485821516085955]], [["Posterize", 0.20361995432403968, 0.45378735898242406], ["AutoContrast", 0.9020357653982511, 0.7880592087609304]], [["AutoContrast", 0.9921550787672145, 0.7396130723399785], ["Cutout", 0.4203609896071977, 0.13000504717682415]], [["Equalize", 0.1917806394805356, 0.5549114911941102], ["Posterize", 0.27636900597148506, 0.02953514963949344]], [["AutoContrast", 0.5427071893197213, 0.6650127340685553], ["Color", 0.011762461060904839, 0.3793508738225649]], [["Invert", 0.18495006059896424, 0.8561476625981166], ["ShearY", 0.6417068692813954, 0.9908751019535517]], [["Solarize", 0.2992385431633619, 0.33622162977907644], ["Rotate", 0.6070550252540432, 0.010205544695142064]], [["Sharpness", 0.33292787606841845, 0.549446566149951], ["Color", 0.9097665730481233, 0.9947658451503181]], [["Posterize", 0.11207465085954937, 0.23296263754645155], ["Cutout", 0.6159972426858633, 0.38289684517298556]], [["TranslateX", 0.7343689718523805, 0.16303049089087485], ["Equalize", 0.3138385390145809, 0.6096356352129273]], [["Solarize", 0.4807269891506887, 0.28116279654856363], ["Posterize", 0.9753467973380021, 0.6327025372916857]], [["Posterize", 0.837244997106023, 0.5586046483574153], ["AutoContrast", 0.9005775602024721, 0.7983389828641411]], [["AutoContrast", 0.8347112949943837, 0.7321850307727004], ["Cutout", 0.3322676575657192, 0.14409873524237032]], [["Equalize", 0.12285967262649124, 0.5368519477089722], ["Posterize", 0.2693593445898034, 0.15098267759162076]], [["Invert", 0.331021587020619, 0.3140868578915853], ["Cutout", 0.48268387543799884, 0.7642598986625201]], [["Equalize", 0.47573794714622175, 0.8628185952549363], ["Solarize", 0.14860046214144496, 0.3739284346347912]], [["AutoContrast", 0.6747373196190459, 0.2912917979635714], ["Posterize", 0.27259573208358623, 0.9643671211873469]], [["Sharpness", 0.15019788105901233, 0.7289238028242861], ["ShearY", 0.7998448015985137, 0.5924798900807636]], [["Brightness", 0.7874052186079156, 0.9446398428550358], ["Equalize", 0.5105557539139616, 0.6719808885741001]], [["ShearX", 0.783252331899515, 0.74960184771181], ["ShearX", 0.4327935527932927, 0.29980994764698565]], [["Rotate", 0.03892023906368644, 0.24868635699639904], ["Cutout", 0.6408903979315637, 0.32135851733523907]], [["Invert", 0.9972802027590713, 0.9374194642823106], ["ShearX", 0.20016463162924894, 0.0052278586143255645]], [["AutoContrast", 0.9328687102578992, 0.44280614999256235], ["Color", 0.05637751621265141, 0.26921974769786455]], [["AutoContrast", 0.2798532308065416, 0.5283914274806746], ["Cutout", 0.12930089032151, 0.25624459046884057]], [["Invert", 0.2397428994839993, 0.31011715409282065], ["Cutout", 0.5875151915473042, 0.7454458580264322]], [["Equalize", 0.374815667651982, 0.9502053862625081], ["Solarize", 0.10100323698574426, 0.5124939317648691]], [["AutoContrast", 0.6009889057852652, 0.3080148907275367], ["Posterize", 0.6543352447742621, 0.17498668744492413]], [["Sharpness", 0.14402909409016001, 0.9239239955843186], ["ShearY", 0.8959818090635513, 0.7258262803413784]], [["Brightness", 0.8672271320432974, 0.8241439816189235], ["Equalize", 0.4954433852960082, 0.6687050430971254]], [["Solarize", 0.47813402689782114, 0.9447222576804901], ["TranslateY", 0.32546974113401694, 0.8367777573080345]], [["Sharpness", 0.48098022972519927, 0.2731904819197933], ["Rotate", 0.14601550238940067, 0.3955290089346866]], [["AutoContrast", 0.3777442613874327, 0.9991495158709968], ["TranslateY", 0.2951496731751222, 0.6276755696126608]], [["Cutout", 0.487150344941835, 0.7976642551725155], ["Solarize", 0.643407733524025, 0.6313641977306543]], [["Rotate", 0.35017053741686033, 0.23960877779589906], ["Sharpness", 0.8741761196478873, 0.12362019972427862]], [["Invert", 0.8849459784626776, 0.48532144354199647], ["Invert", 0.702430443380318, 0.924655906426149]], [["Equalize", 0.6324140359298986, 0.9780539325897597], ["AutoContrast", 0.39105074227907843, 0.3636856607173081]], [["AutoContrast", 0.8049993541952016, 0.3231157206314408], ["ShearY", 0.6675686366141409, 0.7345332792455934]], [["Sharpness", 0.12332351413693327, 0.9345179453120547], ["Solarize", 0.1594280186083361, 0.422049311332906]], [["Rotate", 0.38227253679386375, 0.7664364038099101], ["AutoContrast", 0.5725492572719726, 0.21049701651094446]], [["Brightness", 0.6432891832524184, 0.8243948738979008], ["Equalize", 0.20355899618080098, 0.7983877568044979]], [["ShearY", 0.694393675204811, 0.3686964692262895], ["TranslateX", 0.5593122846101599, 0.3378904046390629]], [["Invert", 0.9139730140623171, 0.7183505086140822], ["Posterize", 0.2675839177893596, 0.21399738931234905]], [["TranslateX", 0.05309461965184896, 0.032983777975422554], ["Sharpness", 0.412621944330688, 0.4752089612268503]], [["Equalize", 0.06901149860261116, 0.27405796188385945], ["AutoContrast", 0.7710451977604326, 0.20474249114426807]], [["ShearX", 0.47416427531072325, 0.2738614239087857], ["Cutout", 0.2820106413231565, 0.6295219975308107]], [["Cutout", 0.19984489885141582, 0.7019895950299546], ["ShearX", 0.4264722378410729, 0.8483962467724536]], [["ShearY", 0.42111446850243256, 0.1837626718066795], ["Brightness", 0.9187856196205942, 0.07478292286531767]], [["Solarize", 0.2832036589192868, 0.8253473638854684], ["Cutout", 0.7279303826662196, 0.615420010694839]], [["ShearX", 0.963251873356884, 0.5625577053738846], ["Color", 0.9637046840298858, 0.9992644813427337]], [["Invert", 0.7976502716811696, 0.43330238739921956], ["ShearY", 0.9113181667853614, 0.9066729024232627]], [["Posterize", 0.5750620807485399, 0.7729691927432935], ["Contrast", 0.4527879467651071, 0.9647739595774402]], [["Posterize", 0.5918751472569104, 0.26467375535556653], ["Posterize", 0.6347402742279589, 0.7476940787143674]], [["Invert", 0.16552404612306285, 0.9829939598708993], ["Solarize", 0.29886553921638087, 0.22487098773064948]], [["Cutout", 0.24209211313246753, 0.5522928952260516], ["AutoContrast", 0.6212831649673523, 0.4191071063984261]], [["ShearX", 0.4726406722647257, 0.26783614257572447], ["TranslateY", 0.251078162624763, 0.26103450676044304]], [["Cutout", 0.8721775527314426, 0.6284108541347894], ["ShearX", 0.7063325779145683, 0.8467168866724094]], [["ShearY", 0.42226987564279606, 0.18012694533480308], ["Brightness", 0.858499853702629, 0.4738929353785444]], [["Solarize", 0.30039851082582764, 0.8151511479162529], ["Cutout", 0.7228873804059033, 0.6174351379837011]], [["ShearX", 0.4921198221896609, 0.5678998037958154], ["Color", 0.7865298825314806, 0.9309020966406338]], [["Invert", 0.8077821007916464, 0.7375015762124386], ["Cutout", 0.032464574567796195, 0.25405044477004846]], [["Color", 0.6061325441870133, 0.2813794250571565], ["TranslateY", 0.5882949270385848, 0.33262043078220227]], [["ShearX", 0.7877331864215293, 0.8001131937448647], ["Cutout", 0.19828215489868783, 0.5949317580743655]], [["Contrast", 0.529508728421701, 0.36477855845285007], ["Color", 0.7145481740509138, 0.2950794787786947]], [["Contrast", 0.9932891064746089, 0.46930062926732646], ["Posterize", 0.9033014136780437, 0.5745902253320527]]] return p def policy_decoder(augment, num_policy, num_op): op_list = augment_list(False) policies = [] for i in range(num_policy): ops = [] for j in range(num_op): op_idx = augment['policy_%d_%d' % (i, j)] op_prob = augment['prob_%d_%d' % (i, j)] op_level = augment['level_%d_%d' % (i, j)] ops.append((op_list[op_idx][0].__name__, op_prob, op_level)) policies.append(ops) return policies ================================================ FILE: fast_autoaugment/FastAutoAugment/aug_mixup.py ================================================ """ Reference : - https://github.com/hysts/pytorch_image_classification/blob/master/augmentations/mixup.py - https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/imagenet_input.py#L120 """ import numpy as np import torch from FastAutoAugment.metrics import CrossEntropyLabelSmooth def mixup(data, targets, alpha): indices = torch.randperm(data.size(0)) shuffled_data = data[indices] shuffled_targets = targets[indices] lam = np.random.beta(alpha, alpha) lam = max(lam, 1. - lam) assert 0.0 <= lam <= 1.0, lam data = data * lam + shuffled_data * (1 - lam) return data, targets, shuffled_targets, lam class CrossEntropyMixUpLabelSmooth(torch.nn.Module): def __init__(self, num_classes, epsilon, reduction='mean'): super(CrossEntropyMixUpLabelSmooth, self).__init__() self.ce = CrossEntropyLabelSmooth(num_classes, epsilon, reduction=reduction) def forward(self, input, target1, target2, lam): # pylint: disable=redefined-builtin return lam * self.ce(input, target1) + (1 - lam) * self.ce(input, target2) ================================================ FILE: fast_autoaugment/FastAutoAugment/augmentations.py ================================================ # code in this file is adpated from rpmcruz/autoaugment # https://github.com/rpmcruz/autoaugment/blob/master/transformations.py import random import PIL, PIL.ImageOps, PIL.ImageEnhance, PIL.ImageDraw import numpy as np import torch from torchvision.transforms.transforms import Compose random_mirror = True def ShearX(img, v): # [-0.3, 0.3] assert -0.3 <= v <= 0.3 if random_mirror and random.random() > 0.5: v = -v return img.transform(img.size, PIL.Image.AFFINE, (1, v, 0, 0, 1, 0)) def ShearY(img, v): # [-0.3, 0.3] assert -0.3 <= v <= 0.3 if random_mirror and random.random() > 0.5: v = -v return img.transform(img.size, PIL.Image.AFFINE, (1, 0, 0, v, 1, 0)) def TranslateX(img, v): # [-150, 150] => percentage: [-0.45, 0.45] assert -0.45 <= v <= 0.45 if random_mirror and random.random() > 0.5: v = -v v = v * img.size[0] return img.transform(img.size, PIL.Image.AFFINE, (1, 0, v, 0, 1, 0)) def TranslateY(img, v): # [-150, 150] => percentage: [-0.45, 0.45] assert -0.45 <= v <= 0.45 if random_mirror and random.random() > 0.5: v = -v v = v * img.size[1] return img.transform(img.size, PIL.Image.AFFINE, (1, 0, 0, 0, 1, v)) def TranslateXAbs(img, v): # [-150, 150] => percentage: [-0.45, 0.45] assert 0 <= v <= 10 if random.random() > 0.5: v = -v return img.transform(img.size, PIL.Image.AFFINE, (1, 0, v, 0, 1, 0)) def TranslateYAbs(img, v): # [-150, 150] => percentage: [-0.45, 0.45] assert 0 <= v <= 10 if random.random() > 0.5: v = -v return img.transform(img.size, PIL.Image.AFFINE, (1, 0, 0, 0, 1, v)) def Rotate(img, v): # [-30, 30] assert -30 <= v <= 30 if random_mirror and random.random() > 0.5: v = -v return img.rotate(v) def AutoContrast(img, _): return PIL.ImageOps.autocontrast(img) def Invert(img, _): return PIL.ImageOps.invert(img) def Equalize(img, _): return PIL.ImageOps.equalize(img) def Flip(img, _): # not from the paper return PIL.ImageOps.mirror(img) def Solarize(img, v): # [0, 256] assert 0 <= v <= 256 return PIL.ImageOps.solarize(img, v) def Posterize(img, v): # [4, 8] assert 4 <= v <= 8 v = int(v) return PIL.ImageOps.posterize(img, v) def Posterize2(img, v): # [0, 4] assert 0 <= v <= 4 v = int(v) return PIL.ImageOps.posterize(img, v) def Contrast(img, v): # [0.1,1.9] assert 0.1 <= v <= 1.9 return PIL.ImageEnhance.Contrast(img).enhance(v) def Color(img, v): # [0.1,1.9] assert 0.1 <= v <= 1.9 return PIL.ImageEnhance.Color(img).enhance(v) def Brightness(img, v): # [0.1,1.9] assert 0.1 <= v <= 1.9 return PIL.ImageEnhance.Brightness(img).enhance(v) def Sharpness(img, v): # [0.1,1.9] assert 0.1 <= v <= 1.9 return PIL.ImageEnhance.Sharpness(img).enhance(v) def Cutout(img, v): # [0, 60] => percentage: [0, 0.2] assert 0.0 <= v <= 0.2 if v <= 0.: return img v = v * img.size[0] return CutoutAbs(img, v) def CutoutAbs(img, v): # [0, 60] => percentage: [0, 0.2] # assert 0 <= v <= 20 if v < 0: return img w, h = img.size x0 = np.random.uniform(w) y0 = np.random.uniform(h) x0 = int(max(0, x0 - v / 2.)) y0 = int(max(0, y0 - v / 2.)) x1 = min(w, x0 + v) y1 = min(h, y0 + v) xy = (x0, y0, x1, y1) color = (125, 123, 114) # color = (0, 0, 0) img = img.copy() PIL.ImageDraw.Draw(img).rectangle(xy, color) return img def SamplePairing(imgs): # [0, 0.4] def f(img1, v): i = np.random.choice(len(imgs)) img2 = PIL.Image.fromarray(imgs[i]) return PIL.Image.blend(img1, img2, v) return f def augment_list(for_autoaug=True): # 16 oeprations and their ranges l = [ (ShearX, -0.3, 0.3), # 0 (ShearY, -0.3, 0.3), # 1 (TranslateX, -0.45, 0.45), # 2 (TranslateY, -0.45, 0.45), # 3 (Rotate, -30, 30), # 4 (AutoContrast, 0, 1), # 5 (Invert, 0, 1), # 6 (Equalize, 0, 1), # 7 (Solarize, 0, 256), # 8 (Posterize, 4, 8), # 9 (Contrast, 0.1, 1.9), # 10 (Color, 0.1, 1.9), # 11 (Brightness, 0.1, 1.9), # 12 (Sharpness, 0.1, 1.9), # 13 (Cutout, 0, 0.2), # 14 # (SamplePairing(imgs), 0, 0.4), # 15 ] if for_autoaug: l += [ (CutoutAbs, 0, 20), # compatible with auto-augment (Posterize2, 0, 4), # 9 (TranslateXAbs, 0, 10), # 9 (TranslateYAbs, 0, 10), # 9 ] return l augment_dict = {fn.__name__: (fn, v1, v2) for fn, v1, v2 in augment_list()} def get_augment(name): return augment_dict[name] def apply_augment(img, name, level): augment_fn, low, high = get_augment(name) return augment_fn(img.copy(), level * (high - low) + low) class Lighting(object): """Lighting noise(AlexNet - style PCA - based noise)""" def __init__(self, alphastd, eigval, eigvec): self.alphastd = alphastd self.eigval = torch.Tensor(eigval) self.eigvec = torch.Tensor(eigvec) def __call__(self, img): if self.alphastd == 0: return img alpha = img.new().resize_(3).normal_(0, self.alphastd) rgb = self.eigvec.type_as(img).clone() \ .mul(alpha.view(1, 3).expand(3, 3)) \ .mul(self.eigval.view(1, 3).expand(3, 3)) \ .sum(1).squeeze() return img.add(rgb.view(3, 1, 1).expand_as(img)) ================================================ FILE: fast_autoaugment/FastAutoAugment/common.py ================================================ import copy import logging import warnings formatter = logging.Formatter('[%(asctime)s] [%(name)s] [%(levelname)s] %(message)s') warnings.filterwarnings("ignore", "(Possibly )?corrupt EXIF data", UserWarning) warnings.filterwarnings("ignore", "DeprecationWarning: 'saved_variables' is deprecated", UserWarning) def get_logger(name, level=logging.DEBUG): logger = logging.getLogger(name) logger.handlers.clear() logger.setLevel(level) ch = logging.StreamHandler() ch.setLevel(level) ch.setFormatter(formatter) logger.addHandler(ch) return logger def add_filehandler(logger, filepath, level=logging.DEBUG): fh = logging.FileHandler(filepath) fh.setLevel(level) fh.setFormatter(formatter) logger.addHandler(fh) class EMA: def __init__(self, mu): self.mu = mu self.shadow = {} def state_dict(self): return copy.deepcopy(self.shadow) def __len__(self): return len(self.shadow) def __call__(self, module, step=None): if step is None: mu = self.mu else: # see : https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/train/ExponentialMovingAverage?hl=PL mu = min(self.mu, (1. + step) / (10 + step)) for name, x in module.state_dict().items(): if name in self.shadow: new_average = (1.0 - mu) * x + mu * self.shadow[name] self.shadow[name] = new_average.clone() else: self.shadow[name] = x.clone() ================================================ FILE: fast_autoaugment/FastAutoAugment/data.py ================================================ import logging import numpy as np import os import math import random import torch import torchvision from PIL import Image from torch.utils.data import SubsetRandomSampler, Sampler, Subset, ConcatDataset import torch.distributed as dist from torchvision.transforms import transforms from sklearn.model_selection import StratifiedShuffleSplit from theconf import Config as C from FastAutoAugment.archive import arsaug_policy, autoaug_policy, autoaug_paper_cifar10, fa_reduced_cifar10, fa_reduced_svhn, fa_resnet50_rimagenet from FastAutoAugment.augmentations import * from FastAutoAugment.common import get_logger from FastAutoAugment.imagenet import ImageNet from FastAutoAugment.networks.efficientnet_pytorch.model import EfficientNet logger = get_logger('Fast AutoAugment') logger.setLevel(logging.INFO) _IMAGENET_PCA = { 'eigval': [0.2175, 0.0188, 0.0045], 'eigvec': [ [-0.5675, 0.7192, 0.4009], [-0.5808, -0.0045, -0.8140], [-0.5836, -0.6948, 0.4203], ] } _CIFAR_MEAN, _CIFAR_STD = (0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010) def get_dataloaders(dataset, batch, dataroot, split=0.15, split_idx=0, multinode=False, target_lb=-1): if 'cifar' in dataset or 'svhn' in dataset: transform_train = transforms.Compose([ transforms.RandomCrop(32, padding=4), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize(_CIFAR_MEAN, _CIFAR_STD), ]) transform_test = transforms.Compose([ transforms.ToTensor(), transforms.Normalize(_CIFAR_MEAN, _CIFAR_STD), ]) elif 'imagenet' in dataset: input_size = 224 sized_size = 256 if 'efficientnet' in C.get()['model']['type']: input_size = EfficientNet.get_image_size(C.get()['model']['type']) sized_size = input_size + 32 # TODO # sized_size = int(round(input_size / 224. * 256)) # sized_size = input_size logger.info('size changed to %d/%d.' % (input_size, sized_size)) transform_train = transforms.Compose([ EfficientNetRandomCrop(input_size), transforms.Resize((input_size, input_size), interpolation=Image.BICUBIC), # transforms.RandomResizedCrop(input_size, scale=(0.1, 1.0), interpolation=Image.BICUBIC), transforms.RandomHorizontalFlip(), transforms.ColorJitter( brightness=0.4, contrast=0.4, saturation=0.4, ), transforms.ToTensor(), Lighting(0.1, _IMAGENET_PCA['eigval'], _IMAGENET_PCA['eigvec']), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) transform_test = transforms.Compose([ EfficientNetCenterCrop(input_size), transforms.Resize((input_size, input_size), interpolation=Image.BICUBIC), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) else: raise ValueError('dataset=%s' % dataset) total_aug = augs = None if isinstance(C.get()['aug'], list): logger.debug('augmentation provided.') transform_train.transforms.insert(0, Augmentation(C.get()['aug'])) else: logger.debug('augmentation: %s' % C.get()['aug']) if C.get()['aug'] == 'fa_reduced_cifar10': transform_train.transforms.insert(0, Augmentation(fa_reduced_cifar10())) elif C.get()['aug'] == 'fa_reduced_imagenet': transform_train.transforms.insert(0, Augmentation(fa_resnet50_rimagenet())) elif C.get()['aug'] == 'fa_reduced_svhn': transform_train.transforms.insert(0, Augmentation(fa_reduced_svhn())) elif C.get()['aug'] == 'arsaug': transform_train.transforms.insert(0, Augmentation(arsaug_policy())) elif C.get()['aug'] == 'autoaug_cifar10': transform_train.transforms.insert(0, Augmentation(autoaug_paper_cifar10())) elif C.get()['aug'] == 'autoaug_extend': transform_train.transforms.insert(0, Augmentation(autoaug_policy())) elif C.get()['aug'] in ['default']: pass else: raise ValueError('not found augmentations. %s' % C.get()['aug']) if C.get()['cutout'] > 0: transform_train.transforms.append(CutoutDefault(C.get()['cutout'])) if dataset == 'cifar10': total_trainset = torchvision.datasets.CIFAR10(root=dataroot, train=True, download=True, transform=transform_train) testset = torchvision.datasets.CIFAR10(root=dataroot, train=False, download=True, transform=transform_test) elif dataset == 'reduced_cifar10': total_trainset = torchvision.datasets.CIFAR10(root=dataroot, train=True, download=True, transform=transform_train) sss = StratifiedShuffleSplit(n_splits=1, test_size=46000, random_state=0) # 4000 trainset sss = sss.split(list(range(len(total_trainset))), total_trainset.targets) train_idx, valid_idx = next(sss) targets = [total_trainset.targets[idx] for idx in train_idx] total_trainset = Subset(total_trainset, train_idx) total_trainset.targets = targets testset = torchvision.datasets.CIFAR10(root=dataroot, train=False, download=True, transform=transform_test) elif dataset == 'cifar100': total_trainset = torchvision.datasets.CIFAR100(root=dataroot, train=True, download=True, transform=transform_train) testset = torchvision.datasets.CIFAR100(root=dataroot, train=False, download=True, transform=transform_test) elif dataset == 'svhn': trainset = torchvision.datasets.SVHN(root=dataroot, split='train', download=True, transform=transform_train) extraset = torchvision.datasets.SVHN(root=dataroot, split='extra', download=True, transform=transform_train) total_trainset = ConcatDataset([trainset, extraset]) testset = torchvision.datasets.SVHN(root=dataroot, split='test', download=True, transform=transform_test) elif dataset == 'reduced_svhn': total_trainset = torchvision.datasets.SVHN(root=dataroot, split='train', download=True, transform=transform_train) sss = StratifiedShuffleSplit(n_splits=1, test_size=73257-1000, random_state=0) # 1000 trainset sss = sss.split(list(range(len(total_trainset))), total_trainset.targets) train_idx, valid_idx = next(sss) targets = [total_trainset.targets[idx] for idx in train_idx] total_trainset = Subset(total_trainset, train_idx) total_trainset.targets = targets testset = torchvision.datasets.SVHN(root=dataroot, split='test', download=True, transform=transform_test) elif dataset == 'imagenet': total_trainset = ImageNet(root=os.path.join(dataroot, 'imagenet-pytorch'), transform=transform_train) testset = ImageNet(root=os.path.join(dataroot, 'imagenet-pytorch'), split='val', transform=transform_test) # compatibility total_trainset.targets = [lb for _, lb in total_trainset.samples] elif dataset == 'reduced_imagenet': # randomly chosen indices # idx120 = sorted(random.sample(list(range(1000)), k=120)) idx120 = [16, 23, 52, 57, 76, 93, 95, 96, 99, 121, 122, 128, 148, 172, 181, 189, 202, 210, 232, 238, 257, 258, 259, 277, 283, 289, 295, 304, 307, 318, 322, 331, 337, 338, 345, 350, 361, 375, 376, 381, 388, 399, 401, 408, 424, 431, 432, 440, 447, 462, 464, 472, 483, 497, 506, 512, 530, 541, 553, 554, 557, 564, 570, 584, 612, 614, 619, 626, 631, 632, 650, 657, 658, 660, 674, 675, 680, 682, 691, 695, 699, 711, 734, 736, 741, 754, 757, 764, 769, 770, 780, 781, 787, 797, 799, 811, 822, 829, 830, 835, 837, 842, 843, 845, 873, 883, 897, 900, 902, 905, 913, 920, 925, 937, 938, 940, 941, 944, 949, 959] total_trainset = ImageNet(root=os.path.join(dataroot, 'imagenet-pytorch'), transform=transform_train) testset = ImageNet(root=os.path.join(dataroot, 'imagenet-pytorch'), split='val', transform=transform_test) # compatibility total_trainset.targets = [lb for _, lb in total_trainset.samples] sss = StratifiedShuffleSplit(n_splits=1, test_size=len(total_trainset) - 50000, random_state=0) # 4000 trainset sss = sss.split(list(range(len(total_trainset))), total_trainset.targets) train_idx, valid_idx = next(sss) # filter out train_idx = list(filter(lambda x: total_trainset.labels[x] in idx120, train_idx)) valid_idx = list(filter(lambda x: total_trainset.labels[x] in idx120, valid_idx)) test_idx = list(filter(lambda x: testset.samples[x][1] in idx120, range(len(testset)))) targets = [idx120.index(total_trainset.targets[idx]) for idx in train_idx] for idx in range(len(total_trainset.samples)): if total_trainset.samples[idx][1] not in idx120: continue total_trainset.samples[idx] = (total_trainset.samples[idx][0], idx120.index(total_trainset.samples[idx][1])) total_trainset = Subset(total_trainset, train_idx) total_trainset.targets = targets for idx in range(len(testset.samples)): if testset.samples[idx][1] not in idx120: continue testset.samples[idx] = (testset.samples[idx][0], idx120.index(testset.samples[idx][1])) testset = Subset(testset, test_idx) print('reduced_imagenet train=', len(total_trainset)) else: raise ValueError('invalid dataset name=%s' % dataset) if total_aug is not None and augs is not None: total_trainset.set_preaug(augs, total_aug) print('set_preaug-') train_sampler = None if split > 0.0: sss = StratifiedShuffleSplit(n_splits=5, test_size=split, random_state=0) sss = sss.split(list(range(len(total_trainset))), total_trainset.targets) for _ in range(split_idx + 1): train_idx, valid_idx = next(sss) if target_lb >= 0: train_idx = [i for i in train_idx if total_trainset.targets[i] == target_lb] valid_idx = [i for i in valid_idx if total_trainset.targets[i] == target_lb] train_sampler = SubsetRandomSampler(train_idx) valid_sampler = SubsetSampler(valid_idx) if multinode: train_sampler = torch.utils.data.distributed.DistributedSampler(Subset(total_trainset, train_idx), num_replicas=dist.get_world_size(), rank=dist.get_rank()) else: valid_sampler = SubsetSampler([]) if multinode: train_sampler = torch.utils.data.distributed.DistributedSampler(total_trainset, num_replicas=dist.get_world_size(), rank=dist.get_rank()) logger.info(f'----- dataset with DistributedSampler {dist.get_rank()}/{dist.get_world_size()}') trainloader = torch.utils.data.DataLoader( total_trainset, batch_size=batch, shuffle=True if train_sampler is None else False, num_workers=8, pin_memory=True, sampler=train_sampler, drop_last=True) validloader = torch.utils.data.DataLoader( total_trainset, batch_size=batch, shuffle=False, num_workers=4, pin_memory=True, sampler=valid_sampler, drop_last=False) testloader = torch.utils.data.DataLoader( testset, batch_size=batch, shuffle=False, num_workers=8, pin_memory=True, drop_last=False ) return train_sampler, trainloader, validloader, testloader class CutoutDefault(object): """ Reference : https://github.com/quark0/darts/blob/master/cnn/utils.py """ def __init__(self, length): self.length = length def __call__(self, img): h, w = img.size(1), img.size(2) mask = np.ones((h, w), np.float32) y = np.random.randint(h) x = np.random.randint(w) y1 = np.clip(y - self.length // 2, 0, h) y2 = np.clip(y + self.length // 2, 0, h) x1 = np.clip(x - self.length // 2, 0, w) x2 = np.clip(x + self.length // 2, 0, w) mask[y1: y2, x1: x2] = 0. mask = torch.from_numpy(mask) mask = mask.expand_as(img) img *= mask return img class Augmentation(object): def __init__(self, policies): self.policies = policies def __call__(self, img): for _ in range(1): policy = random.choice(self.policies) for name, pr, level in policy: if random.random() > pr: continue img = apply_augment(img, name, level) return img class EfficientNetRandomCrop: def __init__(self, imgsize, min_covered=0.1, aspect_ratio_range=(3./4, 4./3), area_range=(0.08, 1.0), max_attempts=10): assert 0.0 < min_covered assert 0 < aspect_ratio_range[0] <= aspect_ratio_range[1] assert 0 < area_range[0] <= area_range[1] assert 1 <= max_attempts self.min_covered = min_covered self.aspect_ratio_range = aspect_ratio_range self.area_range = area_range self.max_attempts = max_attempts self._fallback = EfficientNetCenterCrop(imgsize) def __call__(self, img): # https://github.com/tensorflow/tensorflow/blob/9274bcebb31322370139467039034f8ff852b004/tensorflow/core/kernels/sample_distorted_bounding_box_op.cc#L111 original_width, original_height = img.size min_area = self.area_range[0] * (original_width * original_height) max_area = self.area_range[1] * (original_width * original_height) for _ in range(self.max_attempts): aspect_ratio = random.uniform(*self.aspect_ratio_range) height = int(round(math.sqrt(min_area / aspect_ratio))) max_height = int(round(math.sqrt(max_area / aspect_ratio))) if max_height * aspect_ratio > original_width: max_height = (original_width + 0.5 - 1e-7) / aspect_ratio max_height = int(max_height) if max_height * aspect_ratio > original_width: max_height -= 1 if max_height > original_height: max_height = original_height if height >= max_height: height = max_height height = int(round(random.uniform(height, max_height))) width = int(round(height * aspect_ratio)) area = width * height if area < min_area or area > max_area: continue if width > original_width or height > original_height: continue if area < self.min_covered * (original_width * original_height): continue if width == original_width and height == original_height: return self._fallback(img) # https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/preprocessing.py#L102 x = random.randint(0, original_width - width) y = random.randint(0, original_height - height) return img.crop((x, y, x + width, y + height)) return self._fallback(img) class EfficientNetCenterCrop: def __init__(self, imgsize): self.imgsize = imgsize def __call__(self, img): """Crop the given PIL Image and resize it to desired size. Args: img (PIL Image): Image to be cropped. (0,0) denotes the top left corner of the image. output_size (sequence or int): (height, width) of the crop box. If int, it is used for both directions Returns: PIL Image: Cropped image. """ image_width, image_height = img.size image_short = min(image_width, image_height) crop_size = float(self.imgsize) / (self.imgsize + 32) * image_short crop_height, crop_width = crop_size, crop_size crop_top = int(round((image_height - crop_height) / 2.)) crop_left = int(round((image_width - crop_width) / 2.)) return img.crop((crop_left, crop_top, crop_left + crop_width, crop_top + crop_height)) class SubsetSampler(Sampler): r"""Samples elements from a given list of indices, without replacement. Arguments: indices (sequence): a sequence of indices """ def __init__(self, indices): self.indices = indices def __iter__(self): return (i for i in self.indices) def __len__(self): return len(self.indices) ================================================ FILE: fast_autoaugment/FastAutoAugment/imagenet.py ================================================ from __future__ import print_function import os import shutil import torch ARCHIVE_DICT = { 'train': { 'url': 'http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train.tar', 'md5': '1d675b47d978889d74fa0da5fadfb00e', }, 'val': { 'url': 'http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_val.tar', 'md5': '29b22e2961454d5413ddabcf34fc5622', }, 'devkit': { 'url': 'http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_devkit_t12.tar.gz', 'md5': 'fa75699e90414af021442c21a62c3abf', } } import torchvision from torchvision.datasets.utils import check_integrity, download_url # copy ILSVRC/ImageSets/CLS-LOC/train_cls.txt to ./root/ # to skip os walk (it's too slow) using ILSVRC/ImageSets/CLS-LOC/train_cls.txt file class ImageNet(torchvision.datasets.ImageFolder): """`ImageNet `_ 2012 Classification Dataset. Args: root (string): Root directory of the ImageNet Dataset. split (string, optional): The dataset split, supports ``train``, or ``val``. download (bool, optional): If true, downloads the dataset from the internet and puts it in root directory. If dataset is already downloaded, it is not downloaded again. transform (callable, optional): A function/transform that takes in an PIL image and returns a transformed version. E.g, ``transforms.RandomCrop`` target_transform (callable, optional): A function/transform that takes in the target and transforms it. loader (callable, optional): A function to load an image given its path. Attributes: classes (list): List of the class names. class_to_idx (dict): Dict with items (class_name, class_index). wnids (list): List of the WordNet IDs. wnid_to_idx (dict): Dict with items (wordnet_id, class_index). imgs (list): List of (image path, class_index) tuples targets (list): The class_index value for each image in the dataset """ def __init__(self, root, split='train', download=False, **kwargs): root = self.root = os.path.expanduser(root) self.split = self._verify_split(split) if download: self.download() wnid_to_classes = self._load_meta_file()[0] # to skip os walk (it's too slow) using ILSVRC/ImageSets/CLS-LOC/train_cls.txt file listfile = os.path.join(root, 'train_cls.txt') if split == 'train' and os.path.exists(listfile): torchvision.datasets.VisionDataset.__init__(self, root, **kwargs) with open(listfile, 'r') as f: datalist = [ line.strip().split(' ')[0] for line in f.readlines() if line.strip() ] classes = list(set([line.split('/')[0] for line in datalist])) classes.sort() class_to_idx = {classes[i]: i for i in range(len(classes))} samples = [ (os.path.join(self.split_folder, line + '.JPEG'), class_to_idx[line.split('/')[0]]) for line in datalist ] self.loader = torchvision.datasets.folder.default_loader self.extensions = torchvision.datasets.folder.IMG_EXTENSIONS self.classes = classes self.class_to_idx = class_to_idx self.samples = samples self.targets = [s[1] for s in samples] self.imgs = self.samples else: super(ImageNet, self).__init__(self.split_folder, **kwargs) self.root = root idcs = [idx for _, idx in self.imgs] self.wnids = self.classes self.wnid_to_idx = {wnid: idx for idx, wnid in zip(idcs, self.wnids)} self.classes = [wnid_to_classes[wnid] for wnid in self.wnids] self.class_to_idx = {cls: idx for clss, idx in zip(self.classes, idcs) for cls in clss} def download(self): if not check_integrity(self.meta_file): tmpdir = os.path.join(self.root, 'tmp') archive_dict = ARCHIVE_DICT['devkit'] download_and_extract_tar(archive_dict['url'], self.root, extract_root=tmpdir, md5=archive_dict['md5']) devkit_folder = _splitexts(os.path.basename(archive_dict['url']))[0] meta = parse_devkit(os.path.join(tmpdir, devkit_folder)) self._save_meta_file(*meta) shutil.rmtree(tmpdir) if not os.path.isdir(self.split_folder): archive_dict = ARCHIVE_DICT[self.split] download_and_extract_tar(archive_dict['url'], self.root, extract_root=self.split_folder, md5=archive_dict['md5']) if self.split == 'train': prepare_train_folder(self.split_folder) elif self.split == 'val': val_wnids = self._load_meta_file()[1] prepare_val_folder(self.split_folder, val_wnids) else: msg = ("You set download=True, but a folder '{}' already exist in " "the root directory. If you want to re-download or re-extract the " "archive, delete the folder.") print(msg.format(self.split)) @property def meta_file(self): return os.path.join(self.root, 'meta.bin') def _load_meta_file(self): if check_integrity(self.meta_file): return torch.load(self.meta_file) raise RuntimeError("Meta file not found or corrupted.", "You can use download=True to create it.") def _save_meta_file(self, wnid_to_class, val_wnids): torch.save((wnid_to_class, val_wnids), self.meta_file) def _verify_split(self, split): if split not in self.valid_splits: msg = "Unknown split {} .".format(split) msg += "Valid splits are {{}}.".format(", ".join(self.valid_splits)) raise ValueError(msg) return split @property def valid_splits(self): return 'train', 'val' @property def split_folder(self): return os.path.join(self.root, self.split) def extra_repr(self): return "Split: {split}".format(**self.__dict__) def extract_tar(src, dest=None, gzip=None, delete=False): import tarfile if dest is None: dest = os.path.dirname(src) if gzip is None: gzip = src.lower().endswith('.gz') mode = 'r:gz' if gzip else 'r' with tarfile.open(src, mode) as tarfh: tarfh.extractall(path=dest) if delete: os.remove(src) def download_and_extract_tar(url, download_root, extract_root=None, filename=None, md5=None, **kwargs): download_root = os.path.expanduser(download_root) if extract_root is None: extract_root = download_root if filename is None: filename = os.path.basename(url) if not check_integrity(os.path.join(download_root, filename), md5): download_url(url, download_root, filename=filename, md5=md5) extract_tar(os.path.join(download_root, filename), extract_root, **kwargs) def parse_devkit(root): idx_to_wnid, wnid_to_classes = parse_meta(root) val_idcs = parse_val_groundtruth(root) val_wnids = [idx_to_wnid[idx] for idx in val_idcs] return wnid_to_classes, val_wnids def parse_meta(devkit_root, path='data', filename='meta.mat'): import scipy.io as sio metafile = os.path.join(devkit_root, path, filename) meta = sio.loadmat(metafile, squeeze_me=True)['synsets'] nums_children = list(zip(*meta))[4] meta = [meta[idx] for idx, num_children in enumerate(nums_children) if num_children == 0] idcs, wnids, classes = list(zip(*meta))[:3] classes = [tuple(clss.split(', ')) for clss in classes] idx_to_wnid = {idx: wnid for idx, wnid in zip(idcs, wnids)} wnid_to_classes = {wnid: clss for wnid, clss in zip(wnids, classes)} return idx_to_wnid, wnid_to_classes def parse_val_groundtruth(devkit_root, path='data', filename='ILSVRC2012_validation_ground_truth.txt'): with open(os.path.join(devkit_root, path, filename), 'r') as txtfh: val_idcs = txtfh.readlines() return [int(val_idx) for val_idx in val_idcs] def prepare_train_folder(folder): for archive in [os.path.join(folder, archive) for archive in os.listdir(folder)]: extract_tar(archive, os.path.splitext(archive)[0], delete=True) def prepare_val_folder(folder, wnids): img_files = sorted([os.path.join(folder, file) for file in os.listdir(folder)]) for wnid in set(wnids): os.mkdir(os.path.join(folder, wnid)) for wnid, img_file in zip(wnids, img_files): shutil.move(img_file, os.path.join(folder, wnid, os.path.basename(img_file))) def _splitexts(root): exts = [] ext = '.' while ext: root, ext = os.path.splitext(root) exts.append(ext) return root, ''.join(reversed(exts)) ================================================ FILE: fast_autoaugment/FastAutoAugment/lr_scheduler.py ================================================ import torch from torch.optim.lr_scheduler import MultiStepLR from theconf import Config as C def adjust_learning_rate_resnet(optimizer): """ Sets the learning rate to the initial LR decayed by 10 on every predefined epochs Ref: AutoAugment """ if C.get()['epoch'] == 90: return MultiStepLR_HotFix(optimizer, [30, 60, 80]) elif C.get()['epoch'] == 270: # autoaugment return MultiStepLR_HotFix(optimizer, [90, 180, 240]) else: raise ValueError('invalid epoch=%d for resnet scheduler' % C.get()['epoch']) class MultiStepLR_HotFix(MultiStepLR): def __init__(self, optimizer, milestones, gamma=0.1, last_epoch=-1): super(MultiStepLR_HotFix, self).__init__(optimizer, milestones, gamma, last_epoch) self.milestones = list(milestones) ================================================ FILE: fast_autoaugment/FastAutoAugment/metrics.py ================================================ import copy import torch import numpy as np from collections import defaultdict from torch import nn def accuracy(output, target, topk=(1,)): """Computes the precision@k for the specified values of k""" maxk = max(topk) batch_size = target.size(0) _, pred = output.topk(maxk, 1, True, True) pred = pred.t() correct = pred.eq(target.view(1, -1).expand_as(pred)) res = [] for k in topk: correct_k = correct[:k].view(-1).float().sum(0) res.append(correct_k.mul_(1. / batch_size)) return res class CrossEntropyLabelSmooth(torch.nn.Module): def __init__(self, num_classes, epsilon, reduction='mean'): super(CrossEntropyLabelSmooth, self).__init__() self.num_classes = num_classes self.epsilon = epsilon self.reduction = reduction self.logsoftmax = torch.nn.LogSoftmax(dim=1) def forward(self, input, target): # pylint: disable=redefined-builtin log_probs = self.logsoftmax(input) targets = torch.zeros_like(log_probs).scatter_(1, target.unsqueeze(1), 1) if self.epsilon > 0.0: targets = (1 - self.epsilon) * targets + self.epsilon / self.num_classes targets = targets.detach() loss = (-targets * log_probs) if self.reduction in ['avg', 'mean']: loss = torch.mean(torch.sum(loss, dim=1)) elif self.reduction == 'sum': loss = loss.sum() return loss class Accumulator: def __init__(self): self.metrics = defaultdict(lambda: 0.) def add(self, key, value): self.metrics[key] += value def add_dict(self, dict): for key, value in dict.items(): self.add(key, value) def __getitem__(self, item): return self.metrics[item] def __setitem__(self, key, value): self.metrics[key] = value def get_dict(self): return copy.deepcopy(dict(self.metrics)) def items(self): return self.metrics.items() def __str__(self): return str(dict(self.metrics)) def __truediv__(self, other): newone = Accumulator() for key, value in self.items(): if isinstance(other, str): if other != key: newone[key] = value / self[other] else: newone[key] = value else: newone[key] = value / other return newone class SummaryWriterDummy: def __init__(self, log_dir): pass def add_scalar(self, *args, **kwargs): pass ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/__init__.py ================================================ import torch from torch import nn from torch.nn import DataParallel from torch.nn.parallel import DistributedDataParallel import torch.backends.cudnn as cudnn # from torchvision import models import numpy as np from FastAutoAugment.networks.resnet import ResNet from FastAutoAugment.networks.pyramidnet import PyramidNet from FastAutoAugment.networks.shakeshake.shake_resnet import ShakeResNet from FastAutoAugment.networks.wideresnet import WideResNet from FastAutoAugment.networks.shakeshake.shake_resnext import ShakeResNeXt from FastAutoAugment.networks.efficientnet_pytorch import EfficientNet, RoutingFn from FastAutoAugment.tf_port.tpu_bn import TpuBatchNormalization def get_model(conf, num_class=10, local_rank=-1): name = conf['type'] if name == 'resnet50': model = ResNet(dataset='imagenet', depth=50, num_classes=num_class, bottleneck=True) elif name == 'resnet200': model = ResNet(dataset='imagenet', depth=200, num_classes=num_class, bottleneck=True) elif name == 'wresnet40_2': model = WideResNet(40, 2, dropout_rate=0.0, num_classes=num_class) elif name == 'wresnet28_10': model = WideResNet(28, 10, dropout_rate=0.0, num_classes=num_class) elif name == 'shakeshake26_2x32d': model = ShakeResNet(26, 32, num_class) elif name == 'shakeshake26_2x64d': model = ShakeResNet(26, 64, num_class) elif name == 'shakeshake26_2x96d': model = ShakeResNet(26, 96, num_class) elif name == 'shakeshake26_2x112d': model = ShakeResNet(26, 112, num_class) elif name == 'shakeshake26_2x96d_next': model = ShakeResNeXt(26, 96, 4, num_class) elif name == 'pyramid': model = PyramidNet('cifar10', depth=conf['depth'], alpha=conf['alpha'], num_classes=num_class, bottleneck=conf['bottleneck']) elif 'efficientnet' in name: model = EfficientNet.from_name(name, condconv_num_expert=conf['condconv_num_expert'], norm_layer=None) # TpuBatchNormalization if local_rank >= 0: model = nn.SyncBatchNorm.convert_sync_batchnorm(model) def kernel_initializer(module): def get_fan_in_out(module): num_input_fmaps = module.weight.size(1) num_output_fmaps = module.weight.size(0) receptive_field_size = 1 if module.weight.dim() > 2: receptive_field_size = module.weight[0][0].numel() fan_in = num_input_fmaps * receptive_field_size fan_out = num_output_fmaps * receptive_field_size return fan_in, fan_out if isinstance(module, torch.nn.Conv2d): # https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/efficientnet_model.py#L58 fan_in, fan_out = get_fan_in_out(module) torch.nn.init.normal_(module.weight, mean=0.0, std=np.sqrt(2.0 / fan_out)) if module.bias is not None: torch.nn.init.constant_(module.bias, val=0.) elif isinstance(module, RoutingFn): torch.nn.init.xavier_uniform_(module.weight) torch.nn.init.constant_(module.bias, val=0.) elif isinstance(module, torch.nn.Linear): # https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/efficientnet_model.py#L82 fan_in, fan_out = get_fan_in_out(module) delta = 1.0 / np.sqrt(fan_out) torch.nn.init.uniform_(module.weight, a=-delta, b=delta) if module.bias is not None: torch.nn.init.constant_(module.bias, val=0.) model.apply(kernel_initializer) else: raise NameError('no model named, %s' % name) if local_rank >= 0: device = torch.device('cuda', local_rank) model = model.to(device) model = DistributedDataParallel(model, device_ids=[local_rank], output_device=local_rank) else: model = model.cuda() # model = DataParallel(model) cudnn.benchmark = True return model def num_class(dataset): return { 'cifar10': 10, 'reduced_cifar10': 10, 'cifar10.1': 10, 'cifar100': 100, 'svhn': 10, 'reduced_svhn': 10, 'imagenet': 1000, 'reduced_imagenet': 120, }[dataset] ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/efficientnet_pytorch/__init__.py ================================================ __version__ = "0.5.1" from .model import EfficientNet, RoutingFn from .utils import ( GlobalParams, BlockArgs, BlockDecoder, efficientnet, get_model_params, ) ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/efficientnet_pytorch/condconv.py ================================================ import torch import torch.nn as nn import torch.nn.functional as F from torch._six import container_abcs from itertools import repeat from functools import partial from typing import Union, List, Tuple, Optional, Callable import numpy as np import math def _ntuple(n): def parse(x): if isinstance(x, container_abcs.Iterable): return x return tuple(repeat(x, n)) return parse _single = _ntuple(1) _pair = _ntuple(2) _triple = _ntuple(3) _quadruple = _ntuple(4) def _is_static_pad(kernel_size, stride=1, dilation=1, **_): return stride == 1 and (dilation * (kernel_size - 1)) % 2 == 0 def _get_padding(kernel_size, stride=1, dilation=1, **_): padding = ((stride - 1) + dilation * (kernel_size - 1)) // 2 return padding def _calc_same_pad(i: int, k: int, s: int, d: int): return max((math.ceil(i / s) - 1) * s + (k - 1) * d + 1 - i, 0) def conv2d_same( x, weight: torch.Tensor, bias: Optional[torch.Tensor] = None, stride: Tuple[int, int] = (1, 1), padding: Tuple[int, int] = (0, 0), dilation: Tuple[int, int] = (1, 1), groups: int = 1): ih, iw = x.size()[-2:] kh, kw = weight.size()[-2:] pad_h = _calc_same_pad(ih, kh, stride[0], dilation[0]) pad_w = _calc_same_pad(iw, kw, stride[1], dilation[1]) if pad_h > 0 or pad_w > 0: x = F.pad(x, [pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2]) return F.conv2d(x, weight, bias, stride, (0, 0), dilation, groups) def get_padding_value(padding, kernel_size, **kwargs): dynamic = False if isinstance(padding, str): # for any string padding, the padding will be calculated for you, one of three ways padding = padding.lower() if padding == 'same': # TF compatible 'SAME' padding, has a performance and GPU memory allocation impact if _is_static_pad(kernel_size, **kwargs): # static case, no extra overhead padding = _get_padding(kernel_size, **kwargs) else: # dynamic padding padding = 0 dynamic = True elif padding == 'valid': # 'VALID' padding, same as padding=0 padding = 0 else: # Default to PyTorch style 'same'-ish symmetric padding padding = _get_padding(kernel_size, **kwargs) return padding, dynamic def get_condconv_initializer(initializer, num_experts, expert_shape): def condconv_initializer(weight): """CondConv initializer function.""" num_params = np.prod(expert_shape) if (len(weight.shape) != 2 or weight.shape[0] != num_experts or weight.shape[1] != num_params): raise (ValueError('CondConv variables must have shape [num_experts, num_params]')) for i in range(num_experts): initializer(weight[i].view(expert_shape)) return condconv_initializer class CondConv2d(nn.Module): """ Conditional Convolution Inspired by: https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/condconv/condconv_layers.py Grouped convolution hackery for parallel execution of the per-sample kernel filters inspired by this discussion: https://github.com/pytorch/pytorch/issues/17983 """ __constants__ = ['bias', 'in_channels', 'out_channels', 'dynamic_padding'] def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding='', dilation=1, groups=1, bias=False, num_experts=4): super(CondConv2d, self).__init__() assert num_experts > 1 if isinstance(stride, container_abcs.Iterable) and len(stride) == 1: stride = stride[0] # print('CondConv', num_experts) self.in_channels = in_channels self.out_channels = out_channels self.kernel_size = _pair(kernel_size) self.stride = _pair(stride) padding_val, is_padding_dynamic = get_padding_value(padding, kernel_size, stride=stride, dilation=dilation) self.dynamic_padding = is_padding_dynamic # if in forward to work with torchscript self.padding = _pair(padding_val) self.dilation = _pair(dilation) self.groups = groups self.num_experts = num_experts self.weight_shape = (self.out_channels, self.in_channels // self.groups) + self.kernel_size weight_num_param = 1 for wd in self.weight_shape: weight_num_param *= wd self.weight = torch.nn.Parameter(torch.Tensor(self.num_experts, weight_num_param)) if bias: self.bias_shape = (self.out_channels,) self.bias = torch.nn.Parameter(torch.Tensor(self.num_experts, self.out_channels)) else: self.register_parameter('bias', None) self.reset_parameters() def reset_parameters(self): num_input_fmaps = self.weight.size(1) num_output_fmaps = self.weight.size(0) receptive_field_size = 1 if self.weight.dim() > 2: receptive_field_size = self.weight[0][0].numel() fan_in = num_input_fmaps * receptive_field_size fan_out = num_output_fmaps * receptive_field_size init_weight = get_condconv_initializer(partial(nn.init.normal_, mean=0.0, std=np.sqrt(2.0 / fan_out)), self.num_experts, self.weight_shape) init_weight(self.weight) if self.bias is not None: # fan_in = np.prod(self.weight_shape[1:]) # bound = 1 / math.sqrt(fan_in) init_bias = get_condconv_initializer(partial(nn.init.constant_, val=0), self.num_experts, self.bias_shape) init_bias(self.bias) def forward(self, x, routing_weights): x_orig = x B, C, H, W = x.shape weight = torch.matmul(routing_weights, self.weight) # (Expert x out x in x 3x3) --> (B x out x in x 3x3) new_weight_shape = (B * self.out_channels, self.in_channels // self.groups) + self.kernel_size weight = weight.view(new_weight_shape) # (B*out x in x 3 x 3) bias = None if self.bias is not None: bias = torch.matmul(routing_weights, self.bias) bias = bias.view(B * self.out_channels) # move batch elements with channels so each batch element can be efficiently convolved with separate kernel x = x.view(1, B * C, H, W) if self.dynamic_padding: out = conv2d_same( x, weight, bias, stride=self.stride, padding=self.padding, dilation=self.dilation, groups=self.groups * B) else: out = F.conv2d( x, weight, bias, stride=self.stride, padding=self.padding, dilation=self.dilation, groups=self.groups * B) # out : (1 x B*out x ...) out = out.permute([1, 0, 2, 3]).view(B, self.out_channels, out.shape[-2], out.shape[-1]) # out2 = self.forward_legacy(x_orig, routing_weights) # lt = torch.lt(torch.abs(torch.add(out, -out2)), 1e-8) # assert torch.all(lt), torch.abs(torch.add(out, -out2))[lt] # print('checked') return out def forward_legacy(self, x, routing_weights): # Literal port (from TF definition) B, C, H, W = x.shape weight = torch.matmul(routing_weights, self.weight) # (Expert x out x in x 3x3) --> (B x out x in x 3x3) x = torch.split(x, 1, 0) weight = torch.split(weight, 1, 0) if self.bias is not None: bias = torch.matmul(routing_weights, self.bias) bias = torch.split(bias, 1, 0) else: bias = [None] * B out = [] if self.dynamic_padding: conv_fn = conv2d_same else: conv_fn = F.conv2d for xi, wi, bi in zip(x, weight, bias): wi = wi.view(*self.weight_shape) if bi is not None: bi = bi.view(*self.bias_shape) out.append(conv_fn( xi, wi, bi, stride=self.stride, padding=self.padding, dilation=self.dilation, groups=self.groups)) out = torch.cat(out, 0) return out ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/efficientnet_pytorch/model.py ================================================ import torch from torch import nn from torch.nn import functional as F from functools import partial from .utils import ( round_filters, round_repeats, drop_connect, get_same_padding_conv2d, get_model_params, efficientnet_params, load_pretrained_weights, MemoryEfficientSwish, ) class RoutingFn(nn.Linear): pass class MBConvBlock(nn.Module): """ Mobile Inverted Residual Bottleneck Block Args: block_args (namedtuple): BlockArgs, see above global_params (namedtuple): GlobalParam, see above Attributes: has_se (bool): Whether the block contains a Squeeze and Excitation layer. """ def __init__(self, block_args, global_params, norm_layer=None): super().__init__() self._block_args = block_args self._bn_mom = 1 - global_params.batch_norm_momentum self._bn_eps = global_params.batch_norm_epsilon self.has_se = (self._block_args.se_ratio is not None) and (0 < self._block_args.se_ratio <= 1) self.id_skip = block_args.id_skip # skip connection and drop connect if norm_layer is None: norm_layer = nn.BatchNorm2d self.condconv_num_expert = block_args.condconv_num_expert if self._is_condconv(): self.routing_fn = RoutingFn(self._block_args.input_filters, self.condconv_num_expert) # Get static or dynamic convolution depending on image size Conv2d = get_same_padding_conv2d(image_size=global_params.image_size, condconv_num_expert=block_args.condconv_num_expert) Conv2dse = get_same_padding_conv2d(image_size=global_params.image_size) # Expansion phase inp = self._block_args.input_filters # number of input channels oup = self._block_args.input_filters * self._block_args.expand_ratio # number of output channels if self._block_args.expand_ratio != 1: self._expand_conv = Conv2d(in_channels=inp, out_channels=oup, kernel_size=1, bias=False) self._bn0 = norm_layer(num_features=oup, momentum=self._bn_mom, eps=self._bn_eps) # Depthwise convolution phase k = self._block_args.kernel_size s = self._block_args.stride self._depthwise_conv = Conv2d( in_channels=oup, out_channels=oup, groups=oup, # groups makes it depthwise kernel_size=k, stride=s, bias=False) self._bn1 = norm_layer(num_features=oup, momentum=self._bn_mom, eps=self._bn_eps) # Squeeze and Excitation layer, if desired if self.has_se: num_squeezed_channels = max(1, int(self._block_args.input_filters * self._block_args.se_ratio)) self._se_reduce = Conv2dse(in_channels=oup, out_channels=num_squeezed_channels, kernel_size=1) self._se_expand = Conv2dse(in_channels=num_squeezed_channels, out_channels=oup, kernel_size=1) # Output phase final_oup = self._block_args.output_filters self._project_conv = Conv2d(in_channels=oup, out_channels=final_oup, kernel_size=1, bias=False) self._bn2 = norm_layer(num_features=final_oup, momentum=self._bn_mom, eps=self._bn_eps) self._swish = MemoryEfficientSwish() def _is_condconv(self): return self.condconv_num_expert > 1 def forward(self, inputs, drop_connect_rate=None): """ :param inputs: input tensor :param drop_connect_rate: drop connect rate (float, between 0 and 1) :return: output of block """ if self._is_condconv(): feat = F.adaptive_avg_pool2d(inputs, 1).flatten(1) routing_w = torch.sigmoid(self.routing_fn(feat)) if self._block_args.expand_ratio != 1: _expand_conv = partial(self._expand_conv, routing_weights=routing_w) _depthwise_conv = partial(self._depthwise_conv, routing_weights=routing_w) _project_conv = partial(self._project_conv, routing_weights=routing_w) else: if self._block_args.expand_ratio != 1: _expand_conv = self._expand_conv _depthwise_conv, _project_conv = self._depthwise_conv, self._project_conv # Expansion and Depthwise Convolution x = inputs if self._block_args.expand_ratio != 1: x = self._swish(self._bn0(_expand_conv(inputs))) x = self._swish(self._bn1(_depthwise_conv(x))) # Squeeze and Excitation if self.has_se: x_squeezed = F.adaptive_avg_pool2d(x, 1) x_squeezed = self._se_expand(self._swish(self._se_reduce(x_squeezed))) x = torch.sigmoid(x_squeezed) * x x = self._bn2(_project_conv(x)) # Skip connection and drop connect input_filters, output_filters = self._block_args.input_filters, self._block_args.output_filters if self.id_skip and self._block_args.stride == 1 and input_filters == output_filters: if drop_connect_rate: x = drop_connect(x, drop_p=drop_connect_rate, training=self.training) x = x + inputs # skip connection return x def set_swish(self): """Sets swish function as memory efficient (for training) or standard (for export)""" self._swish = MemoryEfficientSwish() class EfficientNet(nn.Module): """ An EfficientNet model. Most easily loaded with the .from_name or .from_pretrained methods Args: blocks_args (list): A list of BlockArgs to construct blocks global_params (namedtuple): A set of GlobalParams shared between blocks Example: model = EfficientNet.from_pretrained('efficientnet-b0') """ def __init__(self, blocks_args=None, global_params=None, norm_layer=None): super().__init__() assert isinstance(blocks_args, list), 'blocks_args should be a list' assert len(blocks_args) > 0, 'block args must be greater than 0' self._global_params = global_params self._blocks_args = blocks_args if norm_layer is None: norm_layer = nn.BatchNorm2d # Get static or dynamic convolution depending on image size Conv2d = get_same_padding_conv2d(image_size=global_params.image_size) # Batch norm parameters bn_mom = 1 - self._global_params.batch_norm_momentum bn_eps = self._global_params.batch_norm_epsilon # Stem in_channels = 3 # rgb out_channels = round_filters(32, self._global_params) # number of output channels self._conv_stem = Conv2d(in_channels, out_channels, kernel_size=3, stride=2, bias=False) self._bn0 = norm_layer(num_features=out_channels, momentum=bn_mom, eps=bn_eps) # Build blocks self._blocks = nn.ModuleList([]) for idx, block_args in enumerate(self._blocks_args): # Update block input and output filters based on depth multiplier. block_args = block_args._replace( input_filters=round_filters(block_args.input_filters, self._global_params), output_filters=round_filters(block_args.output_filters, self._global_params), num_repeat=round_repeats(block_args.num_repeat, self._global_params) ) # The first block needs to take care of stride and filter size increase. self._blocks.append(MBConvBlock(block_args, self._global_params, norm_layer=norm_layer)) if block_args.num_repeat > 1: block_args = block_args._replace(input_filters=block_args.output_filters, stride=1) for _ in range(block_args.num_repeat - 1): self._blocks.append(MBConvBlock(block_args, self._global_params, norm_layer=norm_layer)) # Head in_channels = block_args.output_filters # output of final block out_channels = round_filters(1280, self._global_params) self._conv_head = Conv2d(in_channels, out_channels, kernel_size=1, bias=False) self._bn1 = norm_layer(num_features=out_channels, momentum=bn_mom, eps=bn_eps) # Final linear layer self._avg_pooling = nn.AdaptiveAvgPool2d(1) self._dropout = nn.Dropout(self._global_params.dropout_rate) self._fc = nn.Linear(out_channels, self._global_params.num_classes) self._swish = MemoryEfficientSwish() def set_swish(self): """Sets swish function as memory efficient (for training) or standard (for export)""" self._swish = MemoryEfficientSwish() for block in self._blocks: block.set_swish() def extract_features(self, inputs): """ Returns output of the final convolution layer """ # Stem x = self._swish(self._bn0(self._conv_stem(inputs))) # Blocks for idx, block in enumerate(self._blocks): drop_connect_rate = self._global_params.drop_connect_rate if drop_connect_rate: drop_connect_rate *= float(idx) / len(self._blocks) x = block(x, drop_connect_rate=drop_connect_rate) # Head x = self._swish(self._bn1(self._conv_head(x))) return x def forward(self, inputs): """ Calls extract_features to extract features, applies final linear layer, and returns logits. """ bs = inputs.size(0) # Convolution layers x = self.extract_features(inputs) # Pooling and final linear layer x = self._avg_pooling(x) x = x.view(bs, -1) x = self._dropout(x) x = self._fc(x) return x @classmethod def from_name(cls, model_name, override_params=None, norm_layer=None, condconv_num_expert=1): cls._check_model_name_is_valid(model_name) blocks_args, global_params = get_model_params(model_name, override_params, condconv_num_expert=condconv_num_expert) return cls(blocks_args, global_params, norm_layer=norm_layer) @classmethod def from_pretrained(cls, model_name, num_classes=1000): model = cls.from_name(model_name, override_params={'num_classes': num_classes}) load_pretrained_weights(model, model_name, load_fc=(num_classes == 1000)) return model @classmethod def get_image_size(cls, model_name): cls._check_model_name_is_valid(model_name) _, _, res, _ = efficientnet_params(model_name) return res @classmethod def _check_model_name_is_valid(cls, model_name, also_need_pretrained_weights=False): """ Validates model name. None that pretrained weights are only available for the first four models (efficientnet-b{i} for i in 0,1,2,3) at the moment. """ num_models = 4 if also_need_pretrained_weights else 8 valid_models = ['efficientnet-b'+str(i) for i in range(num_models)] if model_name not in valid_models: raise ValueError(f'model_name={model_name} should be one of: ' + ', '.join(valid_models)) ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/efficientnet_pytorch/utils.py ================================================ """ This file contains helper functions for building the model and for loading model parameters. These helper functions are built to mirror those in the official TensorFlow implementation. """ import re import math import collections from functools import partial import torch from torch import nn from torch.nn import functional as F from torch.utils import model_zoo ######################################################################## ############### HELPERS FUNCTIONS FOR MODEL ARCHITECTURE ############### ######################################################################## # Parameters for the entire model (stem, all blocks, and head) from FastAutoAugment.networks.efficientnet_pytorch.condconv import CondConv2d GlobalParams = collections.namedtuple('GlobalParams', [ 'batch_norm_momentum', 'batch_norm_epsilon', 'dropout_rate', 'num_classes', 'width_coefficient', 'depth_coefficient', 'depth_divisor', 'min_depth', 'drop_connect_rate', 'image_size']) # Parameters for an individual model block BlockArgs = collections.namedtuple('BlockArgs', [ 'kernel_size', 'num_repeat', 'input_filters', 'output_filters', 'expand_ratio', 'id_skip', 'stride', 'se_ratio', 'condconv_num_expert']) # Change namedtuple defaults GlobalParams.__new__.__defaults__ = (None,) * len(GlobalParams._fields) BlockArgs.__new__.__defaults__ = (None,) * len(BlockArgs._fields) class SwishImplementation(torch.autograd.Function): @staticmethod def forward(ctx, i): result = i * torch.sigmoid(i) ctx.save_for_backward(i) return result @staticmethod def backward(ctx, grad_output): i = ctx.saved_tensors[0] sigmoid_i = torch.sigmoid(i) return grad_output * (sigmoid_i * (1 + i * (1 - sigmoid_i))) class MemoryEfficientSwish(nn.Module): def forward(self, x): return SwishImplementation.apply(x) def round_filters(filters, global_params): """ Calculate and round number of filters based on depth multiplier. """ multiplier = global_params.width_coefficient if not multiplier: return filters divisor = global_params.depth_divisor min_depth = global_params.min_depth filters *= multiplier min_depth = min_depth or divisor new_filters = max(min_depth, int(filters + divisor / 2) // divisor * divisor) if new_filters < 0.9 * filters: # prevent rounding by more than 10% new_filters += divisor return int(new_filters) def round_repeats(repeats, global_params): """ Round number of filters based on depth multiplier. """ multiplier = global_params.depth_coefficient if not multiplier: return repeats return int(math.ceil(multiplier * repeats)) def drop_connect(inputs, drop_p, training): """ Drop connect. """ if not training: return inputs * (1. - drop_p) batch_size = inputs.shape[0] random_tensor = torch.rand([batch_size, 1, 1, 1], dtype=inputs.dtype, device=inputs.device) binary_tensor = random_tensor > drop_p output = inputs * binary_tensor.float() # output = inputs / (1. - drop_p) * binary_tensor.float() return output # if not training: return inputs # batch_size = inputs.shape[0] # keep_prob = 1 - drop_p # random_tensor = keep_prob # random_tensor += torch.rand([batch_size, 1, 1, 1], dtype=inputs.dtype, device=inputs.device) # binary_tensor = torch.floor(random_tensor) # output = inputs / keep_prob * binary_tensor # return output def get_same_padding_conv2d(image_size=None, condconv_num_expert=1): """ Chooses static padding if you have specified an image size, and dynamic padding otherwise. Static padding is necessary for ONNX exporting of models. """ if condconv_num_expert > 1: return partial(CondConv2d, num_experts=condconv_num_expert) elif image_size is None: return Conv2dDynamicSamePadding else: return partial(Conv2dStaticSamePadding, image_size=image_size) class Conv2dDynamicSamePadding(nn.Conv2d): """ 2D Convolutions like TensorFlow, for a dynamic image size """ def __init__(self, in_channels, out_channels, kernel_size, stride=1, dilation=1, groups=1, bias=True): super().__init__(in_channels, out_channels, kernel_size, stride, 0, dilation, groups, bias) self.stride = self.stride if len(self.stride) == 2 else [self.stride[0]] * 2 def forward(self, x): ih, iw = x.size()[-2:] kh, kw = self.weight.size()[-2:] sh, sw = self.stride oh, ow = math.ceil(ih / sh), math.ceil(iw / sw) pad_h = max((oh - 1) * self.stride[0] + (kh - 1) * self.dilation[0] + 1 - ih, 0) pad_w = max((ow - 1) * self.stride[1] + (kw - 1) * self.dilation[1] + 1 - iw, 0) if pad_h > 0 or pad_w > 0: x = F.pad(x, [pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2]) return F.conv2d(x, self.weight, self.bias, self.stride, self.padding, self.dilation, self.groups) class Conv2dStaticSamePadding(nn.Conv2d): """ 2D Convolutions like TensorFlow, for a fixed image size""" def __init__(self, in_channels, out_channels, kernel_size, image_size=None, **kwargs): super().__init__(in_channels, out_channels, kernel_size, **kwargs) self.stride = self.stride if len(self.stride) == 2 else [self.stride[0]] * 2 # Calculate padding based on image size and save it assert image_size is not None ih, iw = image_size if type(image_size) == list else [image_size, image_size] kh, kw = self.weight.size()[-2:] sh, sw = self.stride oh, ow = math.ceil(ih / sh), math.ceil(iw / sw) pad_h = max((oh - 1) * self.stride[0] + (kh - 1) * self.dilation[0] + 1 - ih, 0) pad_w = max((ow - 1) * self.stride[1] + (kw - 1) * self.dilation[1] + 1 - iw, 0) if pad_h > 0 or pad_w > 0: self.static_padding = nn.ZeroPad2d((pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2)) else: self.static_padding = Identity() def forward(self, x): x = self.static_padding(x) x = F.conv2d(x, self.weight, self.bias, self.stride, self.padding, self.dilation, self.groups) return x class Identity(nn.Module): def __init__(self, ): super(Identity, self).__init__() def forward(self, input): return input ######################################################################## ############## HELPERS FUNCTIONS FOR LOADING MODEL PARAMS ############## ######################################################################## def efficientnet_params(model_name): """ Map EfficientNet model name to parameter coefficients. """ params_dict = { # Coefficients: width,depth,res,dropout 'efficientnet-b0': (1.0, 1.0, 224, 0.2), 'efficientnet-b1': (1.0, 1.1, 240, 0.2), 'efficientnet-b2': (1.1, 1.2, 260, 0.3), 'efficientnet-b3': (1.2, 1.4, 300, 0.3), 'efficientnet-b4': (1.4, 1.8, 380, 0.4), 'efficientnet-b5': (1.6, 2.2, 456, 0.4), 'efficientnet-b6': (1.8, 2.6, 528, 0.5), 'efficientnet-b7': (2.0, 3.1, 600, 0.5), } return params_dict[model_name] class BlockDecoder(object): """ Block Decoder for readability, straight from the official TensorFlow repository """ @staticmethod def _decode_block_string(block_string): """ Gets a block through a string notation of arguments. """ assert isinstance(block_string, str) ops = block_string.split('_') options = {} for op in ops: splits = re.split(r'(\d.*)', op) if len(splits) >= 2: key, value = splits[:2] options[key] = value # Check stride assert (('s' in options and len(options['s']) == 1) or (len(options['s']) == 2 and options['s'][0] == options['s'][1])) return BlockArgs( kernel_size=int(options['k']), num_repeat=int(options['r']), input_filters=int(options['i']), output_filters=int(options['o']), expand_ratio=int(options['e']), id_skip=('noskip' not in block_string), se_ratio=float(options['se']) if 'se' in options else None, stride=[int(options['s'][0])], condconv_num_expert=0 ) @staticmethod def _encode_block_string(block): """Encodes a block to a string.""" args = [ 'r%d' % block.num_repeat, 'k%d' % block.kernel_size, 's%d%d' % (block.strides[0], block.strides[1]), 'e%s' % block.expand_ratio, 'i%d' % block.input_filters, 'o%d' % block.output_filters ] if 0 < block.se_ratio <= 1: args.append('se%s' % block.se_ratio) if block.id_skip is False: args.append('noskip') return '_'.join(args) @staticmethod def decode(string_list): """ Decodes a list of string notations to specify blocks inside the network. :param string_list: a list of strings, each string is a notation of block :return: a list of BlockArgs namedtuples of block args """ assert isinstance(string_list, list) blocks_args = [] for block_string in string_list: blocks_args.append(BlockDecoder._decode_block_string(block_string)) return blocks_args @staticmethod def encode(blocks_args): """ Encodes a list of BlockArgs to a list of strings. :param blocks_args: a list of BlockArgs namedtuples of block args :return: a list of strings, each string is a notation of block """ block_strings = [] for block in blocks_args: block_strings.append(BlockDecoder._encode_block_string(block)) return block_strings def efficientnet(width_coefficient=None, depth_coefficient=None, dropout_rate=0.2, drop_connect_rate=0.2, image_size=None, num_classes=1000, condconv_num_expert=1): """ Creates a efficientnet model. """ blocks_args = [ 'r1_k3_s11_e1_i32_o16_se0.25', 'r2_k3_s22_e6_i16_o24_se0.25', 'r2_k5_s22_e6_i24_o40_se0.25', 'r3_k3_s22_e6_i40_o80_se0.25', 'r3_k5_s11_e6_i80_o112_se0.25', 'r4_k5_s22_e6_i112_o192_se0.25', 'r1_k3_s11_e6_i192_o320_se0.25', ] blocks_args = BlockDecoder.decode(blocks_args) blocks_args_new = blocks_args[:-3] for blocks_arg in blocks_args[-3:]: blocks_arg = blocks_arg._replace(condconv_num_expert=condconv_num_expert) blocks_args_new.append(blocks_arg) blocks_args = blocks_args_new global_params = GlobalParams( batch_norm_momentum=0.99, batch_norm_epsilon=1e-3, dropout_rate=dropout_rate, drop_connect_rate=drop_connect_rate, # data_format='channels_last', # removed, this is always true in PyTorch num_classes=num_classes, width_coefficient=width_coefficient, depth_coefficient=depth_coefficient, depth_divisor=8, min_depth=None, image_size=image_size, ) return blocks_args, global_params def get_model_params(model_name, override_params, condconv_num_expert=1): """ Get the block args and global params for a given model """ if model_name.startswith('efficientnet'): w, d, s, p = efficientnet_params(model_name) # note: all models have drop connect rate = 0.2 blocks_args, global_params = efficientnet( width_coefficient=w, depth_coefficient=d, dropout_rate=p, image_size=s, condconv_num_expert=condconv_num_expert) else: raise NotImplementedError('model name is not pre-defined: %s' % model_name) if override_params: # ValueError will be raised here if override_params has fields not included in global_params. global_params = global_params._replace(**override_params) return blocks_args, global_params url_map = { 'efficientnet-b0': 'http://storage.googleapis.com/public-models/efficientnet/efficientnet-b0-355c32eb.pth', 'efficientnet-b1': 'http://storage.googleapis.com/public-models/efficientnet/efficientnet-b1-f1951068.pth', 'efficientnet-b2': 'http://storage.googleapis.com/public-models/efficientnet/efficientnet-b2-8bb594d6.pth', 'efficientnet-b3': 'http://storage.googleapis.com/public-models/efficientnet/efficientnet-b3-5fb5a3c3.pth', 'efficientnet-b4': 'http://storage.googleapis.com/public-models/efficientnet/efficientnet-b4-6ed6700e.pth', 'efficientnet-b5': 'http://storage.googleapis.com/public-models/efficientnet/efficientnet-b5-b6417697.pth', 'efficientnet-b6': 'http://storage.googleapis.com/public-models/efficientnet/efficientnet-b6-c76e70fd.pth', 'efficientnet-b7': 'http://storage.googleapis.com/public-models/efficientnet/efficientnet-b7-dcc49843.pth', } def load_pretrained_weights(model, model_name, load_fc=True): """ Loads pretrained weights, and downloads if loading for the first time. """ state_dict = model_zoo.load_url(url_map[model_name]) if load_fc: model.load_state_dict(state_dict) else: state_dict.pop('_fc.weight') state_dict.pop('_fc.bias') res = model.load_state_dict(state_dict, strict=False) assert set(res.missing_keys) == set(['_fc.weight', '_fc.bias']), 'issue loading pretrained weights' print('Loaded pretrained weights for {}'.format(model_name)) ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/pyramidnet.py ================================================ import torch import torch.nn as nn import math from FastAutoAugment.networks.shakedrop import ShakeDrop def conv3x3(in_planes, out_planes, stride=1): """ 3x3 convolution with padding """ return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False) class BasicBlock(nn.Module): outchannel_ratio = 1 def __init__(self, inplanes, planes, stride=1, downsample=None, p_shakedrop=1.0): super(BasicBlock, self).__init__() self.bn1 = nn.BatchNorm2d(inplanes) self.conv1 = conv3x3(inplanes, planes, stride) self.bn2 = nn.BatchNorm2d(planes) self.conv2 = conv3x3(planes, planes) self.bn3 = nn.BatchNorm2d(planes) self.relu = nn.ReLU(inplace=True) self.downsample = downsample self.stride = stride self.shake_drop = ShakeDrop(p_shakedrop) def forward(self, x): out = self.bn1(x) out = self.conv1(out) out = self.bn2(out) out = self.relu(out) out = self.conv2(out) out = self.bn3(out) out = self.shake_drop(out) if self.downsample is not None: shortcut = self.downsample(x) featuremap_size = shortcut.size()[2:4] else: shortcut = x featuremap_size = out.size()[2:4] batch_size = out.size()[0] residual_channel = out.size()[1] shortcut_channel = shortcut.size()[1] if residual_channel != shortcut_channel: padding = torch.autograd.Variable( torch.cuda.FloatTensor(batch_size, residual_channel - shortcut_channel, featuremap_size[0], featuremap_size[1]).fill_(0)) out += torch.cat((shortcut, padding), 1) else: out += shortcut return out class Bottleneck(nn.Module): outchannel_ratio = 4 def __init__(self, inplanes, planes, stride=1, downsample=None, p_shakedrop=1.0): super(Bottleneck, self).__init__() self.bn1 = nn.BatchNorm2d(inplanes) self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) self.bn2 = nn.BatchNorm2d(planes) self.conv2 = nn.Conv2d(planes, (planes * 1), kernel_size=3, stride=stride, padding=1, bias=False) self.bn3 = nn.BatchNorm2d((planes * 1)) self.conv3 = nn.Conv2d((planes * 1), planes * Bottleneck.outchannel_ratio, kernel_size=1, bias=False) self.bn4 = nn.BatchNorm2d(planes * Bottleneck.outchannel_ratio) self.relu = nn.ReLU(inplace=True) self.downsample = downsample self.stride = stride self.shake_drop = ShakeDrop(p_shakedrop) def forward(self, x): out = self.bn1(x) out = self.conv1(out) out = self.bn2(out) out = self.relu(out) out = self.conv2(out) out = self.bn3(out) out = self.relu(out) out = self.conv3(out) out = self.bn4(out) out = self.shake_drop(out) if self.downsample is not None: shortcut = self.downsample(x) featuremap_size = shortcut.size()[2:4] else: shortcut = x featuremap_size = out.size()[2:4] batch_size = out.size()[0] residual_channel = out.size()[1] shortcut_channel = shortcut.size()[1] if residual_channel != shortcut_channel: padding = torch.autograd.Variable( torch.cuda.FloatTensor(batch_size, residual_channel - shortcut_channel, featuremap_size[0], featuremap_size[1]).fill_(0)) out += torch.cat((shortcut, padding), 1) else: out += shortcut return out class PyramidNet(nn.Module): def __init__(self, dataset, depth, alpha, num_classes, bottleneck=True): super(PyramidNet, self).__init__() self.dataset = dataset if self.dataset.startswith('cifar'): self.inplanes = 16 if bottleneck: n = int((depth - 2) / 9) block = Bottleneck else: n = int((depth - 2) / 6) block = BasicBlock self.addrate = alpha / (3 * n * 1.0) self.ps_shakedrop = [1. - (1.0 - (0.5 / (3 * n)) * (i + 1)) for i in range(3 * n)] self.input_featuremap_dim = self.inplanes self.conv1 = nn.Conv2d(3, self.input_featuremap_dim, kernel_size=3, stride=1, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(self.input_featuremap_dim) self.featuremap_dim = self.input_featuremap_dim self.layer1 = self.pyramidal_make_layer(block, n) self.layer2 = self.pyramidal_make_layer(block, n, stride=2) self.layer3 = self.pyramidal_make_layer(block, n, stride=2) self.final_featuremap_dim = self.input_featuremap_dim self.bn_final = nn.BatchNorm2d(self.final_featuremap_dim) self.relu_final = nn.ReLU(inplace=True) self.avgpool = nn.AvgPool2d(8) self.fc = nn.Linear(self.final_featuremap_dim, num_classes) elif dataset == 'imagenet': blocks = {18: BasicBlock, 34: BasicBlock, 50: Bottleneck, 101: Bottleneck, 152: Bottleneck, 200: Bottleneck} layers = {18: [2, 2, 2, 2], 34: [3, 4, 6, 3], 50: [3, 4, 6, 3], 101: [3, 4, 23, 3], 152: [3, 8, 36, 3], 200: [3, 24, 36, 3]} if layers.get(depth) is None: if bottleneck == True: blocks[depth] = Bottleneck temp_cfg = int((depth - 2) / 12) else: blocks[depth] = BasicBlock temp_cfg = int((depth - 2) / 8) layers[depth] = [temp_cfg, temp_cfg, temp_cfg, temp_cfg] print('=> the layer configuration for each stage is set to', layers[depth]) self.inplanes = 64 self.addrate = alpha / (sum(layers[depth]) * 1.0) self.input_featuremap_dim = self.inplanes self.conv1 = nn.Conv2d(3, self.input_featuremap_dim, kernel_size=7, stride=2, padding=3, bias=False) self.bn1 = nn.BatchNorm2d(self.input_featuremap_dim) self.relu = nn.ReLU(inplace=True) self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) self.featuremap_dim = self.input_featuremap_dim self.layer1 = self.pyramidal_make_layer(blocks[depth], layers[depth][0]) self.layer2 = self.pyramidal_make_layer(blocks[depth], layers[depth][1], stride=2) self.layer3 = self.pyramidal_make_layer(blocks[depth], layers[depth][2], stride=2) self.layer4 = self.pyramidal_make_layer(blocks[depth], layers[depth][3], stride=2) self.final_featuremap_dim = self.input_featuremap_dim self.bn_final = nn.BatchNorm2d(self.final_featuremap_dim) self.relu_final = nn.ReLU(inplace=True) self.avgpool = nn.AvgPool2d(7) self.fc = nn.Linear(self.final_featuremap_dim, num_classes) for m in self.modules(): if isinstance(m, nn.Conv2d): n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels m.weight.data.normal_(0, math.sqrt(2. / n)) elif isinstance(m, nn.BatchNorm2d): m.weight.data.fill_(1) m.bias.data.zero_() assert len(self.ps_shakedrop) == 0, self.ps_shakedrop def pyramidal_make_layer(self, block, block_depth, stride=1): downsample = None if stride != 1: # or self.inplanes != int(round(featuremap_dim_1st)) * block.outchannel_ratio: downsample = nn.AvgPool2d((2, 2), stride=(2, 2), ceil_mode=True) layers = [] self.featuremap_dim = self.featuremap_dim + self.addrate layers.append(block(self.input_featuremap_dim, int(round(self.featuremap_dim)), stride, downsample, p_shakedrop=self.ps_shakedrop.pop(0))) for i in range(1, block_depth): temp_featuremap_dim = self.featuremap_dim + self.addrate layers.append( block(int(round(self.featuremap_dim)) * block.outchannel_ratio, int(round(temp_featuremap_dim)), 1, p_shakedrop=self.ps_shakedrop.pop(0))) self.featuremap_dim = temp_featuremap_dim self.input_featuremap_dim = int(round(self.featuremap_dim)) * block.outchannel_ratio return nn.Sequential(*layers) def forward(self, x): if self.dataset == 'cifar10' or self.dataset == 'cifar100': x = self.conv1(x) x = self.bn1(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.bn_final(x) x = self.relu_final(x) x = self.avgpool(x) x = x.view(x.size(0), -1) x = self.fc(x) elif self.dataset == 'imagenet': x = self.conv1(x) x = self.bn1(x) x = self.relu(x) x = self.maxpool(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.bn_final(x) x = self.relu_final(x) x = self.avgpool(x) x = x.view(x.size(0), -1) x = self.fc(x) return x ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/resnet.py ================================================ # Original code: https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py import torch.nn as nn import math def conv3x3(in_planes, out_planes, stride=1): "3x3 convolution with padding" return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False) class BasicBlock(nn.Module): expansion = 1 def __init__(self, inplanes, planes, stride=1, downsample=None): super(BasicBlock, self).__init__() self.conv1 = conv3x3(inplanes, planes, stride) self.bn1 = nn.BatchNorm2d(planes) self.conv2 = conv3x3(planes, planes) self.bn2 = nn.BatchNorm2d(planes) self.relu = nn.ReLU(inplace=True) self.downsample = downsample self.stride = stride def forward(self, x): residual = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) if self.downsample is not None: residual = self.downsample(x) out += residual out = self.relu(out) return out class Bottleneck(nn.Module): expansion = 4 def __init__(self, inplanes, planes, stride=1, downsample=None): super(Bottleneck, self).__init__() self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) self.bn1 = nn.BatchNorm2d(planes) self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(planes) self.conv3 = nn.Conv2d(planes, planes * Bottleneck.expansion, kernel_size=1, bias=False) self.bn3 = nn.BatchNorm2d(planes * Bottleneck.expansion) self.relu = nn.ReLU(inplace=True) self.downsample = downsample self.stride = stride def forward(self, x): residual = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) out = self.relu(out) out = self.conv3(out) out = self.bn3(out) if self.downsample is not None: residual = self.downsample(x) out += residual out = self.relu(out) return out class ResNet(nn.Module): def __init__(self, dataset, depth, num_classes, bottleneck=False): super(ResNet, self).__init__() self.dataset = dataset if self.dataset.startswith('cifar'): self.inplanes = 16 print(bottleneck) if bottleneck == True: n = int((depth - 2) / 9) block = Bottleneck else: n = int((depth - 2) / 6) block = BasicBlock self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=3, stride=1, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(self.inplanes) self.relu = nn.ReLU(inplace=True) self.layer1 = self._make_layer(block, 16, n) self.layer2 = self._make_layer(block, 32, n, stride=2) self.layer3 = self._make_layer(block, 64, n, stride=2) # self.avgpool = nn.AvgPool2d(8) self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) self.fc = nn.Linear(64 * block.expansion, num_classes) elif dataset == 'imagenet': blocks ={18: BasicBlock, 34: BasicBlock, 50: Bottleneck, 101: Bottleneck, 152: Bottleneck, 200: Bottleneck} layers ={18: [2, 2, 2, 2], 34: [3, 4, 6, 3], 50: [3, 4, 6, 3], 101: [3, 4, 23, 3], 152: [3, 8, 36, 3], 200: [3, 24, 36, 3]} assert layers[depth], 'invalid detph for ResNet (depth should be one of 18, 34, 50, 101, 152, and 200)' self.inplanes = 64 self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=7, stride=2, padding=3, bias=False) self.bn1 = nn.BatchNorm2d(64) self.relu = nn.ReLU(inplace=True) self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) self.layer1 = self._make_layer(blocks[depth], 64, layers[depth][0]) self.layer2 = self._make_layer(blocks[depth], 128, layers[depth][1], stride=2) self.layer3 = self._make_layer(blocks[depth], 256, layers[depth][2], stride=2) self.layer4 = self._make_layer(blocks[depth], 512, layers[depth][3], stride=2) # self.avgpool = nn.AvgPool2d(7) self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) self.fc = nn.Linear(512 * blocks[depth].expansion, num_classes) for m in self.modules(): if isinstance(m, nn.Conv2d): n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels m.weight.data.normal_(0, math.sqrt(2. / n)) elif isinstance(m, nn.BatchNorm2d): m.weight.data.fill_(1) m.bias.data.zero_() def _make_layer(self, block, planes, blocks, stride=1): downsample = None if stride != 1 or self.inplanes != planes * block.expansion: downsample = nn.Sequential( nn.Conv2d(self.inplanes, planes * block.expansion, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(planes * block.expansion), ) layers = [] layers.append(block(self.inplanes, planes, stride, downsample)) self.inplanes = planes * block.expansion for i in range(1, blocks): layers.append(block(self.inplanes, planes)) return nn.Sequential(*layers) def forward(self, x): if self.dataset == 'cifar10' or self.dataset == 'cifar100': x = self.conv1(x) x = self.bn1(x) x = self.relu(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.avgpool(x) x = x.view(x.size(0), -1) x = self.fc(x) elif self.dataset == 'imagenet': x = self.conv1(x) x = self.bn1(x) x = self.relu(x) x = self.maxpool(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.avgpool(x) x = x.view(x.size(0), -1) x = self.fc(x) return x ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/shakedrop.py ================================================ # -*- coding: utf-8 -*- import torch import torch.nn as nn import torch.nn.functional as F from torch.autograd import Variable class ShakeDropFunction(torch.autograd.Function): @staticmethod def forward(ctx, x, training=True, p_drop=0.5, alpha_range=[-1, 1]): if training: gate = torch.cuda.FloatTensor([0]).bernoulli_(1 - p_drop) ctx.save_for_backward(gate) if gate.item() == 0: alpha = torch.cuda.FloatTensor(x.size(0)).uniform_(*alpha_range) alpha = alpha.view(alpha.size(0), 1, 1, 1).expand_as(x) return alpha * x else: return x else: return (1 - p_drop) * x @staticmethod def backward(ctx, grad_output): gate = ctx.saved_tensors[0] if gate.item() == 0: beta = torch.cuda.FloatTensor(grad_output.size(0)).uniform_(0, 1) beta = beta.view(beta.size(0), 1, 1, 1).expand_as(grad_output) beta = Variable(beta) return beta * grad_output, None, None, None else: return grad_output, None, None, None class ShakeDrop(nn.Module): def __init__(self, p_drop=0.5, alpha_range=[-1, 1]): super(ShakeDrop, self).__init__() self.p_drop = p_drop self.alpha_range = alpha_range def forward(self, x): return ShakeDropFunction.apply(x, self.training, self.p_drop, self.alpha_range) ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/shakeshake/__init__.py ================================================ ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/shakeshake/shake_resnet.py ================================================ # -*- coding: utf-8 -*- import math import torch.nn as nn import torch.nn.functional as F from FastAutoAugment.networks.shakeshake.shakeshake import ShakeShake from FastAutoAugment.networks.shakeshake.shakeshake import Shortcut class ShakeBlock(nn.Module): def __init__(self, in_ch, out_ch, stride=1): super(ShakeBlock, self).__init__() self.equal_io = in_ch == out_ch self.shortcut = self.equal_io and None or Shortcut(in_ch, out_ch, stride=stride) self.branch1 = self._make_branch(in_ch, out_ch, stride) self.branch2 = self._make_branch(in_ch, out_ch, stride) def forward(self, x): h1 = self.branch1(x) h2 = self.branch2(x) h = ShakeShake.apply(h1, h2, self.training) h0 = x if self.equal_io else self.shortcut(x) return h + h0 def _make_branch(self, in_ch, out_ch, stride=1): return nn.Sequential( nn.ReLU(inplace=False), nn.Conv2d(in_ch, out_ch, 3, padding=1, stride=stride, bias=False), nn.BatchNorm2d(out_ch), nn.ReLU(inplace=False), nn.Conv2d(out_ch, out_ch, 3, padding=1, stride=1, bias=False), nn.BatchNorm2d(out_ch)) class ShakeResNet(nn.Module): def __init__(self, depth, w_base, label): super(ShakeResNet, self).__init__() n_units = (depth - 2) / 6 in_chs = [16, w_base, w_base * 2, w_base * 4] self.in_chs = in_chs self.c_in = nn.Conv2d(3, in_chs[0], 3, padding=1) self.layer1 = self._make_layer(n_units, in_chs[0], in_chs[1]) self.layer2 = self._make_layer(n_units, in_chs[1], in_chs[2], 2) self.layer3 = self._make_layer(n_units, in_chs[2], in_chs[3], 2) self.fc_out = nn.Linear(in_chs[3], label) # Initialize paramters for m in self.modules(): if isinstance(m, nn.Conv2d): n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels m.weight.data.normal_(0, math.sqrt(2. / n)) elif isinstance(m, nn.BatchNorm2d): m.weight.data.fill_(1) m.bias.data.zero_() elif isinstance(m, nn.Linear): m.bias.data.zero_() def forward(self, x): h = self.c_in(x) h = self.layer1(h) h = self.layer2(h) h = self.layer3(h) h = F.relu(h) h = F.avg_pool2d(h, 8) h = h.view(-1, self.in_chs[3]) h = self.fc_out(h) return h def _make_layer(self, n_units, in_ch, out_ch, stride=1): layers = [] for i in range(int(n_units)): layers.append(ShakeBlock(in_ch, out_ch, stride=stride)) in_ch, stride = out_ch, 1 return nn.Sequential(*layers) ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/shakeshake/shake_resnext.py ================================================ # -*- coding: utf-8 -*- import math import torch.nn as nn import torch.nn.functional as F from FastAutoAugment.networks.shakeshake.shakeshake import ShakeShake from FastAutoAugment.networks.shakeshake.shakeshake import Shortcut class ShakeBottleNeck(nn.Module): def __init__(self, in_ch, mid_ch, out_ch, cardinary, stride=1): super(ShakeBottleNeck, self).__init__() self.equal_io = in_ch == out_ch self.shortcut = None if self.equal_io else Shortcut(in_ch, out_ch, stride=stride) self.branch1 = self._make_branch(in_ch, mid_ch, out_ch, cardinary, stride) self.branch2 = self._make_branch(in_ch, mid_ch, out_ch, cardinary, stride) def forward(self, x): h1 = self.branch1(x) h2 = self.branch2(x) h = ShakeShake.apply(h1, h2, self.training) h0 = x if self.equal_io else self.shortcut(x) return h + h0 def _make_branch(self, in_ch, mid_ch, out_ch, cardinary, stride=1): return nn.Sequential( nn.Conv2d(in_ch, mid_ch, 1, padding=0, bias=False), nn.BatchNorm2d(mid_ch), nn.ReLU(inplace=False), nn.Conv2d(mid_ch, mid_ch, 3, padding=1, stride=stride, groups=cardinary, bias=False), nn.BatchNorm2d(mid_ch), nn.ReLU(inplace=False), nn.Conv2d(mid_ch, out_ch, 1, padding=0, bias=False), nn.BatchNorm2d(out_ch)) class ShakeResNeXt(nn.Module): def __init__(self, depth, w_base, cardinary, label): super(ShakeResNeXt, self).__init__() n_units = (depth - 2) // 9 n_chs = [64, 128, 256, 1024] self.n_chs = n_chs self.in_ch = n_chs[0] self.c_in = nn.Conv2d(3, n_chs[0], 3, padding=1) self.layer1 = self._make_layer(n_units, n_chs[0], w_base, cardinary) self.layer2 = self._make_layer(n_units, n_chs[1], w_base, cardinary, 2) self.layer3 = self._make_layer(n_units, n_chs[2], w_base, cardinary, 2) self.fc_out = nn.Linear(n_chs[3], label) # Initialize paramters for m in self.modules(): if isinstance(m, nn.Conv2d): n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels m.weight.data.normal_(0, math.sqrt(2. / n)) elif isinstance(m, nn.BatchNorm2d): m.weight.data.fill_(1) m.bias.data.zero_() elif isinstance(m, nn.Linear): m.bias.data.zero_() def forward(self, x): h = self.c_in(x) h = self.layer1(h) h = self.layer2(h) h = self.layer3(h) h = F.relu(h) h = F.avg_pool2d(h, 8) h = h.view(-1, self.n_chs[3]) h = self.fc_out(h) return h def _make_layer(self, n_units, n_ch, w_base, cardinary, stride=1): layers = [] mid_ch, out_ch = n_ch * (w_base // 64) * cardinary, n_ch * 4 for i in range(n_units): layers.append(ShakeBottleNeck(self.in_ch, mid_ch, out_ch, cardinary, stride=stride)) self.in_ch, stride = out_ch, 1 return nn.Sequential(*layers) ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/shakeshake/shakeshake.py ================================================ # -*- coding: utf-8 -*- import torch import torch.nn as nn import torch.nn.functional as F from torch.autograd import Variable class ShakeShake(torch.autograd.Function): @staticmethod def forward(ctx, x1, x2, training=True): if training: alpha = torch.cuda.FloatTensor(x1.size(0)).uniform_() alpha = alpha.view(alpha.size(0), 1, 1, 1).expand_as(x1) else: alpha = 0.5 return alpha * x1 + (1 - alpha) * x2 @staticmethod def backward(ctx, grad_output): beta = torch.cuda.FloatTensor(grad_output.size(0)).uniform_() beta = beta.view(beta.size(0), 1, 1, 1).expand_as(grad_output) beta = Variable(beta) return beta * grad_output, (1 - beta) * grad_output, None class Shortcut(nn.Module): def __init__(self, in_ch, out_ch, stride): super(Shortcut, self).__init__() self.stride = stride self.conv1 = nn.Conv2d(in_ch, out_ch // 2, 1, stride=1, padding=0, bias=False) self.conv2 = nn.Conv2d(in_ch, out_ch // 2, 1, stride=1, padding=0, bias=False) self.bn = nn.BatchNorm2d(out_ch) def forward(self, x): h = F.relu(x) h1 = F.avg_pool2d(h, 1, self.stride) h1 = self.conv1(h1) h2 = F.avg_pool2d(F.pad(h, (-1, 1, -1, 1)), 1, self.stride) h2 = self.conv2(h2) h = torch.cat((h1, h2), 1) return self.bn(h) ================================================ FILE: fast_autoaugment/FastAutoAugment/networks/wideresnet.py ================================================ import torch.nn as nn import torch.nn.init as init import torch.nn.functional as F import numpy as np def conv3x3(in_planes, out_planes, stride=1): return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=True) def conv_init(m): classname = m.__class__.__name__ if classname.find('Conv') != -1: init.xavier_uniform_(m.weight, gain=np.sqrt(2)) init.constant_(m.bias, 0) elif classname.find('BatchNorm') != -1: init.constant_(m.weight, 1) init.constant_(m.bias, 0) class WideBasic(nn.Module): def __init__(self, in_planes, planes, dropout_rate, stride=1): super(WideBasic, self).__init__() self.bn1 = nn.BatchNorm2d(in_planes, momentum=0.9) self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3, padding=1, bias=True) self.dropout = nn.Dropout(p=dropout_rate) self.bn2 = nn.BatchNorm2d(planes, momentum=0.9) self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=True) self.shortcut = nn.Sequential() if stride != 1 or in_planes != planes: self.shortcut = nn.Sequential( nn.Conv2d(in_planes, planes, kernel_size=1, stride=stride, bias=True), ) def forward(self, x): out = self.dropout(self.conv1(F.relu(self.bn1(x)))) out = self.conv2(F.relu(self.bn2(out))) out += self.shortcut(x) return out class WideResNet(nn.Module): def __init__(self, depth, widen_factor, dropout_rate, num_classes): super(WideResNet, self).__init__() self.in_planes = 16 assert ((depth - 4) % 6 == 0), 'Wide-resnet depth should be 6n+4' n = int((depth - 4) / 6) k = widen_factor nStages = [16, 16*k, 32*k, 64*k] self.conv1 = conv3x3(3, nStages[0]) self.layer1 = self._wide_layer(WideBasic, nStages[1], n, dropout_rate, stride=1) self.layer2 = self._wide_layer(WideBasic, nStages[2], n, dropout_rate, stride=2) self.layer3 = self._wide_layer(WideBasic, nStages[3], n, dropout_rate, stride=2) self.bn1 = nn.BatchNorm2d(nStages[3], momentum=0.9) self.linear = nn.Linear(nStages[3], num_classes) # self.apply(conv_init) def _wide_layer(self, block, planes, num_blocks, dropout_rate, stride): strides = [stride] + [1]*(num_blocks-1) layers = [] for stride in strides: layers.append(block(self.in_planes, planes, dropout_rate, stride)) self.in_planes = planes return nn.Sequential(*layers) def forward(self, x): out = self.conv1(x) out = self.layer1(out) out = self.layer2(out) out = self.layer3(out) out = F.relu(self.bn1(out)) # out = F.avg_pool2d(out, 8) out = F.adaptive_avg_pool2d(out, (1, 1)) out = out.view(out.size(0), -1) out = self.linear(out) return out ================================================ FILE: fast_autoaugment/FastAutoAugment/safe_shell_exec.py ================================================ # Copyright 2019 Uber Technologies, Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== import os import psutil import re import signal import subprocess import sys import threading import time GRACEFUL_TERMINATION_TIME_S = 5 def terminate_executor_shell_and_children(pid): print('terminate_executor_shell_and_children+', pid) # If the shell already ends, no need to terminate its child. try: p = psutil.Process(pid) except psutil.NoSuchProcess: print('nosuchprocess') return # Terminate children gracefully. for child in p.children(): try: child.terminate() except psutil.NoSuchProcess: pass # Wait for graceful termination. time.sleep(GRACEFUL_TERMINATION_TIME_S) # Send STOP to executor shell to stop progress. p.send_signal(signal.SIGSTOP) # Kill children recursively. for child in p.children(recursive=True): try: child.kill() except psutil.NoSuchProcess: pass # Kill shell itself. p.kill() print('terminate_executor_shell_and_children-', pid) def forward_stream(src_fd, dst_stream, prefix, index): with os.fdopen(src_fd, 'r') as src: line_buffer = '' while True: text = os.read(src.fileno(), 1000) if not isinstance(text, str): text = text.decode('utf-8') if not text: break for line in re.split('([\r\n])', text): line_buffer += line if line == '\r' or line == '\n': if index is not None: localtime = time.asctime(time.localtime(time.time())) line_buffer = '{time}[{rank}]<{prefix}>:{line}'.format( time=localtime, rank=str(index), prefix=prefix, line=line_buffer ) dst_stream.write(line_buffer) dst_stream.flush() line_buffer = '' def execute(command, env=None, stdout=None, stderr=None, index=None, event=None): # Make a pipe for the subprocess stdout/stderr. (stdout_r, stdout_w) = os.pipe() (stderr_r, stderr_w) = os.pipe() # Make a pipe for notifying the child that parent has died. (r, w) = os.pipe() middleman_pid = os.fork() if middleman_pid == 0: # Close unused file descriptors to enforce PIPE behavior. os.close(w) os.setsid() executor_shell = subprocess.Popen(command, shell=True, env=env, stdout=stdout_w, stderr=stderr_w) sigterm_received = threading.Event() def set_sigterm_received(signum, frame): sigterm_received.set() signal.signal(signal.SIGINT, set_sigterm_received) signal.signal(signal.SIGTERM, set_sigterm_received) def kill_executor_children_if_parent_dies(): # This read blocks until the pipe is closed on the other side # due to the process termination. os.read(r, 1) terminate_executor_shell_and_children(executor_shell.pid) bg = threading.Thread(target=kill_executor_children_if_parent_dies) bg.daemon = True bg.start() def kill_executor_children_if_sigterm_received(): sigterm_received.wait() terminate_executor_shell_and_children(executor_shell.pid) bg = threading.Thread(target=kill_executor_children_if_sigterm_received) bg.daemon = True bg.start() exit_code = executor_shell.wait() os._exit(exit_code) # Close unused file descriptors to enforce PIPE behavior. os.close(r) os.close(stdout_w) os.close(stderr_w) # Redirect command stdout & stderr to provided streams or sys.stdout/sys.stderr. # This is useful for Jupyter Notebook that uses custom sys.stdout/sys.stderr or # for redirecting to a file on disk. if stdout is None: stdout = sys.stdout if stderr is None: stderr = sys.stderr stdout_fwd = threading.Thread(target=forward_stream, args=(stdout_r, stdout, 'stdout', index)) stderr_fwd = threading.Thread(target=forward_stream, args=(stderr_r, stderr, 'stderr', index)) stdout_fwd.start() stderr_fwd.start() def kill_middleman_if_master_thread_terminate(): event.wait() try: os.kill(middleman_pid, signal.SIGTERM) except: # The process has already been killed elsewhere pass # TODO: Currently this requires explicitly declaration of the event and signal handler to set # the event (gloo_run.py:_launch_jobs()). Need to figure out a generalized way to hide this behind # interfaces. if event is not None: bg_thread = threading.Thread(target=kill_middleman_if_master_thread_terminate) bg_thread.daemon = True bg_thread.start() try: res, status = os.waitpid(middleman_pid, 0) except: # interrupted, send middleman TERM signal which will terminate children os.kill(middleman_pid, signal.SIGTERM) while True: try: _, status = os.waitpid(middleman_pid, 0) break except: # interrupted, wait for middleman to finish pass stdout_fwd.join() stderr_fwd.join() exit_code = status >> 8 return exit_code ================================================ FILE: fast_autoaugment/FastAutoAugment/search.py ================================================ import copy import os import sys import time from collections import OrderedDict, defaultdict import torch import numpy as np from hyperopt import hp import ray import gorilla from ray.tune.trial import Trial from ray.tune.trial_runner import TrialRunner from ray.tune.suggest import HyperOptSearch from ray.tune import register_trainable, run_experiments from tqdm import tqdm from FastAutoAugment.archive import remove_deplicates, policy_decoder from FastAutoAugment.augmentations import augment_list from FastAutoAugment.common import get_logger, add_filehandler from FastAutoAugment.data import get_dataloaders from FastAutoAugment.metrics import Accumulator from FastAutoAugment.networks import get_model, num_class from FastAutoAugment.train import train_and_eval from theconf import Config as C, ConfigArgumentParser top1_valid_by_cv = defaultdict(lambda: list) def step_w_log(self): original = gorilla.get_original_attribute(ray.tune.trial_runner.TrialRunner, 'step') # log cnts = OrderedDict() for status in [Trial.RUNNING, Trial.TERMINATED, Trial.PENDING, Trial.PAUSED, Trial.ERROR]: cnt = len(list(filter(lambda x: x.status == status, self._trials))) cnts[status] = cnt best_top1_acc = 0. for trial in filter(lambda x: x.status == Trial.TERMINATED, self._trials): if not trial.last_result: continue best_top1_acc = max(best_top1_acc, trial.last_result['top1_valid']) print('iter', self._iteration, 'top1_acc=%.3f' % best_top1_acc, cnts, end='\r') return original(self) patch = gorilla.Patch(ray.tune.trial_runner.TrialRunner, 'step', step_w_log, settings=gorilla.Settings(allow_hit=True)) gorilla.apply(patch) logger = get_logger('Fast AutoAugment') def _get_path(dataset, model, tag): return os.path.join(os.path.dirname(os.path.realpath(__file__)), 'models/%s_%s_%s.model' % (dataset, model, tag)) # TODO @ray.remote(num_gpus=4, max_calls=1) def train_model(config, dataroot, augment, cv_ratio_test, cv_fold, save_path=None, skip_exist=False): C.get() C.get().conf = config C.get()['aug'] = augment result = train_and_eval(None, dataroot, cv_ratio_test, cv_fold, save_path=save_path, only_eval=skip_exist) return C.get()['model']['type'], cv_fold, result def eval_tta(config, augment, reporter): C.get() C.get().conf = config cv_ratio_test, cv_fold, save_path = augment['cv_ratio_test'], augment['cv_fold'], augment['save_path'] # setup - provided augmentation rules C.get()['aug'] = policy_decoder(augment, augment['num_policy'], augment['num_op']) # eval model = get_model(C.get()['model'], num_class(C.get()['dataset'])) ckpt = torch.load(save_path) if 'model' in ckpt: model.load_state_dict(ckpt['model']) else: model.load_state_dict(ckpt) model.eval() loaders = [] for _ in range(augment['num_policy']): # TODO _, tl, validloader, tl2 = get_dataloaders(C.get()['dataset'], C.get()['batch'], augment['dataroot'], cv_ratio_test, split_idx=cv_fold) loaders.append(iter(validloader)) del tl, tl2 start_t = time.time() metrics = Accumulator() loss_fn = torch.nn.CrossEntropyLoss(reduction='none') try: while True: losses = [] corrects = [] for loader in loaders: data, label = next(loader) data = data.cuda() label = label.cuda() pred = model(data) loss = loss_fn(pred, label) losses.append(loss.detach().cpu().numpy()) _, pred = pred.topk(1, 1, True, True) pred = pred.t() correct = pred.eq(label.view(1, -1).expand_as(pred)).detach().cpu().numpy() corrects.append(correct) del loss, correct, pred, data, label losses = np.concatenate(losses) losses_min = np.min(losses, axis=0).squeeze() corrects = np.concatenate(corrects) corrects_max = np.max(corrects, axis=0).squeeze() metrics.add_dict({ 'minus_loss': -1 * np.sum(losses_min), 'correct': np.sum(corrects_max), 'cnt': len(corrects_max) }) del corrects, corrects_max except StopIteration: pass del model metrics = metrics / 'cnt' gpu_secs = (time.time() - start_t) * torch.cuda.device_count() reporter(minus_loss=metrics['minus_loss'], top1_valid=metrics['correct'], elapsed_time=gpu_secs, done=True) return metrics['correct'] if __name__ == '__main__': import json from pystopwatch2 import PyStopwatch w = PyStopwatch() parser = ConfigArgumentParser(conflict_handler='resolve') parser.add_argument('--dataroot', type=str, default='/data/private/pretrainedmodels', help='torchvision data folder') parser.add_argument('--until', type=int, default=5) parser.add_argument('--num-op', type=int, default=2) parser.add_argument('--num-policy', type=int, default=5) parser.add_argument('--num-search', type=int, default=200) parser.add_argument('--cv-ratio', type=float, default=0.4) parser.add_argument('--decay', type=float, default=-1) parser.add_argument('--redis', type=str, default='gpu-cloud-vnode30.dakao.io:23655') parser.add_argument('--per-class', action='store_true') parser.add_argument('--resume', action='store_true') parser.add_argument('--smoke-test', action='store_true') args = parser.parse_args() if args.decay > 0: logger.info('decay=%.4f' % args.decay) C.get()['optimizer']['decay'] = args.decay add_filehandler(logger, os.path.join('models', '%s_%s_cv%.1f.log' % (C.get()['dataset'], C.get()['model']['type'], args.cv_ratio))) logger.info('configuration...') logger.info(json.dumps(C.get().conf, sort_keys=True, indent=4)) logger.info('initialize ray...') ray.init(redis_address=args.redis) num_result_per_cv = 10 cv_num = 5 copied_c = copy.deepcopy(C.get().conf) logger.info('search augmentation policies, dataset=%s model=%s' % (C.get()['dataset'], C.get()['model']['type'])) logger.info('----- Train without Augmentations cv=%d ratio(test)=%.1f -----' % (cv_num, args.cv_ratio)) w.start(tag='train_no_aug') paths = [_get_path(C.get()['dataset'], C.get()['model']['type'], 'ratio%.1f_fold%d' % (args.cv_ratio, i)) for i in range(cv_num)] print(paths) reqs = [ train_model.remote(copy.deepcopy(copied_c), args.dataroot, C.get()['aug'], args.cv_ratio, i, save_path=paths[i], skip_exist=True) for i in range(cv_num)] tqdm_epoch = tqdm(range(C.get()['epoch'])) is_done = False for epoch in tqdm_epoch: while True: epochs_per_cv = OrderedDict() for cv_idx in range(cv_num): try: latest_ckpt = torch.load(paths[cv_idx]) if 'epoch' not in latest_ckpt: epochs_per_cv['cv%d' % (cv_idx + 1)] = C.get()['epoch'] continue epochs_per_cv['cv%d' % (cv_idx+1)] = latest_ckpt['epoch'] except Exception as e: continue tqdm_epoch.set_postfix(epochs_per_cv) if len(epochs_per_cv) == cv_num and min(epochs_per_cv.values()) >= C.get()['epoch']: is_done = True if len(epochs_per_cv) == cv_num and min(epochs_per_cv.values()) >= epoch: break time.sleep(10) if is_done: break logger.info('getting results...') pretrain_results = ray.get(reqs) for r_model, r_cv, r_dict in pretrain_results: logger.info('model=%s cv=%d top1_train=%.4f top1_valid=%.4f' % (r_model, r_cv+1, r_dict['top1_train'], r_dict['top1_valid'])) logger.info('processed in %.4f secs' % w.pause('train_no_aug')) if args.until == 1: sys.exit(0) logger.info('----- Search Test-Time Augmentation Policies -----') w.start(tag='search') ops = augment_list(False) space = {} for i in range(args.num_policy): for j in range(args.num_op): space['policy_%d_%d' % (i, j)] = hp.choice('policy_%d_%d' % (i, j), list(range(0, len(ops)))) space['prob_%d_%d' % (i, j)] = hp.uniform('prob_%d_ %d' % (i, j), 0.0, 1.0) space['level_%d_%d' % (i, j)] = hp.uniform('level_%d_ %d' % (i, j), 0.0, 1.0) final_policy_set = [] total_computation = 0 reward_attr = 'top1_valid' # top1_valid or minus_loss for _ in range(1): # run multiple times. for cv_fold in range(cv_num): name = "search_%s_%s_fold%d_ratio%.1f" % (C.get()['dataset'], C.get()['model']['type'], cv_fold, args.cv_ratio) print(name) register_trainable(name, lambda augs, rpt: eval_tta(copy.deepcopy(copied_c), augs, rpt)) algo = HyperOptSearch(space, max_concurrent=4*20, reward_attr=reward_attr) exp_config = { name: { 'run': name, 'num_samples': 4 if args.smoke_test else args.num_search, 'resources_per_trial': {'gpu': 1}, 'stop': {'training_iteration': args.num_policy}, 'config': { 'dataroot': args.dataroot, 'save_path': paths[cv_fold], 'cv_ratio_test': args.cv_ratio, 'cv_fold': cv_fold, 'num_op': args.num_op, 'num_policy': args.num_policy }, } } results = run_experiments(exp_config, search_alg=algo, scheduler=None, verbose=0, queue_trials=True, resume=args.resume, raise_on_failed_trial=False) print() results = [x for x in results if x.last_result is not None] results = sorted(results, key=lambda x: x.last_result[reward_attr], reverse=True) # calculate computation usage for result in results: total_computation += result.last_result['elapsed_time'] for result in results[:num_result_per_cv]: final_policy = policy_decoder(result.config, args.num_policy, args.num_op) logger.info('loss=%.12f top1_valid=%.4f %s' % (result.last_result['minus_loss'], result.last_result['top1_valid'], final_policy)) final_policy = remove_deplicates(final_policy) final_policy_set.extend(final_policy) logger.info(json.dumps(final_policy_set)) logger.info('final_policy=%d' % len(final_policy_set)) logger.info('processed in %.4f secs, gpu hours=%.4f' % (w.pause('search'), total_computation / 3600.)) logger.info('----- Train with Augmentations model=%s dataset=%s aug=%s ratio(test)=%.1f -----' % (C.get()['model']['type'], C.get()['dataset'], C.get()['aug'], args.cv_ratio)) w.start(tag='train_aug') num_experiments = 5 default_path = [_get_path(C.get()['dataset'], C.get()['model']['type'], 'ratio%.1f_default%d' % (args.cv_ratio, _)) for _ in range(num_experiments)] augment_path = [_get_path(C.get()['dataset'], C.get()['model']['type'], 'ratio%.1f_augment%d' % (args.cv_ratio, _)) for _ in range(num_experiments)] reqs = [train_model.remote(copy.deepcopy(copied_c), args.dataroot, C.get()['aug'], 0.0, 0, save_path=default_path[_], skip_exist=True) for _ in range(num_experiments)] + \ [train_model.remote(copy.deepcopy(copied_c), args.dataroot, final_policy_set, 0.0, 0, save_path=augment_path[_]) for _ in range(num_experiments)] tqdm_epoch = tqdm(range(C.get()['epoch'])) is_done = False for epoch in tqdm_epoch: while True: epochs = OrderedDict() for exp_idx in range(num_experiments): try: if os.path.exists(default_path[exp_idx]): latest_ckpt = torch.load(default_path[exp_idx]) epochs['default_exp%d' % (exp_idx + 1)] = latest_ckpt['epoch'] except: pass try: if os.path.exists(augment_path[exp_idx]): latest_ckpt = torch.load(augment_path[exp_idx]) epochs['augment_exp%d' % (exp_idx + 1)] = latest_ckpt['epoch'] except: pass tqdm_epoch.set_postfix(epochs) if len(epochs) == num_experiments*2 and min(epochs.values()) >= C.get()['epoch']: is_done = True if len(epochs) == num_experiments*2 and min(epochs.values()) >= epoch: break time.sleep(10) if is_done: break logger.info('getting results...') final_results = ray.get(reqs) for train_mode in ['default', 'augment']: avg = 0. for _ in range(num_experiments): r_model, r_cv, r_dict = final_results.pop(0) logger.info('[%s] top1_train=%.4f top1_test=%.4f' % (train_mode, r_dict['top1_train'], r_dict['top1_test'])) avg += r_dict['top1_test'] avg /= num_experiments logger.info('[%s] top1_test average=%.4f (#experiments=%d)' % (train_mode, avg, num_experiments)) logger.info('processed in %.4f secs' % w.pause('train_aug')) logger.info(w) ================================================ FILE: fast_autoaugment/FastAutoAugment/tf_port/__init__.py ================================================ ================================================ FILE: fast_autoaugment/FastAutoAugment/tf_port/rmsprop.py ================================================ import torch from torch.optim.optimizer import Optimizer class RMSpropTF(Optimizer): r"""Implements RMSprop algorithm. Reimplement original formulation to match TF rmsprop Proposed by G. Hinton in his `course `_. The centered version first appears in `Generating Sequences With Recurrent Neural Networks `_. The implementation here takes the square root of the gradient average before adding epsilon (note that TensorFlow interchanges these two operations). The effective learning rate is thus :math:`\alpha/(\sqrt{v + \epsilon})` where :math:`\alpha` from :math:`\alpha/(\sqrt{v} + \epsilon)` where :math:`\alpha` is the scheduled learning rate and :math:`v` is the weighted moving average of the squared gradient. Arguments: params (iterable): iterable of parameters to optimize or dicts defining parameter groups lr (float, optional): learning rate (default: 1e-2) momentum (float, optional): momentum factor (default: 0) alpha (float, optional): smoothing constant (default: 0.99) eps (float, optional): term added to the denominator to improve numerical stability (default: 1e-8) centered (bool, optional) : if ``True``, compute the centered RMSProp, the gradient is normalized by an estimation of its variance weight_decay (float, optional): weight decay (L2 penalty) (default: 0) """ def __init__(self, params, lr=1e-2, alpha=0.99, eps=1e-8, momentum=0, weight_decay=0.0): if not 0.0 <= lr: raise ValueError("Invalid learning rate: {}".format(lr)) if not 0.0 <= eps: raise ValueError("Invalid epsilon value: {}".format(eps)) if not 0.0 < momentum: raise ValueError("Invalid momentum value: {}".format(momentum)) if not 0.0 <= alpha: raise ValueError("Invalid alpha value: {}".format(alpha)) assert momentum > 0.0 defaults = dict(lr=lr, momentum=momentum, alpha=alpha, eps=eps, weight_decay=weight_decay) super(RMSpropTF, self).__init__(params, defaults) self.initialized = False def __setstate__(self, state): super(RMSpropTF, self).__setstate__(state) for group in self.param_groups: group.setdefault('momentum', 0) def load_state_dict(self, state_dict): super(RMSpropTF, self).load_state_dict(state_dict) self.initialized = True def step(self, closure=None): """Performs a single optimization step. We modified pytorch's RMSProp to be same as Tensorflow's See : https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/training_ops.cc#L485 Arguments: closure (callable, optional): A closure that reevaluates the model and returns the loss. """ loss = None if closure is not None: loss = closure() for group in self.param_groups: for p in group['params']: if p.grad is None: continue grad = p.grad.data if grad.is_sparse: raise RuntimeError('RMSprop does not support sparse gradients') state = self.state[p] # State initialization if len(state) == 0: assert not self.initialized state['step'] = 0 state['ms'] = torch.ones_like(p.data) #, memory_format=torch.preserve_format) state['mom'] = torch.zeros_like(p.data) #, memory_format=torch.preserve_format) # weight decay ----- if group['weight_decay'] > 0: grad = grad.add(group['weight_decay'], p.data) rho = group['alpha'] ms = state['ms'] mom = state['mom'] state['step'] += 1 # ms.mul_(rho).addcmul_(1 - rho, grad, grad) ms.add_(torch.mul(grad, grad).add_(-ms) * (1. - rho)) assert group['momentum'] > 0 # new rmsprop mom.mul_(group['momentum']).addcdiv_(group['lr'], grad, (ms + group['eps']).sqrt()) p.data.add_(-1.0, mom) return loss ================================================ FILE: fast_autoaugment/FastAutoAugment/tf_port/tpu_bn.py ================================================ import torch from torch.nn import BatchNorm2d from torch.nn.parameter import Parameter import torch.distributed as dist from torch import nn class TpuBatchNormalization(nn.Module): # Ref : https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/utils.py#L113 def __init__(self, num_features, eps=1e-5, momentum=0.1, affine=True, track_running_stats=True): super(TpuBatchNormalization, self).__init__() # num_features, eps, momentum, affine, track_running_stats) self.weight = Parameter(torch.ones(num_features)) self.bias = Parameter(torch.zeros(num_features)) self.register_buffer('running_mean', torch.zeros(num_features)) self.register_buffer('running_var', torch.ones(num_features)) self.register_buffer('num_batches_tracked', torch.tensor(0, dtype=torch.long)) self.eps = eps self.momentum = momentum def _reduce_avg(self, t): dist.all_reduce(t, dist.ReduceOp.SUM) t.mul_(1. / dist.get_world_size()) def forward(self, input): if not self.training or not dist.is_initialized(): bn = (input - self.running_mean.view(1, self.running_mean.shape[0], 1, 1)) / \ (torch.sqrt(self.running_var.view(1, self.running_var.shape[0], 1, 1) + self.eps)) # print(self.weight.shape, self.bias.shape) return bn.mul(self.weight.view(1, self.weight.shape[0], 1, 1)).add(self.bias.view(1, self.bias.shape[0], 1, 1)) shard_mean, shard_invstd = torch.batch_norm_stats(input, self.eps) shard_vars = (1. / shard_invstd) ** 2 - self.eps shard_square_of_mean = torch.mul(shard_mean, shard_mean) shard_mean_of_square = shard_vars + shard_square_of_mean group_mean = shard_mean.clone().detach() self._reduce_avg(group_mean) group_mean_of_square = shard_mean_of_square.clone().detach() self._reduce_avg(group_mean_of_square) group_vars = group_mean_of_square - torch.mul(group_mean, group_mean) group_mean = group_mean.detach() group_vars = group_vars.detach() # print(self.running_mean.shape, self.running_var.shape) self.running_mean.mul_(1. - self.momentum).add_(group_mean.mul(self.momentum)) self.running_var.mul_(1. - self.momentum).add_(group_vars.mul(self.momentum)) self.num_batches_tracked.add_(1) # print(input.shape, group_mean.view(1, group_mean.shape[0], 1, 1).shape, group_vars.view(1, group_vars.shape[0], 1, 1).shape, self.eps) bn = (input - group_mean.view(1, group_mean.shape[0], 1, 1)) / (torch.sqrt(group_vars.view(1, group_vars.shape[0], 1, 1) + self.eps)) # print(self.weight.shape, self.bias.shape) return bn.mul(self.weight.view(1, self.weight.shape[0], 1, 1)).add(self.bias.view(1, self.bias.shape[0], 1, 1)) ================================================ FILE: fast_autoaugment/FastAutoAugment/train.py ================================================ import pathlib import sys sys.path.append(str(pathlib.Path(__file__).parent.parent.absolute())) import itertools import json import logging import math import os from collections import OrderedDict import torch from torch import nn, optim from torch.nn.parallel.data_parallel import DataParallel from torch.nn.parallel import DistributedDataParallel import torch.distributed as dist from tqdm import tqdm from theconf import Config as C, ConfigArgumentParser from FastAutoAugment.common import get_logger, EMA, add_filehandler from FastAutoAugment.data import get_dataloaders from FastAutoAugment.lr_scheduler import adjust_learning_rate_resnet from FastAutoAugment.metrics import accuracy, Accumulator, CrossEntropyLabelSmooth from FastAutoAugment.networks import get_model, num_class from FastAutoAugment.tf_port.rmsprop import RMSpropTF from FastAutoAugment.aug_mixup import CrossEntropyMixUpLabelSmooth, mixup from warmup_scheduler import GradualWarmupScheduler logger = get_logger('Fast AutoAugment') logger.setLevel(logging.INFO) def run_epoch(model, loader, loss_fn, optimizer, desc_default='', epoch=0, writer=None, verbose=1, scheduler=None, is_master=True, ema=None, wd=0.0, tqdm_disabled=False): if verbose: loader = tqdm(loader, disable=tqdm_disabled) loader.set_description('[%s %04d/%04d]' % (desc_default, epoch, C.get()['epoch'])) params_without_bn = [params for name, params in model.named_parameters() if not ('_bn' in name or '.bn' in name)] loss_ema = None metrics = Accumulator() cnt = 0 total_steps = len(loader) steps = 0 for data, label in loader: steps += 1 data, label = data.cuda(), label.cuda() if C.get().conf.get('mixup', 0.0) <= 0.0 or optimizer is None: preds = model(data) loss = loss_fn(preds, label) else: # mixup data, targets, shuffled_targets, lam = mixup(data, label, C.get()['mixup']) preds = model(data) loss = loss_fn(preds, targets, shuffled_targets, lam) del shuffled_targets, lam if optimizer: loss += wd * (1. / 2.) * sum([torch.sum(p ** 2) for p in params_without_bn]) loss.backward() grad_clip = C.get()['optimizer'].get('clip', 5.0) if grad_clip > 0: nn.utils.clip_grad_norm_(model.parameters(), grad_clip) optimizer.step() optimizer.zero_grad() if ema is not None: ema(model, (epoch - 1) * total_steps + steps) top1, top5 = accuracy(preds, label, (1, 5)) metrics.add_dict({ 'loss': loss.item() * len(data), 'top1': top1.item() * len(data), 'top5': top5.item() * len(data), }) cnt += len(data) if loss_ema: loss_ema = loss_ema * 0.9 + loss.item() * 0.1 else: loss_ema = loss.item() if verbose: postfix = metrics / cnt if optimizer: postfix['lr'] = optimizer.param_groups[0]['lr'] postfix['loss_ema'] = loss_ema loader.set_postfix(postfix) if scheduler is not None: scheduler.step(epoch - 1 + float(steps) / total_steps) del preds, loss, top1, top5, data, label if tqdm_disabled and verbose: if optimizer: logger.info('[%s %03d/%03d] %s lr=%.6f', desc_default, epoch, C.get()['epoch'], metrics / cnt, optimizer.param_groups[0]['lr']) else: logger.info('[%s %03d/%03d] %s', desc_default, epoch, C.get()['epoch'], metrics / cnt) metrics /= cnt if optimizer: metrics.metrics['lr'] = optimizer.param_groups[0]['lr'] if verbose: for key, value in metrics.items(): writer.add_scalar(key, value, epoch) return metrics def train_and_eval(tag, dataroot, test_ratio=0.0, cv_fold=0, reporter=None, metric='last', save_path=None, only_eval=False, local_rank=-1, evaluation_interval=5): total_batch = C.get()["batch"] if local_rank >= 0: dist.init_process_group(backend='nccl', init_method='env://', world_size=int(os.environ['WORLD_SIZE'])) device = torch.device('cuda', local_rank) torch.cuda.set_device(device) C.get()['lr'] *= dist.get_world_size() logger.info(f'local batch={C.get()["batch"]} world_size={dist.get_world_size()} ----> total batch={C.get()["batch"] * dist.get_world_size()}') total_batch = C.get()["batch"] * dist.get_world_size() is_master = local_rank < 0 or dist.get_rank() == 0 if is_master: add_filehandler(logger, args.save + '.log') if not reporter: reporter = lambda **kwargs: 0 max_epoch = C.get()['epoch'] trainsampler, trainloader, validloader, testloader_ = get_dataloaders(C.get()['dataset'], C.get()['batch'], dataroot, test_ratio, split_idx=cv_fold, multinode=(local_rank >= 0)) # create a model & an optimizer model = get_model(C.get()['model'], num_class(C.get()['dataset']), local_rank=local_rank) model_ema = get_model(C.get()['model'], num_class(C.get()['dataset']), local_rank=-1) model_ema.eval() criterion_ce = criterion = CrossEntropyLabelSmooth(num_class(C.get()['dataset']), C.get().conf.get('lb_smooth', 0)) if C.get().conf.get('mixup', 0.0) > 0.0: criterion = CrossEntropyMixUpLabelSmooth(num_class(C.get()['dataset']), C.get().conf.get('lb_smooth', 0)) if C.get()['optimizer']['type'] == 'sgd': optimizer = optim.SGD( model.parameters(), lr=C.get()['lr'], momentum=C.get()['optimizer'].get('momentum', 0.9), weight_decay=0.0, nesterov=C.get()['optimizer'].get('nesterov', True) ) elif C.get()['optimizer']['type'] == 'rmsprop': optimizer = RMSpropTF( model.parameters(), lr=C.get()['lr'], weight_decay=0.0, alpha=0.9, momentum=0.9, eps=0.001 ) else: raise ValueError('invalid optimizer type=%s' % C.get()['optimizer']['type']) lr_scheduler_type = C.get()['lr_schedule'].get('type', 'cosine') if lr_scheduler_type == 'cosine': scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=C.get()['epoch'], eta_min=0.) elif lr_scheduler_type == 'resnet': scheduler = adjust_learning_rate_resnet(optimizer) elif lr_scheduler_type == 'efficientnet': scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda x: 0.97 ** int((x + C.get()['lr_schedule']['warmup']['epoch']) / 2.4)) else: raise ValueError('invalid lr_schduler=%s' % lr_scheduler_type) if C.get()['lr_schedule'].get('warmup', None) and C.get()['lr_schedule']['warmup']['epoch'] > 0: scheduler = GradualWarmupScheduler( optimizer, multiplier=C.get()['lr_schedule']['warmup']['multiplier'], total_epoch=C.get()['lr_schedule']['warmup']['epoch'], after_scheduler=scheduler ) if not tag or not is_master: from FastAutoAugment.metrics import SummaryWriterDummy as SummaryWriter logger.warning('tag not provided, no tensorboard log.') else: from tensorboardX import SummaryWriter writers = [SummaryWriter(log_dir='./logs/%s/%s' % (tag, x)) for x in ['train', 'valid', 'test']] if C.get()['optimizer']['ema'] > 0.0 and is_master: # https://discuss.pytorch.org/t/how-to-apply-exponential-moving-average-decay-for-variables/10856/4?u=ildoonet ema = EMA(C.get()['optimizer']['ema']) else: ema = None result = OrderedDict() epoch_start = 1 if save_path != 'test.pth': # and is_master: --> should load all data(not able to be broadcasted) if save_path and os.path.exists(save_path): logger.info('%s file found. loading...' % save_path) data = torch.load(save_path) key = 'model' if 'model' in data else 'state_dict' if 'epoch' not in data: model.load_state_dict(data) else: logger.info('checkpoint epoch@%d' % data['epoch']) if not isinstance(model, (DataParallel, DistributedDataParallel)): model.load_state_dict({k.replace('module.', ''): v for k, v in data[key].items()}) else: model.load_state_dict({k if 'module.' in k else 'module.'+k: v for k, v in data[key].items()}) logger.info('optimizer.load_state_dict+') optimizer.load_state_dict(data['optimizer']) if data['epoch'] < C.get()['epoch']: epoch_start = data['epoch'] else: only_eval = True if ema is not None: ema.shadow = data.get('ema', {}) if isinstance(data.get('ema', {}), dict) else data['ema'].state_dict() del data else: logger.info('"%s" file not found. skip to pretrain weights...' % save_path) if only_eval: logger.warning('model checkpoint not found. only-evaluation mode is off.') only_eval = False if local_rank >= 0: for name, x in model.state_dict().items(): dist.broadcast(x, 0) logger.info(f'multinode init. local_rank={dist.get_rank()} is_master={is_master}') torch.cuda.synchronize() tqdm_disabled = bool(os.environ.get('TASK_NAME', '')) and local_rank != 0 # KakaoBrain Environment if only_eval: logger.info('evaluation only+') model.eval() rs = dict() rs['train'] = run_epoch(model, trainloader, criterion, None, desc_default='train', epoch=0, writer=writers[0], is_master=is_master) with torch.no_grad(): rs['valid'] = run_epoch(model, validloader, criterion, None, desc_default='valid', epoch=0, writer=writers[1], is_master=is_master) rs['test'] = run_epoch(model, testloader_, criterion, None, desc_default='*test', epoch=0, writer=writers[2], is_master=is_master) if ema is not None and len(ema) > 0: model_ema.load_state_dict({k.replace('module.', ''): v for k, v in ema.state_dict().items()}) rs['valid'] = run_epoch(model_ema, validloader, criterion_ce, None, desc_default='valid(EMA)', epoch=0, writer=writers[1], verbose=is_master, tqdm_disabled=tqdm_disabled) rs['test'] = run_epoch(model_ema, testloader_, criterion_ce, None, desc_default='*test(EMA)', epoch=0, writer=writers[2], verbose=is_master, tqdm_disabled=tqdm_disabled) for key, setname in itertools.product(['loss', 'top1', 'top5'], ['train', 'valid', 'test']): if setname not in rs: continue result['%s_%s' % (key, setname)] = rs[setname][key] result['epoch'] = 0 return result # train loop best_top1 = 0 for epoch in range(epoch_start, max_epoch + 1): if local_rank >= 0: trainsampler.set_epoch(epoch) model.train() rs = dict() rs['train'] = run_epoch(model, trainloader, criterion, optimizer, desc_default='train', epoch=epoch, writer=writers[0], verbose=(is_master and local_rank <= 0), scheduler=scheduler, ema=ema, wd=C.get()['optimizer']['decay'], tqdm_disabled=tqdm_disabled) model.eval() if math.isnan(rs['train']['loss']): raise Exception('train loss is NaN.') if ema is not None and C.get()['optimizer']['ema_interval'] > 0 and epoch % C.get()['optimizer']['ema_interval'] == 0: logger.info(f'ema synced+ rank={dist.get_rank()}') if ema is not None: model.load_state_dict(ema.state_dict()) for name, x in model.state_dict().items(): # print(name) dist.broadcast(x, 0) torch.cuda.synchronize() logger.info(f'ema synced- rank={dist.get_rank()}') if is_master and (epoch % evaluation_interval == 0 or epoch == max_epoch): with torch.no_grad(): rs['valid'] = run_epoch(model, validloader, criterion_ce, None, desc_default='valid', epoch=epoch, writer=writers[1], verbose=is_master, tqdm_disabled=tqdm_disabled) rs['test'] = run_epoch(model, testloader_, criterion_ce, None, desc_default='*test', epoch=epoch, writer=writers[2], verbose=is_master, tqdm_disabled=tqdm_disabled) if ema is not None: model_ema.load_state_dict({k.replace('module.', ''): v for k, v in ema.state_dict().items()}) rs['valid'] = run_epoch(model_ema, validloader, criterion_ce, None, desc_default='valid(EMA)', epoch=epoch, writer=writers[1], verbose=is_master, tqdm_disabled=tqdm_disabled) rs['test'] = run_epoch(model_ema, testloader_, criterion_ce, None, desc_default='*test(EMA)', epoch=epoch, writer=writers[2], verbose=is_master, tqdm_disabled=tqdm_disabled) logger.info( f'epoch={epoch} ' f'[train] loss={rs["train"]["loss"]:.4f} top1={rs["train"]["top1"]:.4f} ' f'[valid] loss={rs["valid"]["loss"]:.4f} top1={rs["valid"]["top1"]:.4f} ' f'[test] loss={rs["test"]["loss"]:.4f} top1={rs["test"]["top1"]:.4f} ' ) if metric == 'last' or rs[metric]['top1'] > best_top1: if metric != 'last': best_top1 = rs[metric]['top1'] for key, setname in itertools.product(['loss', 'top1', 'top5'], ['train', 'valid', 'test']): result['%s_%s' % (key, setname)] = rs[setname][key] result['epoch'] = epoch writers[1].add_scalar('valid_top1/best', rs['valid']['top1'], epoch) writers[2].add_scalar('test_top1/best', rs['test']['top1'], epoch) reporter( loss_valid=rs['valid']['loss'], top1_valid=rs['valid']['top1'], loss_test=rs['test']['loss'], top1_test=rs['test']['top1'] ) # save checkpoint if is_master and save_path: logger.info('save model@%d to %s, err=%.4f' % (epoch, save_path, 1 - best_top1)) torch.save({ 'epoch': epoch, 'log': { 'train': rs['train'].get_dict(), 'valid': rs['valid'].get_dict(), 'test': rs['test'].get_dict(), }, 'optimizer': optimizer.state_dict(), 'model': model.state_dict(), 'ema': ema.state_dict() if ema is not None else None, }, save_path) del model result['top1_test'] = best_top1 return result if __name__ == '__main__': parser = ConfigArgumentParser(conflict_handler='resolve') parser.add_argument('--tag', type=str, default='') parser.add_argument('--dataroot', type=str, default='/data/private/pretrainedmodels', help='torchvision data folder') parser.add_argument('--save', type=str, default='test.pth') parser.add_argument('--cv-ratio', type=float, default=0.0) parser.add_argument('--cv', type=int, default=0) parser.add_argument('--local_rank', type=int, default=-1) parser.add_argument('--evaluation-interval', type=int, default=5) parser.add_argument('--only-eval', action='store_true') args = parser.parse_args() assert (args.only_eval and args.save) or not args.only_eval, 'checkpoint path not provided in evaluation mode.' if not args.only_eval: if args.save: logger.info('checkpoint will be saved at %s' % args.save) else: logger.warning('Provide --save argument to save the checkpoint. Without it, training result will not be saved!') import time t = time.time() result = train_and_eval(args.tag, args.dataroot, test_ratio=args.cv_ratio, cv_fold=args.cv, save_path=args.save, only_eval=args.only_eval, local_rank=args.local_rank, metric='test', evaluation_interval=args.evaluation_interval) elapsed = time.time() - t logger.info('done.') logger.info('model: %s' % C.get()['model']) logger.info('augmentation: %s' % C.get()['aug']) logger.info('\n' + json.dumps(result, indent=4)) logger.info('elapsed time: %.3f Hours' % (elapsed / 3600.)) logger.info('top1 error in testset: %.4f' % (1. - result['top1_test'])) logger.info(args.save) ================================================ FILE: fast_autoaugment/FastAutoAugment/train_dist.py ================================================ import pathlib import sys sys.path.append(str(pathlib.Path(__file__).parent.parent.absolute())) import time import os import threading import six from six.moves import queue from FastAutoAugment import safe_shell_exec def _exec_command(command): host_output = six.StringIO() try: exit_code = safe_shell_exec.execute(command, stdout=host_output, stderr=host_output) if exit_code != 0: print('Launching task function was not successful:\n{host_output}'.format(host_output=host_output.getvalue())) os._exit(exit_code) finally: host_output.close() return exit_code def execute_function_multithreaded(fn, args_list, block_until_all_done=True, max_concurrent_executions=1000): """ Executes fn in multiple threads each with one set of the args in the args_list. :param fn: function to be executed :type fn: :param args_list: :type args_list: list(list) :param block_until_all_done: if is True, function will block until all the threads are done and will return the results of each thread's execution. :type block_until_all_done: bool :param max_concurrent_executions: :type max_concurrent_executions: int :return: If block_until_all_done is False, returns None. If block_until_all_done is True, function returns the dict of results. { index: execution result of fn with args_list[index] } :rtype: dict """ result_queue = queue.Queue() worker_queue = queue.Queue() for i, arg in enumerate(args_list): arg.append(i) worker_queue.put(arg) def fn_execute(): while True: try: arg = worker_queue.get(block=False) except queue.Empty: return exec_index = arg[-1] res = fn(*arg[:-1]) result_queue.put((exec_index, res)) threads = [] number_of_threads = min(max_concurrent_executions, len(args_list)) for _ in range(number_of_threads): thread = threading.Thread(target=fn_execute) if not block_until_all_done: thread.daemon = True thread.start() threads.append(thread) # Returns the results only if block_until_all_done is set. results = None if block_until_all_done: # Because join() cannot be interrupted by signal, a single join() # needs to be separated into join()s with timeout in a while loop. have_alive_child = True while have_alive_child: have_alive_child = False for t in threads: t.join(0.1) if t.is_alive(): have_alive_child = True results = {} while not result_queue.empty(): item = result_queue.get() results[item[0]] = item[1] if len(results) != len(args_list): raise RuntimeError( 'Some threads for func {func} did not complete ' 'successfully.'.format(func=fn.__name__)) return results if __name__ == '__main__': import argparse parser = argparse.ArgumentParser() parser.add_argument('--host', type=str) parser.add_argument('--num-gpus', type=int, default=4) parser.add_argument('--master', type=str, default='task1') parser.add_argument('--port', type=int, default=1958) parser.add_argument('-c', '--conf', type=str) parser.add_argument('--args', type=str, default='') args = parser.parse_args() try: hosts = ['task%d' % (x + 1) for x in range(int(args.host))] except: hosts = args.host.split(',') cwd = os.getcwd() command_list = [] for node_rank, host in enumerate(hosts): ssh_cmd = f'ssh -t -t -o StrictHostKeyChecking=no {host} -p 22 ' \ f'\'bash -O huponexit -c "cd {cwd} && ' \ f'python -m torch.distributed.launch --nproc_per_node={args.num_gpus} --nnodes={len(hosts)} ' \ f'--master_addr={args.master} --master_port={args.port} --node_rank={node_rank} ' \ f'FastAutoAugment/train.py -c {args.conf} {args.args}"' \ '\'' print(ssh_cmd) command_list.append([ssh_cmd]) execute_function_multithreaded(_exec_command, command_list[1:], block_until_all_done=False) print(command_list[0]) while True: time.sleep(1) # thread = threading.Thread(target=safe_shell_exec.execute, args=(command_list[0][0],)) # thread.start() # thread.join() # while True: # time.sleep(1) ================================================ FILE: fast_autoaugment/LICENSE ================================================ MIT License Copyright (c) 2019 Ildoo Kim Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: fast_autoaugment/README.md ================================================ # Fast AutoAugment **(Accepted at NeurIPS 2019)** Official [Fast AutoAugment](https://arxiv.org/abs/1905.00397) implementation in PyTorch. - Fast AutoAugment learns augmentation policies using a more efficient search strategy based on density matching. - Fast AutoAugment speeds up the search time by orders of magnitude while maintaining the comparable performances.

## Results ### CIFAR-10 / 100 Search : **3.5 GPU Hours (1428x faster than AutoAugment)**, WResNet-40x2 on Reduced CIFAR-10 | Model(CIFAR-10) | Baseline | Cutout | AutoAugment | Fast AutoAugment
(transfer/direct) | | |-------------------------|------------|------------|-------------|------------------|----| | Wide-ResNet-40-2 | 5.3 | 4.1 | 3.7 | 3.6 / 3.7 | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/cifar10_wresnet40x2_top1_3.52.pth) | | Wide-ResNet-28-10 | 3.9 | 3.1 | 2.6 | 2.7 / 2.7 | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/cifar10_wresnet28x10_top1.pth) | | Shake-Shake(26 2x32d) | 3.6 | 3.0 | 2.5 | 2.7 / 2.5 | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/cifar10_shake26_2x32d_top1_2.68.pth) | | Shake-Shake(26 2x96d) | 2.9 | 2.6 | 2.0 | 2.0 / 2.0 | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/cifar10_shake26_2x96d_top1_1.97.pth) | | Shake-Shake(26 2x112d) | 2.8 | 2.6 | 1.9 | 2.0 / 1.9 | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/cifar10_shake26_2x112d_top1_2.04.pth) | | PyramidNet+ShakeDrop | 2.7 | 2.3 | 1.5 | 1.8 / 1.7 | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/cifar10_pyramid272_top1_1.44.pth) | | Model(CIFAR-100) | Baseline | Cutout | AutoAugment | Fast AutoAugment
(transfer/direct) | | |-----------------------|------------|------------|-------------|------------------|----| | Wide-ResNet-40-2 | 26.0 | 25.2 | 20.7 | 20.7 / 20.6 | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/cifar100_wresnet40x2_top1_20.43.pth) | | Wide-ResNet-28-10 | 18.8 | 18.4 | 17.1 | 17.3 / 17.3 | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/cifar100_wresnet28x10_top1_17.17.pth) | | Shake-Shake(26 2x96d) | 17.1 | 16.0 | 14.3 | 14.9 / 14.6 | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/cifar100_shake26_2x96d_top1_15.15.pth) | | PyramidNet+ShakeDrop | 14.0 | 12.2 | 10.7 | 11.9 / 11.7 | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/cifar100_pyramid272_top1_11.74.pth) | ### ImageNet Search : **450 GPU Hours (33x faster than AutoAugment)**, ResNet-50 on Reduced ImageNet | Model | Baseline | AutoAugment | Fast AutoAugment
(Top1/Top5) | | |------------|------------|-------------|------------------|----| | ResNet-50 | 23.7 / 6.9 | 22.4 / 6.2 | **22.4 / 6.3** | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/imagenet_resnet50_top1_22.2.pth) | | ResNet-200 | 21.5 / 5.8 | 20.0 / 5.0 | **19.4 / 4.7** | [Download](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/imagenet_resnet200_top1_19.4.pth) | Notes * We evaluated resnet-50 and resnet-200 with resolution of 224 and 320, respectively. According to the original resnet paper, resnet 200 was tested with the resolution of 320. Also our resnet-200 baseline's performance was similar when we use the resolution. * But with recent our code clean-up and bugfixes, we've found that the baseline performs similar to the baseline even using 224x224. * When we use 224x224, resnet-200 performs **20.0 / 5.2**. Download link for the trained model is [here](https://arena.kakaocdn.net/brainrepo/fast-autoaugment/imagenet_resnet200_res224.pth). We have conducted additional experiments with EfficientNet. | Model | Baseline | AutoAugment | | Our Baseline(Batch) | +Fast AA | |-------|------------|-------------|---|---------------------|----------| | B0 | 23.2 | 22.7 | | 22.96 | 22.68 | ### SVHN Test Search : **1.5 GPU Hours** | | Baseline | AutoAug / Our | Fast AutoAugment | |----------------------------------|---------:|--------------:|--------:| | Wide-Resnet28x10 | 1.5 | 1.1 | 1.1 | ## Run We conducted experiments under - python 3.6.9 - pytorch 1.2.0, torchvision 0.4.0, cuda10 ### Search a augmentation policy Please read ray's document to construct a proper ray cluster : https://github.com/ray-project/ray, and run search.py with the master's redis address. ``` $ python search.py -c confs/wresnet40x2_cifar10_b512.yaml --dataroot ... --redis ... ``` ### Train a model with found policies You can train network architectures on CIFAR-10 / 100 and ImageNet with our searched policies. - fa_reduced_cifar10 : reduced CIFAR-10(4k images), WResNet-40x2 - fa_reduced_imagenet : reduced ImageNet(50k images, 120 classes), ResNet-50 ``` $ export PYTHONPATH=$PYTHONPATH:$PWD $ python FastAutoAugment/train.py -c confs/wresnet40x2_cifar10_b512.yaml --aug fa_reduced_cifar10 --dataset cifar10 $ python FastAutoAugment/train.py -c confs/wresnet40x2_cifar10_b512.yaml --aug fa_reduced_cifar10 --dataset cifar100 $ python FastAutoAugment/train.py -c confs/wresnet28x10_cifar10_b512.yaml --aug fa_reduced_cifar10 --dataset cifar10 $ python FastAutoAugment/train.py -c confs/wresnet28x10_cifar10_b512.yaml --aug fa_reduced_cifar10 --dataset cifar100 ... $ python FastAutoAugment/train.py -c confs/resnet50_b512.yaml --aug fa_reduced_imagenet $ python FastAutoAugment/train.py -c confs/resnet200_b512.yaml --aug fa_reduced_imagenet ``` By adding --only-eval and --save arguments, you can test trained models without training. If you want to train with multi-gpu/node, use `torch.distributed.launch` such as ```bash $ python -m torch.distributed.launch --nproc_per_node={num_gpu_per_node} --nnodes={num_node} --master_addr={master} --master_port={master_port} --node_rank={0,1,2,...,num_node} FastAutoAugment/train.py -c confs/efficientnet_b4.yaml --aug fa_reduced_imagenet ``` ## Citation If you use this code in your research, please cite our [paper](https://arxiv.org/abs/1905.00397). ``` @inproceedings{lim2019fast, title={Fast AutoAugment}, author={Lim, Sungbin and Kim, Ildoo and Kim, Taesup and Kim, Chiheon and Kim, Sungwoong}, booktitle={Advances in Neural Information Processing Systems (NeurIPS)}, year={2019} } ``` ## Contact for Issues - Ildoo Kim, ildoo.kim@kakaobrain.com ## References & Opensources We increase the batch size and adapt the learning rate accordingly to boost the training. Otherwise, we set other hyperparameters equal to AutoAugment if possible. For the unknown hyperparameters, we follow values from the original references or we tune them to match baseline performances. - **ResNet** : [paper1](https://arxiv.org/abs/1512.03385), [paper2](https://arxiv.org/abs/1603.05027), [code](https://github.com/osmr/imgclsmob/tree/master/pytorch/pytorchcv/models) - **PyramidNet** : [paper](https://arxiv.org/abs/1610.02915), [code](https://github.com/dyhan0920/PyramidNet-PyTorch) - **Wide-ResNet** : [code](https://github.com/meliketoy/wide-resnet.pytorch) - **Shake-Shake** : [code](https://github.com/owruby/shake-shake_pytorch) - **ShakeDrop Regularization** : [paper](https://arxiv.org/abs/1802.02375), [code](https://github.com/owruby/shake-drop_pytorch) - **AutoAugment** : [code](https://github.com/tensorflow/models/tree/master/research/autoaugment) - **Ray** : [code](https://github.com/ray-project/ray) - **HyperOpt** : [code](https://github.com/hyperopt/hyperopt) ================================================ FILE: fast_autoaugment/__init__.py ================================================ ================================================ FILE: fast_autoaugment/archive.py ================================================ # Policy found on CIFAR-10 and CIFAR-100 from __future__ import absolute_import from __future__ import division from __future__ import print_function from collections import defaultdict from FastAutoAugment.augmentations import get_augment, augment_list def arsaug_policy(): exp0_0 = [ [('Solarize', 0.66, 0.34), ('Equalize', 0.56, 0.61)], [('Equalize', 0.43, 0.06), ('AutoContrast', 0.66, 0.08)], [('Color', 0.72, 0.47), ('Contrast', 0.88, 0.86)], [('Brightness', 0.84, 0.71), ('Color', 0.31, 0.74)], [('Rotate', 0.68, 0.26), ('TranslateX', 0.38, 0.88)]] exp0_1 = [ [('TranslateY', 0.88, 0.96), ('TranslateY', 0.53, 0.79)], [('AutoContrast', 0.44, 0.36), ('Solarize', 0.22, 0.48)], [('AutoContrast', 0.93, 0.32), ('Solarize', 0.85, 0.26)], [('Solarize', 0.55, 0.38), ('Equalize', 0.43, 0.48)], [('TranslateY', 0.72, 0.93), ('AutoContrast', 0.83, 0.95)]] exp0_2 = [ [('Solarize', 0.43, 0.58), ('AutoContrast', 0.82, 0.26)], [('TranslateY', 0.71, 0.79), ('AutoContrast', 0.81, 0.94)], [('AutoContrast', 0.92, 0.18), ('TranslateY', 0.77, 0.85)], [('Equalize', 0.71, 0.69), ('Color', 0.23, 0.33)], [('Sharpness', 0.36, 0.98), ('Brightness', 0.72, 0.78)]] exp0_3 = [ [('Equalize', 0.74, 0.49), ('TranslateY', 0.86, 0.91)], [('TranslateY', 0.82, 0.91), ('TranslateY', 0.96, 0.79)], [('AutoContrast', 0.53, 0.37), ('Solarize', 0.39, 0.47)], [('TranslateY', 0.22, 0.78), ('Color', 0.91, 0.65)], [('Brightness', 0.82, 0.46), ('Color', 0.23, 0.91)]] exp0_4 = [ [('Cutout', 0.27, 0.45), ('Equalize', 0.37, 0.21)], [('Color', 0.43, 0.23), ('Brightness', 0.65, 0.71)], [('ShearX', 0.49, 0.31), ('AutoContrast', 0.92, 0.28)], [('Equalize', 0.62, 0.59), ('Equalize', 0.38, 0.91)], [('Solarize', 0.57, 0.31), ('Equalize', 0.61, 0.51)]] exp0_5 = [ [('TranslateY', 0.29, 0.35), ('Sharpness', 0.31, 0.64)], [('Color', 0.73, 0.77), ('TranslateX', 0.65, 0.76)], [('ShearY', 0.29, 0.74), ('Posterize', 0.42, 0.58)], [('Color', 0.92, 0.79), ('Equalize', 0.68, 0.54)], [('Sharpness', 0.87, 0.91), ('Sharpness', 0.93, 0.41)]] exp0_6 = [ [('Solarize', 0.39, 0.35), ('Color', 0.31, 0.44)], [('Color', 0.33, 0.77), ('Color', 0.25, 0.46)], [('ShearY', 0.29, 0.74), ('Posterize', 0.42, 0.58)], [('AutoContrast', 0.32, 0.79), ('Cutout', 0.68, 0.34)], [('AutoContrast', 0.67, 0.91), ('AutoContrast', 0.73, 0.83)]] return exp0_0 + exp0_1 + exp0_2 + exp0_3 + exp0_4 + exp0_5 + exp0_6 def autoaug2arsaug(f): def autoaug(): mapper = defaultdict(lambda: lambda x: x) mapper.update({ 'ShearX': lambda x: float_parameter(x, 0.3), 'ShearY': lambda x: float_parameter(x, 0.3), 'TranslateX': lambda x: int_parameter(x, 10), 'TranslateY': lambda x: int_parameter(x, 10), 'Rotate': lambda x: int_parameter(x, 30), 'Solarize': lambda x: 256 - int_parameter(x, 256), 'Posterize2': lambda x: 4 - int_parameter(x, 4), 'Contrast': lambda x: float_parameter(x, 1.8) + .1, 'Color': lambda x: float_parameter(x, 1.8) + .1, 'Brightness': lambda x: float_parameter(x, 1.8) + .1, 'Sharpness': lambda x: float_parameter(x, 1.8) + .1, 'CutoutAbs': lambda x: int_parameter(x, 20) }) def low_high(name, prev_value): _, low, high = get_augment(name) return float(prev_value - low) / (high - low) policies = f() new_policies = [] for policy in policies: new_policies.append([(name, pr, low_high(name, mapper[name](level))) for name, pr, level in policy]) return new_policies return autoaug @autoaug2arsaug def autoaug_paper_cifar10(): return [ [('Invert', 0.1, 7), ('Contrast', 0.2, 6)], [('Rotate', 0.7, 2), ('TranslateXAbs', 0.3, 9)], [('Sharpness', 0.8, 1), ('Sharpness', 0.9, 3)], [('ShearY', 0.5, 8), ('TranslateYAbs', 0.7, 9)], [('AutoContrast', 0.5, 8), ('Equalize', 0.9, 2)], [('ShearY', 0.2, 7), ('Posterize2', 0.3, 7)], [('Color', 0.4, 3), ('Brightness', 0.6, 7)], [('Sharpness', 0.3, 9), ('Brightness', 0.7, 9)], [('Equalize', 0.6, 5), ('Equalize', 0.5, 1)], [('Contrast', 0.6, 7), ('Sharpness', 0.6, 5)], [('Color', 0.7, 7), ('TranslateXAbs', 0.5, 8)], [('Equalize', 0.3, 7), ('AutoContrast', 0.4, 8)], [('TranslateYAbs', 0.4, 3), ('Sharpness', 0.2, 6)], [('Brightness', 0.9, 6), ('Color', 0.2, 8)], [('Solarize', 0.5, 2), ('Invert', 0.0, 3)], [('Equalize', 0.2, 0), ('AutoContrast', 0.6, 0)], [('Equalize', 0.2, 8), ('Equalize', 0.6, 4)], [('Color', 0.9, 9), ('Equalize', 0.6, 6)], [('AutoContrast', 0.8, 4), ('Solarize', 0.2, 8)], [('Brightness', 0.1, 3), ('Color', 0.7, 0)], [('Solarize', 0.4, 5), ('AutoContrast', 0.9, 3)], [('TranslateYAbs', 0.9, 9), ('TranslateYAbs', 0.7, 9)], [('AutoContrast', 0.9, 2), ('Solarize', 0.8, 3)], [('Equalize', 0.8, 8), ('Invert', 0.1, 3)], [('TranslateYAbs', 0.7, 9), ('AutoContrast', 0.9, 1)], ] @autoaug2arsaug def autoaug_policy(): """AutoAugment policies found on Cifar.""" exp0_0 = [ [('Invert', 0.1, 7), ('Contrast', 0.2, 6)], [('Rotate', 0.7, 2), ('TranslateXAbs', 0.3, 9)], [('Sharpness', 0.8, 1), ('Sharpness', 0.9, 3)], [('ShearY', 0.5, 8), ('TranslateYAbs', 0.7, 9)], [('AutoContrast', 0.5, 8), ('Equalize', 0.9, 2)]] exp0_1 = [ [('Solarize', 0.4, 5), ('AutoContrast', 0.9, 3)], [('TranslateYAbs', 0.9, 9), ('TranslateYAbs', 0.7, 9)], [('AutoContrast', 0.9, 2), ('Solarize', 0.8, 3)], [('Equalize', 0.8, 8), ('Invert', 0.1, 3)], [('TranslateYAbs', 0.7, 9), ('AutoContrast', 0.9, 1)]] exp0_2 = [ [('Solarize', 0.4, 5), ('AutoContrast', 0.0, 2)], [('TranslateYAbs', 0.7, 9), ('TranslateYAbs', 0.7, 9)], [('AutoContrast', 0.9, 0), ('Solarize', 0.4, 3)], [('Equalize', 0.7, 5), ('Invert', 0.1, 3)], [('TranslateYAbs', 0.7, 9), ('TranslateYAbs', 0.7, 9)]] exp0_3 = [ [('Solarize', 0.4, 5), ('AutoContrast', 0.9, 1)], [('TranslateYAbs', 0.8, 9), ('TranslateYAbs', 0.9, 9)], [('AutoContrast', 0.8, 0), ('TranslateYAbs', 0.7, 9)], [('TranslateYAbs', 0.2, 7), ('Color', 0.9, 6)], [('Equalize', 0.7, 6), ('Color', 0.4, 9)]] exp1_0 = [ [('ShearY', 0.2, 7), ('Posterize2', 0.3, 7)], [('Color', 0.4, 3), ('Brightness', 0.6, 7)], [('Sharpness', 0.3, 9), ('Brightness', 0.7, 9)], [('Equalize', 0.6, 5), ('Equalize', 0.5, 1)], [('Contrast', 0.6, 7), ('Sharpness', 0.6, 5)]] exp1_1 = [ [('Brightness', 0.3, 7), ('AutoContrast', 0.5, 8)], [('AutoContrast', 0.9, 4), ('AutoContrast', 0.5, 6)], [('Solarize', 0.3, 5), ('Equalize', 0.6, 5)], [('TranslateYAbs', 0.2, 4), ('Sharpness', 0.3, 3)], [('Brightness', 0.0, 8), ('Color', 0.8, 8)]] exp1_2 = [ [('Solarize', 0.2, 6), ('Color', 0.8, 6)], [('Solarize', 0.2, 6), ('AutoContrast', 0.8, 1)], [('Solarize', 0.4, 1), ('Equalize', 0.6, 5)], [('Brightness', 0.0, 0), ('Solarize', 0.5, 2)], [('AutoContrast', 0.9, 5), ('Brightness', 0.5, 3)]] exp1_3 = [ [('Contrast', 0.7, 5), ('Brightness', 0.0, 2)], [('Solarize', 0.2, 8), ('Solarize', 0.1, 5)], [('Contrast', 0.5, 1), ('TranslateYAbs', 0.2, 9)], [('AutoContrast', 0.6, 5), ('TranslateYAbs', 0.0, 9)], [('AutoContrast', 0.9, 4), ('Equalize', 0.8, 4)]] exp1_4 = [ [('Brightness', 0.0, 7), ('Equalize', 0.4, 7)], [('Solarize', 0.2, 5), ('Equalize', 0.7, 5)], [('Equalize', 0.6, 8), ('Color', 0.6, 2)], [('Color', 0.3, 7), ('Color', 0.2, 4)], [('AutoContrast', 0.5, 2), ('Solarize', 0.7, 2)]] exp1_5 = [ [('AutoContrast', 0.2, 0), ('Equalize', 0.1, 0)], [('ShearY', 0.6, 5), ('Equalize', 0.6, 5)], [('Brightness', 0.9, 3), ('AutoContrast', 0.4, 1)], [('Equalize', 0.8, 8), ('Equalize', 0.7, 7)], [('Equalize', 0.7, 7), ('Solarize', 0.5, 0)]] exp1_6 = [ [('Equalize', 0.8, 4), ('TranslateYAbs', 0.8, 9)], [('TranslateYAbs', 0.8, 9), ('TranslateYAbs', 0.6, 9)], [('TranslateYAbs', 0.9, 0), ('TranslateYAbs', 0.5, 9)], [('AutoContrast', 0.5, 3), ('Solarize', 0.3, 4)], [('Solarize', 0.5, 3), ('Equalize', 0.4, 4)]] exp2_0 = [ [('Color', 0.7, 7), ('TranslateXAbs', 0.5, 8)], [('Equalize', 0.3, 7), ('AutoContrast', 0.4, 8)], [('TranslateYAbs', 0.4, 3), ('Sharpness', 0.2, 6)], [('Brightness', 0.9, 6), ('Color', 0.2, 8)], [('Solarize', 0.5, 2), ('Invert', 0.0, 3)]] exp2_1 = [ [('AutoContrast', 0.1, 5), ('Brightness', 0.0, 0)], [('CutoutAbs', 0.2, 4), ('Equalize', 0.1, 1)], [('Equalize', 0.7, 7), ('AutoContrast', 0.6, 4)], [('Color', 0.1, 8), ('ShearY', 0.2, 3)], [('ShearY', 0.4, 2), ('Rotate', 0.7, 0)]] exp2_2 = [ [('ShearY', 0.1, 3), ('AutoContrast', 0.9, 5)], [('TranslateYAbs', 0.3, 6), ('CutoutAbs', 0.3, 3)], [('Equalize', 0.5, 0), ('Solarize', 0.6, 6)], [('AutoContrast', 0.3, 5), ('Rotate', 0.2, 7)], [('Equalize', 0.8, 2), ('Invert', 0.4, 0)]] exp2_3 = [ [('Equalize', 0.9, 5), ('Color', 0.7, 0)], [('Equalize', 0.1, 1), ('ShearY', 0.1, 3)], [('AutoContrast', 0.7, 3), ('Equalize', 0.7, 0)], [('Brightness', 0.5, 1), ('Contrast', 0.1, 7)], [('Contrast', 0.1, 4), ('Solarize', 0.6, 5)]] exp2_4 = [ [('Solarize', 0.2, 3), ('ShearX', 0.0, 0)], [('TranslateXAbs', 0.3, 0), ('TranslateXAbs', 0.6, 0)], [('Equalize', 0.5, 9), ('TranslateYAbs', 0.6, 7)], [('ShearX', 0.1, 0), ('Sharpness', 0.5, 1)], [('Equalize', 0.8, 6), ('Invert', 0.3, 6)]] exp2_5 = [ [('AutoContrast', 0.3, 9), ('CutoutAbs', 0.5, 3)], [('ShearX', 0.4, 4), ('AutoContrast', 0.9, 2)], [('ShearX', 0.0, 3), ('Posterize2', 0.0, 3)], [('Solarize', 0.4, 3), ('Color', 0.2, 4)], [('Equalize', 0.1, 4), ('Equalize', 0.7, 6)]] exp2_6 = [ [('Equalize', 0.3, 8), ('AutoContrast', 0.4, 3)], [('Solarize', 0.6, 4), ('AutoContrast', 0.7, 6)], [('AutoContrast', 0.2, 9), ('Brightness', 0.4, 8)], [('Equalize', 0.1, 0), ('Equalize', 0.0, 6)], [('Equalize', 0.8, 4), ('Equalize', 0.0, 4)]] exp2_7 = [ [('Equalize', 0.5, 5), ('AutoContrast', 0.1, 2)], [('Solarize', 0.5, 5), ('AutoContrast', 0.9, 5)], [('AutoContrast', 0.6, 1), ('AutoContrast', 0.7, 8)], [('Equalize', 0.2, 0), ('AutoContrast', 0.1, 2)], [('Equalize', 0.6, 9), ('Equalize', 0.4, 4)]] exp0s = exp0_0 + exp0_1 + exp0_2 + exp0_3 exp1s = exp1_0 + exp1_1 + exp1_2 + exp1_3 + exp1_4 + exp1_5 + exp1_6 exp2s = exp2_0 + exp2_1 + exp2_2 + exp2_3 + exp2_4 + exp2_5 + exp2_6 + exp2_7 return exp0s + exp1s + exp2s PARAMETER_MAX = 10 def float_parameter(level, maxval): return float(level) * maxval / PARAMETER_MAX def int_parameter(level, maxval): return int(float_parameter(level, maxval)) def no_duplicates(f): def wrap_remove_duplicates(): policies = f() return remove_deplicates(policies) return wrap_remove_duplicates def remove_deplicates(policies): s = set() new_policies = [] for ops in policies: key = [] for op in ops: key.append(op[0]) key = '_'.join(key) if key in s: continue else: s.add(key) new_policies.append(ops) return new_policies def fa_reduced_cifar10(): p = [[["Contrast", 0.8320659688593578, 0.49884310562180767], ["TranslateX", 0.41849883971249136, 0.394023086494538]], [["Color", 0.3500483749890918, 0.43355143929883955], ["Color", 0.5120716140300229, 0.7508299643325016]], [["Rotate", 0.9447932604389472, 0.29723465088990375], ["Sharpness", 0.1564936149799504, 0.47169309978091745]], [["Rotate", 0.5430015349185097, 0.6518626678905443], ["Color", 0.5694844928020679, 0.3494533005430269]], [["AutoContrast", 0.5558922032451064, 0.783136004977799], ["TranslateY", 0.683914191471972, 0.7597025305860181]], [["TranslateX", 0.03489224481658926, 0.021025488042663354], ["Equalize", 0.4788637403857401, 0.3535481281496117]], [["Sharpness", 0.6428916269794158, 0.22791511918580576], ["Contrast", 0.016014045073950323, 0.26811312269487575]], [["Rotate", 0.2972727228410451, 0.7654251516829896], ["AutoContrast", 0.16005809254943348, 0.5380523650108116]], [["Contrast", 0.5823671057717301, 0.7521166301398389], ["TranslateY", 0.9949449214751978, 0.9612671341689751]], [["Equalize", 0.8372126687702321, 0.6944127225621206], ["Rotate", 0.25393282929784755, 0.3261658365286546]], [["Invert", 0.8222011603194572, 0.6597915864008403], ["Posterize", 0.31858707654447327, 0.9541013715579584]], [["Sharpness", 0.41314621282107045, 0.9437344470879956], ["Cutout", 0.6610495837889337, 0.674411664255093]], [["Contrast", 0.780121736705407, 0.40826152397463156], ["Color", 0.344019192125256, 0.1942922781355767]], [["Rotate", 0.17153139555621344, 0.798745732456474], ["Invert", 0.6010555860501262, 0.320742172554767]], [["Invert", 0.26816063450777416, 0.27152062163148327], ["Equalize", 0.6786829200236982, 0.7469412443514213]], [["Contrast", 0.3920564414367518, 0.7493644582838497], ["TranslateY", 0.8941657805606704, 0.6580846856375955]], [["Equalize", 0.875509207399372, 0.9061130537645283], ["Cutout", 0.4940280679087308, 0.7896229623628276]], [["Contrast", 0.3331423298065147, 0.7170041362529597], ["ShearX", 0.7425484291842793, 0.5285117152426109]], [["Equalize", 0.97344237365026, 0.4745759720473106], ["TranslateY", 0.055863458430295276, 0.9625142022954672]], [["TranslateX", 0.6810614083109192, 0.7509937355495521], ["TranslateY", 0.3866463019475701, 0.5185481505576112]], [["Sharpness", 0.4751529944753671, 0.550464012488733], ["Cutout", 0.9472914750534814, 0.5584925992985023]], [["Contrast", 0.054606784909375095, 0.17257080196712182], ["Cutout", 0.6077026782754803, 0.7996504165944938]], [["ShearX", 0.328798428243695, 0.2769563264079157], ["Cutout", 0.9037632437023772, 0.4915809476763595]], [["Cutout", 0.6891202672363478, 0.9951490996172914], ["Posterize", 0.06532762462628705, 0.4005246609075227]], [["TranslateY", 0.6908583592523334, 0.725612120376128], ["Rotate", 0.39907735501746666, 0.36505798032223147]], [["TranslateX", 0.10398364107399072, 0.5913918470536627], ["Rotate", 0.7169811539340365, 0.8283850670648724]], [["ShearY", 0.9526373530768361, 0.4482347365639251], ["Contrast", 0.4203947336351471, 0.41526799558953864]], [["Contrast", 0.24894431199700073, 0.09578870500994707], ["Solarize", 0.2273713345927395, 0.6214942914963707]], [["TranslateX", 0.06331228870032912, 0.8961907489444944], ["Cutout", 0.5110007859958743, 0.23704875994050723]], [["Cutout", 0.3769183548846172, 0.6560944580253987], ["TranslateY", 0.7201924599434143, 0.4132476526938319]], [["Invert", 0.6707431156338866, 0.11622795952464149], ["Posterize", 0.12075972752370845, 0.18024933294172307]], [["Color", 0.5010057264087142, 0.5277767327434318], ["Rotate", 0.9486115946366559, 0.31485546630220784]], [["ShearX", 0.31741302466630406, 0.1991215806270692], ["Invert", 0.3744727015523084, 0.6914113986757578]], [["Brightness", 0.40348479064392617, 0.8924182735724888], ["Brightness", 0.1973098763857779, 0.3939288933689655]], [["Color", 0.01208688664030888, 0.6055693000885217], ["Equalize", 0.433259451147881, 0.420711137966155]], [["Cutout", 0.2620018360076487, 0.11594468278143644], ["Rotate", 0.1310401567856766, 0.7244318146544101]], [["ShearX", 0.15249651845933576, 0.35277277071866986], ["Contrast", 0.28221794032094016, 0.42036586509397444]], [["Brightness", 0.8492912150468908, 0.26386920887886056], ["Solarize", 0.8764208056263386, 0.1258195122766067]], [["ShearX", 0.8537058239675831, 0.8415101816171269], ["AutoContrast", 0.23958568830416294, 0.9889049529564014]], [["Rotate", 0.6463207930684552, 0.8750192129056532], ["Contrast", 0.6865032211768652, 0.8564981333033417]], [["Equalize", 0.8877190311811044, 0.7370995897848609], ["TranslateX", 0.9979660314391368, 0.005683998913244781]], [["Color", 0.6420017551677819, 0.6225337265571229], ["Solarize", 0.8344504978566362, 0.8332856969941151]], [["ShearX", 0.7439332981992567, 0.9747608698582039], ["Equalize", 0.6259189804002959, 0.028017478098245174]], [["TranslateY", 0.39794770293366843, 0.8482966537902709], ["Rotate", 0.9312935630405351, 0.5300586925826072]], [["Cutout", 0.8904075572021911, 0.3522934742068766], ["Equalize", 0.6431186289473937, 0.9930577962126151]], [["Contrast", 0.9183553386089476, 0.44974266209396685], ["TranslateY", 0.8193684583123862, 0.9633741156526566]], [["ShearY", 0.616078299924283, 0.19219314358924766], ["Solarize", 0.1480945914138868, 0.05922109541654652]], [["Solarize", 0.25332455064128157, 0.18853037431947994], ["ShearY", 0.9518390093954243, 0.14603930044061142]], [["Color", 0.8094378664335412, 0.37029830225408433], ["Contrast", 0.29504113617467465, 0.065096365468442]], [["AutoContrast", 0.7075167558685455, 0.7084621693458267], ["Sharpness", 0.03555539453323875, 0.5651948313888351]], [["TranslateY", 0.5969982600930229, 0.9857264201029572], ["Rotate", 0.9898628564873607, 0.1985685534926911]], [["Invert", 0.14915939942810352, 0.6595839632446547], ["Posterize", 0.768535289994361, 0.5997358684618563]], [["Equalize", 0.9162691815967111, 0.3331035307653627], ["Color", 0.8169118187605557, 0.7653910258006366]], [["Rotate", 0.43489185299530897, 0.752215269135173], ["Brightness", 0.1569828560334806, 0.8002808712857853]], [["Invert", 0.931876215328345, 0.029428644395760872], ["Equalize", 0.6330036052674145, 0.7235531014288485]], [["ShearX", 0.5216138393704968, 0.849272958911589], ["AutoContrast", 0.19572688655120263, 0.9786551568639575]], [["ShearX", 0.9899586208275011, 0.22580547500610293], ["Brightness", 0.9831311903178727, 0.5055159610855606]], [["Brightness", 0.29179117009211486, 0.48003584672937294], ["Solarize", 0.7544252317330058, 0.05806581735063043]], [["AutoContrast", 0.8919800329537786, 0.8511261613698553], ["Contrast", 0.49199446084551035, 0.7302297140181429]], [["Cutout", 0.7079723710644835, 0.032565015538375874], ["AutoContrast", 0.8259782090388609, 0.7860708789468442]], [["Posterize", 0.9980262659801914, 0.6725084224935673], ["ShearY", 0.6195568269664682, 0.5444170291816751]], [["Posterize", 0.8687351834713217, 0.9978004914422602], ["Equalize", 0.4532646848325955, 0.6486748015710573]], [["Contrast", 0.2713928776950594, 0.15255249557027806], ["ShearY", 0.9276834387970199, 0.5266542862333478]], [["AutoContrast", 0.5240786618055582, 0.9325642258930253], ["Cutout", 0.38448627892037357, 0.21219415055662394]], [["TranslateX", 0.4299517937295352, 0.20133751201386152], ["TranslateX", 0.6753468310276597, 0.6985621035400441]], [["Rotate", 0.4006472499103597, 0.6704748473357586], ["Equalize", 0.674161668148079, 0.6528530101705237]], [["Equalize", 0.9139902833674455, 0.9015103149680278], ["Sharpness", 0.7289667720691948, 0.7623606352376232]], [["Cutout", 0.5911267429414259, 0.5953141187177585], ["Rotate", 0.5219064817468504, 0.11085141355857986]], [["TranslateX", 0.3620095133946267, 0.26194039409492476], ["Rotate", 0.3929841359545597, 0.4913406720338047]], [["Invert", 0.5175298901458896, 0.001661410821811482], ["Invert", 0.004656581318332242, 0.8157622192213624]], [["AutoContrast", 0.013609693335051465, 0.9318651749409604], ["Invert", 0.8980844358979592, 0.2268511862780368]], [["ShearY", 0.7717126261142194, 0.09975547983707711], ["Equalize", 0.7808494401429572, 0.4141412091009955]], [["TranslateX", 0.5878675721341552, 0.29813268038163376], ["Posterize", 0.21257276051591356, 0.2837285296666412]], [["Brightness", 0.4268335108566488, 0.4723784991635417], ["Cutout", 0.9386262901570471, 0.6597686851494288]], [["ShearX", 0.8259423807590159, 0.6215304795389204], ["Invert", 0.6663365779667443, 0.7729669184580387]], [["ShearY", 0.4801338723951297, 0.5220145420100984], ["Solarize", 0.9165803796596582, 0.04299335502862134]], [["Color", 0.17621114853558817, 0.7092601754635434], ["ShearX", 0.9014406936728542, 0.6028711944367818]], [["Rotate", 0.13073284972300658, 0.9088831512880851], ["ShearX", 0.4228105332316806, 0.7985249783662675]], [["Brightness", 0.9182753692730031, 0.0063635477774044436], ["Color", 0.4279825602663798, 0.28727149118585327]], [["Equalize", 0.578218285372267, 0.9611758542158054], ["Contrast", 0.5471552264150691, 0.8819635504027596]], [["Brightness", 0.3208589067274543, 0.45324733565167497], ["Solarize", 0.5218455808633233, 0.5946097503647126]], [["Equalize", 0.3790381278653, 0.8796082535775276], ["Solarize", 0.4875526773149246, 0.5186585878052613]], [["ShearY", 0.12026461479557571, 0.1336953429068397], ["Posterize", 0.34373988646025766, 0.8557727670803785]], [["Cutout", 0.2396745247507467, 0.8123036135209865], ["Equalize", 0.05022807681008945, 0.6648492261984383]], [["Brightness", 0.35226676470748264, 0.5950011514888855], ["Rotate", 0.27555076067000894, 0.9170063321486026]], [["ShearX", 0.320224630647278, 0.9683584649071976], ["Invert", 0.6905585196648905, 0.5929115667894518]], [["Color", 0.9941395717559652, 0.7474441679798101], ["Sharpness", 0.7559998478658021, 0.6656052889626682]], [["ShearY", 0.4004220568345669, 0.5737646992826074], ["Equalize", 0.9983495213746147, 0.8307907033362303]], [["Color", 0.13726809242038207, 0.9378850119950549], ["Equalize", 0.9853362454752445, 0.42670264496554156]], [["Invert", 0.13514636153298576, 0.13516363849081958], ["Sharpness", 0.2031189356693901, 0.6110226359872745]], [["TranslateX", 0.7360305209630797, 0.41849698571655614], ["Contrast", 0.8972161549144564, 0.7820296625565641]], [["Color", 0.02713118828682548, 0.717110684828096], ["TranslateY", 0.8118759006836348, 0.9120098002024992]], [["Sharpness", 0.2915428949403711, 0.7630303724396518], ["Solarize", 0.22030536162851078, 0.38654526772661757]], [["Equalize", 0.9949114839538582, 0.7193630656062793], ["AutoContrast", 0.00889496657931299, 0.2291400476524672]], [["Rotate", 0.7120948976490488, 0.7804359309791055], ["Cutout", 0.10445418104923654, 0.8022999156052766]], [["Equalize", 0.7941710117902707, 0.8648170634288153], ["Invert", 0.9235642581144047, 0.23810725859722381]], [["Cutout", 0.3669397998623156, 0.42612815083245004], ["Solarize", 0.5896322046441561, 0.40525016166956795]], [["Color", 0.8389858785714184, 0.4805764176488667], ["Rotate", 0.7483931487048825, 0.4731174601400677]], [["Sharpness", 0.19006538611394763, 0.9480745790240234], ["TranslateY", 0.13904429049439282, 0.04117685330615939]], [["TranslateY", 0.9958097661701637, 0.34853788612580905], ["Cutout", 0.2235829624082113, 0.3737887095480745]], [["ShearX", 0.635453761342424, 0.6063917273421382], ["Posterize", 0.8738297843709666, 0.4893042590265556]], [["Brightness", 0.7907245198402727, 0.7082189713070691], ["Color", 0.030313003541849737, 0.6927897798493439]], [["Cutout", 0.6965622481073525, 0.8103522907758203], ["ShearY", 0.6186794303078708, 0.28640671575703547]], [["ShearY", 0.43734910588450226, 0.32549342535621517], ["ShearX", 0.08154980987651872, 0.3286764923112455]], [["AutoContrast", 0.5262462005050853, 0.8175584582465848], ["Contrast", 0.8683217097363655, 0.548776281479276]], [["ShearY", 0.03957878500311707, 0.5102350637943197], ["Rotate", 0.13794708520303778, 0.38035687712954236]], [["Sharpness", 0.634288567312677, 0.6387948309075822], ["AutoContrast", 0.13437288694693272, 0.7150448869023095]], [["Contrast", 0.5198339640088544, 0.9409429390321714], ["Cutout", 0.09489154903321972, 0.6228488803821982]], [["Equalize", 0.8955909061806043, 0.7727336527163008], ["AutoContrast", 0.6459479564441762, 0.7065467781139214]], [["Invert", 0.07214420843537739, 0.15334721382249505], ["ShearX", 0.9242027778363903, 0.5809187849982554]], [["Equalize", 0.9144084379856188, 0.9457539278608998], ["Sharpness", 0.14337499858300173, 0.5978054365425495]], [["Posterize", 0.18894269796951202, 0.14676331276539045], ["Equalize", 0.846204299950047, 0.0720601838168885]], [["Contrast", 0.47354445405741163, 0.1793650330107468], ["Solarize", 0.9086106327264657, 0.7578807802091502]], [["AutoContrast", 0.11805466892967886, 0.6773620948318575], ["TranslateX", 0.584222568299264, 0.9475693349391936]], [["Brightness", 0.5833017701352768, 0.6892593824176294], ["AutoContrast", 0.9073141314561828, 0.5823085733964589]], [["TranslateY", 0.5711231614144834, 0.6436240447620021], ["Contrast", 0.21466964050052473, 0.8042843954486391]], [["Contrast", 0.22967904487976765, 0.2343103109298762], ["Invert", 0.5502897289159286, 0.386181060792375]], [["Invert", 0.7008423439928628, 0.4234003051405053], ["Rotate", 0.77270460187611, 0.6650852696828039]], [["Invert", 0.050618322309703534, 0.24277027926683614], ["TranslateX", 0.789703489736613, 0.5116446685339312]], [["Color", 0.363898083076868, 0.7870323584210503], ["ShearY", 0.009608425513626617, 0.6188625018465327]], [["TranslateY", 0.9447601615216088, 0.8605867115798349], ["Equalize", 0.24139180127003634, 0.9587337957930782]], [["Equalize", 0.3968589440144503, 0.626206375426996], ["Solarize", 0.3215967960673186, 0.826785464835443]], [["TranslateX", 0.06947339047121326, 0.016705969558222122], ["Contrast", 0.6203392406528407, 0.6433525559906872]], [["Solarize", 0.2479835265518212, 0.6335009955617831], ["Sharpness", 0.6260191862978083, 0.18998095149428562]], [["Invert", 0.9818841924943431, 0.03252098144087934], ["TranslateY", 0.9740718042586802, 0.32038951753031475]], [["Solarize", 0.8795784664090814, 0.7014953994354041], ["AutoContrast", 0.8508018319577783, 0.09321935255338443]], [["Color", 0.8067046326105318, 0.13732893832354054], ["Contrast", 0.7358549680271418, 0.7880588355974301]], [["Posterize", 0.5005885536838065, 0.7152229305267599], ["ShearX", 0.6714249591308944, 0.7732232697859908]], [["TranslateY", 0.5657943483353953, 0.04622399873706862], ["AutoContrast", 0.2787442688649845, 0.567024378767143]], [["ShearY", 0.7589839214283295, 0.041071003934029404], ["Equalize", 0.3719852873722692, 0.43285778682687326]], [["Posterize", 0.8841266183653291, 0.42441306955476366], ["Cutout", 0.06578801759412933, 0.5961125797961526]], [["Rotate", 0.4057875004314082, 0.20241115848366442], ["AutoContrast", 0.19331542807918067, 0.7175484678480565]], [["Contrast", 0.20331327116693088, 0.17135387852218742], ["Cutout", 0.6282459410351067, 0.6690015305529187]], [["ShearX", 0.4309850328306535, 0.99321178125828], ["AutoContrast", 0.01809604030453338, 0.693838277506365]], [["Rotate", 0.24343531125298268, 0.5326412444169899], ["Sharpness", 0.8663989992597494, 0.7643990609130789]], [["Rotate", 0.9785019204622459, 0.8941922576710696], ["ShearY", 0.3823185048761075, 0.9258854046017292]], [["ShearY", 0.5502613342963388, 0.6193478797355644], ["Sharpness", 0.2212116534610532, 0.6648232390110979]], [["TranslateY", 0.43222920981513757, 0.5657636397633089], ["ShearY", 0.9153733286073634, 0.4868521171273169]], [["Posterize", 0.12246560519738336, 0.9132288825898972], ["Cutout", 0.6058471327881816, 0.6426901876150983]], [["Color", 0.3693970222695844, 0.038929141432555436], ["Equalize", 0.6228052875653781, 0.05064436511347281]], [["Color", 0.7172600331356893, 0.2824542634766688], ["Color", 0.425293116261649, 0.1796441283313972]], [["Cutout", 0.7539608428122959, 0.9896141728228921], ["Solarize", 0.17811081117364758, 0.9064195503634402]], [["AutoContrast", 0.6761242607012717, 0.6484842446399923], ["AutoContrast", 0.1978135076901828, 0.42166879492601317]], [["ShearY", 0.25901666379802524, 0.4770778270322449], ["Solarize", 0.7640963173407052, 0.7548463227094349]], [["TranslateY", 0.9222487731783499, 0.33658389819616463], ["Equalize", 0.9159112511468139, 0.8877136302394797]], [["TranslateX", 0.8994836977137054, 0.11036053676846591], ["Sharpness", 0.9040333410652747, 0.007266095214664592]], [["Invert", 0.627758632524958, 0.8075245097227242], ["Color", 0.7525387912148516, 0.05950239294733184]], [["TranslateX", 0.43505193292761857, 0.38108822876120796], ["TranslateY", 0.7432578052364004, 0.685678116134759]], [["Contrast", 0.9293507582470425, 0.052266842951356196], ["Posterize", 0.45187123977747456, 0.8228290399726782]], [["ShearX", 0.07240786542746291, 0.8945667925365756], ["Brightness", 0.5305443506561034, 0.12025274552427578]], [["Invert", 0.40157564448143335, 0.5364745514006678], ["Posterize", 0.3316124671813876, 0.43002413237035997]], [["ShearY", 0.7152314630009072, 0.1938339083417453], ["Invert", 0.14102478508140615, 0.41047623580174253]], [["Equalize", 0.19862832613849246, 0.5058521685279254], ["Sharpness", 0.16481208629549782, 0.29126323102770557]], [["Equalize", 0.6951591703541872, 0.7294822018800076], ["ShearX", 0.8726656726111219, 0.3151484225786487]], [["Rotate", 0.17234370554263745, 0.9356543193000078], ["TranslateX", 0.4954374070084091, 0.05496727345849217]], [["Contrast", 0.347405480122842, 0.831553005022885], ["ShearX", 0.28946367213071134, 0.11905898704394013]], [["Rotate", 0.28096672507990683, 0.16181284050307398], ["Color", 0.6554918515385365, 0.8739728050797386]], [["Solarize", 0.05408073374114053, 0.5357087283758337], ["Posterize", 0.42457175211495335, 0.051807130609045515]], [["TranslateY", 0.6216669362331361, 0.9691341207381867], ["Rotate", 0.9833579358130944, 0.12227426932415297]], [["AutoContrast", 0.7572619475282892, 0.8062834082727393], ["Contrast", 0.1447865402875591, 0.40242646573228436]], [["Rotate", 0.7035658783466086, 0.9840285268256428], ["Contrast", 0.04613961510519471, 0.7666683217450163]], [["TranslateX", 0.4580462177951252, 0.6448678609474686], ["AutoContrast", 0.14845695613708987, 0.1581134188537895]], [["Color", 0.06795037145259564, 0.9115552821158709], ["TranslateY", 0.9972953449677655, 0.6791016521791214]], [["Cutout", 0.3586908443690823, 0.11578558293480945], ["Color", 0.49083981719164294, 0.6924851425917189]], [["Brightness", 0.7994717831637873, 0.7887316255321768], ["Posterize", 0.01280463502435425, 0.2799086732858721]], [["ShearY", 0.6733451536131859, 0.8122332639516706], ["AutoContrast", 0.20433889615637357, 0.29023346867819966]], [["TranslateY", 0.709913512385177, 0.6538196931503809], ["Invert", 0.06629795606579203, 0.40913219547548296]], [["Sharpness", 0.4704559834362948, 0.4235993305308414], ["Equalize", 0.7578132044306966, 0.9388824249397175]], [["AutoContrast", 0.5281702802395268, 0.8077253610116979], ["Equalize", 0.856446858814119, 0.0479755681647559]], [["Color", 0.8244145826797791, 0.038409264586238945], ["Equalize", 0.4933123249234237, 0.8251940933672189]], [["TranslateX", 0.23949314158035084, 0.13576027004706692], ["ShearX", 0.8547563771688399, 0.8309262160483606]], [["Cutout", 0.4655680937486001, 0.2819807000622825], ["Contrast", 0.8439552665937905, 0.4843617871587037]], [["TranslateX", 0.19142454476784831, 0.7516148119169537], ["AutoContrast", 0.8677128351329768, 0.34967990912346336]], [["Contrast", 0.2997868299880966, 0.919508054854469], ["AutoContrast", 0.3003418493384957, 0.812314984368542]], [["Invert", 0.1070424236198183, 0.614674386498809], ["TranslateX", 0.5010973510899923, 0.20828478805259465]], [["Contrast", 0.6775882415611454, 0.6938564815591685], ["Cutout", 0.4814634264207498, 0.3086844939744179]], [["TranslateY", 0.939427105020265, 0.02531043619423201], ["Contrast", 0.793754257944812, 0.6676072472565451]], [["Sharpness", 0.09833672397575444, 0.5937214638292085], ["Rotate", 0.32530675291753763, 0.08302275740932441]], [["Sharpness", 0.3096455511562728, 0.6726732004553959], ["TranslateY", 0.43268997648796537, 0.8755012330217743]], [["ShearY", 0.9290771880324833, 0.22114736271319912], ["Equalize", 0.5520199288501478, 0.34269650332060553]], [["AutoContrast", 0.39763980746649374, 0.4597414582725454], ["Contrast", 0.941507852412761, 0.24991270562477041]], [["Contrast", 0.19419400547588095, 0.9127524785329233], ["Invert", 0.40544905179551727, 0.770081532844878]], [["Invert", 0.30473757368608334, 0.23534811781828846], ["Cutout", 0.26090722356706686, 0.5478390909877727]], [["Posterize", 0.49434361308057373, 0.05018423270527428], ["Color", 0.3041910676883317, 0.2603810415446437]], [["Invert", 0.5149061746764011, 0.9507449210221298], ["TranslateY", 0.4458076521892904, 0.8235358255774426]], [["Cutout", 0.7900006753351625, 0.905578861382507], ["Cutout", 0.6707153655762056, 0.8236715672258502]], [["Solarize", 0.8750534386579575, 0.10337670467100568], ["Posterize", 0.6102379615481381, 0.9264503915416868]], [["ShearY", 0.08448689377082852, 0.13981233725811626], ["TranslateX", 0.13979689669329498, 0.768774869872818]], [["TranslateY", 0.35752572266759985, 0.22827299847812488], ["Solarize", 0.3906957174236011, 0.5663314388307709]], [["ShearY", 0.29155240367061563, 0.8427516352971683], ["ShearX", 0.988825367441916, 0.9371258864857649]], [["Posterize", 0.3470780859769458, 0.5467686612321239], ["Rotate", 0.5758606274160093, 0.8843838082656007]], [["Cutout", 0.07825368363221841, 0.3230799425855425], ["Equalize", 0.2319163865298529, 0.42133965674727325]], [["Invert", 0.41972172597448654, 0.34618622513582953], ["ShearX", 0.33638469398198834, 0.9098575535928108]], [["Invert", 0.7322652233340448, 0.7747502957687412], ["Cutout", 0.9643121397298106, 0.7983335094634907]], [["TranslateY", 0.30039942808098496, 0.229018798182827], ["TranslateY", 0.27009499739380194, 0.6435577237846236]], [["Color", 0.38245274994070644, 0.7030758568461645], ["ShearX", 0.4429321461666281, 0.6963787864044149]], [["AutoContrast", 0.8432798685515605, 0.5775214369578088], ["Brightness", 0.7140899735355927, 0.8545854720117658]], [["Rotate", 0.14418935535613786, 0.5637968282213426], ["Color", 0.7115231912479835, 0.32584796564566776]], [["Sharpness", 0.4023501062807533, 0.4162097130412771], ["Brightness", 0.5536372686153666, 0.03004023273348777]], [["TranslateX", 0.7526053265574295, 0.5365938133399961], ["Cutout", 0.07914142706557492, 0.7544953091603148]], [["TranslateY", 0.6932934644882822, 0.5302211727137424], ["Invert", 0.5040606028391255, 0.6074863635108957]], [["Sharpness", 0.5013938602431629, 0.9572417724333157], ["TranslateY", 0.9160516359783026, 0.41798927975391675]], [["ShearY", 0.5130018836722556, 0.30209438428424185], ["Color", 0.15017170588500262, 0.20653495360587826]], [["TranslateX", 0.5293300090022314, 0.6407011888285266], ["Rotate", 0.4809817860439001, 0.3537850070371702]], [["Equalize", 0.42243081336551014, 0.13472721311046565], ["Posterize", 0.4700309639484068, 0.5197704360874883]], [["AutoContrast", 0.40674959899687235, 0.7312824868168921], ["TranslateX", 0.7397527975920833, 0.7068339877944815]], [["TranslateY", 0.5880995184787206, 0.41294111378078946], ["ShearX", 0.3181387627799316, 0.4810010147143413]], [["Color", 0.9898680233928507, 0.13241525577655167], ["Contrast", 0.9824932511238534, 0.5081145010853807]], [["Invert", 0.1591854062582687, 0.9760371953250404], ["Color", 0.9913399302056851, 0.8388709501056177]], [["Rotate", 0.6427451962231163, 0.9486793975292853], ["AutoContrast", 0.8501937877930463, 0.021326757974406196]], [["Contrast", 0.13611684531087598, 0.3050858709483848], ["Posterize", 0.06618644756084646, 0.8776928511951034]], [["TranslateX", 0.41021065663839407, 0.4965319749091702], ["Rotate", 0.07088831484595115, 0.4435516708223345]], [["Sharpness", 0.3151707977154323, 0.28275482520179296], ["Invert", 0.36980384682133804, 0.20813616084536624]], [["Cutout", 0.9979060206661017, 0.39712948644725854], ["Brightness", 0.42451052896163466, 0.942623075649937]], [["Equalize", 0.5300853308425644, 0.010183500830128867], ["AutoContrast", 0.06930788523716991, 0.5403125318991522]], [["Contrast", 0.010385458959237814, 0.2588311035539086], ["ShearY", 0.9347048553928764, 0.10439028366854963]], [["ShearY", 0.9867649486508592, 0.8409258132716434], ["ShearX", 0.48031199530836444, 0.7703375364614137]], [["ShearY", 0.04835889473136512, 0.2671081675890492], ["Brightness", 0.7856432618509617, 0.8032169570159564]], [["Posterize", 0.11112884927351185, 0.7116956530752987], ["TranslateY", 0.7339151092128607, 0.3331241226029017]], [["Invert", 0.13527036207875454, 0.8425980515358883], ["Color", 0.7836395778298139, 0.5517059252678862]], [["Sharpness", 0.012541163521491816, 0.013197550692292892], ["Invert", 0.6295957932861318, 0.43276521236056054]], [["AutoContrast", 0.7681480991225756, 0.3634284648496289], ["Brightness", 0.09708289828517969, 0.45016725043529726]], [["Brightness", 0.5839450499487329, 0.47525965678316795], ["Posterize", 0.43096581990183735, 0.9332382960125196]], [["Contrast", 0.9725334964552795, 0.9142902966863341], ["Contrast", 0.12376116410622995, 0.4355916974126801]], [["TranslateX", 0.8572708473690132, 0.02544522678265526], ["Sharpness", 0.37902120723460364, 0.9606092969833118]], [["TranslateY", 0.8907359001296927, 0.8011363927236099], ["Color", 0.7693777154407178, 0.0936768686746503]], [["Equalize", 0.0002657688243309364, 0.08190798535970034], ["Rotate", 0.5215478065240905, 0.5773519995038368]], [["TranslateY", 0.3383007813932477, 0.5733428274739165], ["Sharpness", 0.2436110797174722, 0.4757790814590501]], [["Cutout", 0.0957402176213592, 0.8914395928996034], ["Cutout", 0.4959915628586883, 0.25890349461645246]], [["AutoContrast", 0.594787300189186, 0.9627455357634459], ["ShearY", 0.5136027621132064, 0.10419602450259002]], [["Solarize", 0.4684077211553732, 0.6592850629431414], ["Sharpness", 0.2382385935956325, 0.6589291408243176]], [["Cutout", 0.4478786947325877, 0.6893616643143388], ["TranslateX", 0.2761781720270474, 0.21750622627277727]], [["Sharpness", 0.39476077929016484, 0.930902796668923], ["Cutout", 0.9073012208742808, 0.9881122386614257]], [["TranslateY", 0.0933719180021565, 0.7206252503441172], ["ShearX", 0.5151400441789256, 0.6307540083648309]], [["AutoContrast", 0.7772689258806401, 0.8159317013156503], ["AutoContrast", 0.5932793713915097, 0.05262217353927168]], [["Equalize", 0.38017352056118914, 0.8084724050448412], ["ShearY", 0.7239725628380852, 0.4246314890359326]], [["Cutout", 0.741157483503503, 0.13244380646497977], ["Invert", 0.03395378056675935, 0.7140036618098844]], [["Rotate", 0.0662727247460636, 0.7099861732415447], ["Rotate", 0.3168532707508249, 0.3553167425022127]], [["AutoContrast", 0.7429303516734129, 0.07117444599776435], ["Posterize", 0.5379537435918104, 0.807221330263993]], [["TranslateY", 0.9788586874795164, 0.7967243851346594], ["Invert", 0.4479103376922362, 0.04260360776727545]], [["Cutout", 0.28318121763188997, 0.7748680701406292], ["AutoContrast", 0.9109258369403016, 0.17126397858002085]], [["Color", 0.30183727885272027, 0.46718354750112456], ["TranslateX", 0.9628952256033627, 0.10269543754135535]], [["AutoContrast", 0.6316709389784041, 0.84287698792044], ["Brightness", 0.5544761629904337, 0.025264772745200004]], [["Rotate", 0.08803313299532567, 0.306059720523696], ["Invert", 0.5222165872425064, 0.045935208620454304]], [["TranslateY", 0.21912346831923835, 0.48529224559004436], ["TranslateY", 0.15466734731903942, 0.8929485418495068]], [["ShearX", 0.17141022847016563, 0.8607600402165531], ["ShearX", 0.6890511341106859, 0.7540899265679949]], [["Invert", 0.9417455522972059, 0.9021733684991224], ["Solarize", 0.7693107057723746, 0.7268007946568782]], [["Posterize", 0.02376991543373752, 0.6768442864453844], ["Rotate", 0.7736875065112697, 0.6706331753139825]], [["Contrast", 0.3623841610390669, 0.15023657344457686], ["Equalize", 0.32975472189318666, 0.05629246869510651]], [["Sharpness", 0.7874882420165824, 0.49535778020457066], ["Posterize", 0.09485578893387558, 0.6170768580482466]], [["Brightness", 0.7099280202949585, 0.021523012961427335], ["Posterize", 0.2076371467666719, 0.17168118578815206]], [["Color", 0.8546367645761538, 0.832011891505731], ["Equalize", 0.6429734783051777, 0.2618995960561532]], [["Rotate", 0.8780793721476224, 0.5920897827664297], ["ShearX", 0.5338303685064825, 0.8605424531336439]], [["Sharpness", 0.7504493806631884, 0.9723552387375258], ["Sharpness", 0.3206385634203266, 0.45127845905824693]], [["ShearX", 0.23794709526711355, 0.06257530645720066], ["Solarize", 0.9132374030587093, 0.6240819934824045]], [["Sharpness", 0.790583587969259, 0.28551171786655405], ["Contrast", 0.39872982844590554, 0.09644706751019538]], [["Equalize", 0.30681999237432944, 0.5645045018157916], ["Posterize", 0.525966242669736, 0.7360106111256014]], [["TranslateX", 0.4881014179825114, 0.6317220208872226], ["ShearX", 0.2935158995550958, 0.23104608987381758]], [["Rotate", 0.49977116738568395, 0.6610761068306319], ["TranslateY", 0.7396566602715687, 0.09386747830045217]], [["ShearY", 0.5909773790018789, 0.16229529902832718], ["Equalize", 0.06461394468918358, 0.6661349001143908]], [["TranslateX", 0.7218443721851834, 0.04435720302810153], ["Cutout", 0.986686540951642, 0.734771197038724]], [["ShearX", 0.5353800096911666, 0.8120139502148365], ["Equalize", 0.4613239578449774, 0.5159528929124512]], [["Color", 0.0871713897628631, 0.7708895183198486], ["Solarize", 0.5811386808912219, 0.35260648120785887]], [["Posterize", 0.3910857927477053, 0.4329219555775561], ["Color", 0.9115983668789468, 0.6043069944145293]], [["Posterize", 0.07493067637060635, 0.4258000066006725], ["AutoContrast", 0.4740957581389772, 0.49069587151651295]], [["Rotate", 0.34086200894268937, 0.9812149332288828], ["Solarize", 0.6801012471371733, 0.17271491146753837]], [["Color", 0.20542270872895207, 0.5532087457727624], ["Contrast", 0.2718692536563381, 0.20313287569510108]], [["Equalize", 0.05199827210980934, 0.0832859890912212], ["AutoContrast", 0.8092395764794107, 0.7778945136511004]], [["Sharpness", 0.1907689513066838, 0.7705754572256907], ["Color", 0.3911178658498049, 0.41791326933095485]], [["Solarize", 0.19611855804748257, 0.2407807485604081], ["AutoContrast", 0.5343964972940493, 0.9034209455548394]], [["Color", 0.43586520148538865, 0.4711164626521439], ["ShearY", 0.28635408186820555, 0.8417816793020271]], [["Cutout", 0.09818482420382535, 0.1649767430954796], ["Cutout", 0.34582392911178494, 0.3927982995799828]], [["ShearX", 0.001253882705272269, 0.48661629027584596], ["Solarize", 0.9229221435457137, 0.44374894836659073]], [["Contrast", 0.6829734655718668, 0.8201750485099037], ["Cutout", 0.7886756837648936, 0.8423285219631946]], [["TranslateY", 0.857017093561528, 0.3038537151773969], ["Invert", 0.12809228606383538, 0.23637166191748027]], [["Solarize", 0.9829027723424164, 0.9723093910674763], ["Color", 0.6346495302126811, 0.5405494753107188]], [["AutoContrast", 0.06868643520377715, 0.23758659417688077], ["AutoContrast", 0.6648225411500879, 0.5618315648260103]], [["Invert", 0.44202305603311676, 0.9945938909685547], ["Equalize", 0.7991650497684454, 0.16014142656347097]], [["AutoContrast", 0.8778631604769588, 0.03951977631894088], ["ShearY", 0.8495160088963707, 0.35771447321250416]], [["Color", 0.5365078341001592, 0.21102444169782308], ["ShearX", 0.7168869678248874, 0.3904298719872734]], [["TranslateX", 0.6517203786101899, 0.6467598990650437], ["Invert", 0.26552491504364517, 0.1210812827294625]], [["Posterize", 0.35196021684368994, 0.8420648319941891], ["Invert", 0.7796829363930631, 0.9520895999240896]], [["Sharpness", 0.7391572148971984, 0.4853940393452846], ["TranslateX", 0.7641915295592839, 0.6351349057666782]], [["Posterize", 0.18485880221115913, 0.6117603277356728], ["Rotate", 0.6541660490605724, 0.5704041108375348]], [["TranslateY", 0.27517423188070533, 0.6610080904072458], ["Contrast", 0.6091250547289317, 0.7702443247557892]], [["Equalize", 0.3611798581067118, 0.6623615672642768], ["TranslateX", 0.9537265090885917, 0.06352772509358584]], [["ShearX", 0.09720029389103535, 0.7800423126320308], ["Invert", 0.30314352455858884, 0.8519925470889914]], [["Brightness", 0.06931529763458055, 0.57760829499712], ["Cutout", 0.637251974467394, 0.7184346129191052]], [["AutoContrast", 0.5026722100286064, 0.32025257156541886], ["Contrast", 0.9667478703047919, 0.14178519432669368]], [["Equalize", 0.5924463845816984, 0.7187610262181517], ["TranslateY", 0.7059479079159405, 0.06551471830655187]], [["Sharpness", 0.18161164512332928, 0.7576138481173385], ["Brightness", 0.19191138767695282, 0.7865880269424701]], [["Brightness", 0.36780861866078696, 0.0677855546737901], ["AutoContrast", 0.8491446654142264, 0.09217782099938121]], [["TranslateY", 0.06011399855120858, 0.8374487034710264], ["TranslateY", 0.8373922962070498, 0.1991295720254297]], [["Posterize", 0.702559916122481, 0.30257509683007755], ["Rotate", 0.249899495398891, 0.9370437251176267]], [["ShearX", 0.9237874098232075, 0.26241907483351146], ["Brightness", 0.7221766836146657, 0.6880749752986671]], [["Cutout", 0.37994098189193104, 0.7836874473657957], ["ShearX", 0.9212861960976824, 0.8140948561570449]], [["Posterize", 0.2584098274786417, 0.7990847652004848], ["Invert", 0.6357731737590063, 0.1066304859116326]], [["Sharpness", 0.4412790857539922, 0.9692465283229825], ["Color", 0.9857401617339051, 0.26755393929808713]], [["Equalize", 0.22348671644912665, 0.7370019910830038], ["Posterize", 0.5396106339575417, 0.5559536849843303]], [["Equalize", 0.8742967663495852, 0.2797122599926307], ["Rotate", 0.4697322053105951, 0.8769872942579476]], [["Sharpness", 0.44279911640509206, 0.07729581896071613], ["Cutout", 0.3589177366154631, 0.2704031551235969]], [["TranslateX", 0.614216412574085, 0.47929659784170453], ["Brightness", 0.6686234118438007, 0.05700784068205689]], [["ShearY", 0.17920614630857634, 0.4699685075827862], ["Color", 0.38251870810870003, 0.7262706923005887]], [["Solarize", 0.4951799001144561, 0.212775278026479], ["TranslateX", 0.8666105646463097, 0.6750496637519537]], [["Color", 0.8110864170849051, 0.5154263861958484], ["Sharpness", 0.2489044083898776, 0.3763372541462343]], [["Cutout", 0.04888193613483871, 0.06041664638981603], ["Color", 0.06438587718683708, 0.5797881428892969]], [["Rotate", 0.032427448352152166, 0.4445797818376559], ["Posterize", 0.4459357828482998, 0.5879865187630777]], [["ShearX", 0.1617179557693058, 0.050796802246318884], ["Cutout", 0.8142465452060423, 0.3836391305618707]], [["TranslateY", 0.1806857249209416, 0.36697730355422675], ["Rotate", 0.9897576550818276, 0.7483432452225264]], [["Brightness", 0.18278016458098223, 0.952352527690299], ["Cutout", 0.3269735224453044, 0.3924869905012752]], [["ShearX", 0.870832707718742, 0.3214743207190739], ["Cutout", 0.6805560681792573, 0.6984188155282459]], [["TranslateX", 0.4157118388833776, 0.3964216288135384], ["TranslateX", 0.3253012682285006, 0.624835513104391]], [["Contrast", 0.7678168037628158, 0.31033802162621793], ["ShearX", 0.27022424855977134, 0.3773245605126201]], [["TranslateX", 0.37812621869017593, 0.7657993810740699], ["Rotate", 0.18081890120092914, 0.8893511219618171]], [["Posterize", 0.8735859716088367, 0.18243793043074286], ["TranslateX", 0.90435994250313, 0.24116383818819453]], [["Invert", 0.06666709253664793, 0.3881076083593933], ["TranslateX", 0.3783333964963522, 0.14411014979589543]], [["Equalize", 0.8741147867162096, 0.14203839235846816], ["TranslateX", 0.7801536758037405, 0.6952401607812743]], [["Cutout", 0.6095335117944475, 0.5679026063718094], ["Posterize", 0.06433868172233115, 0.07139559616012303]], [["TranslateY", 0.3020364047315408, 0.21459810361176246], ["Cutout", 0.7097677414888889, 0.2942144632587549]], [["Brightness", 0.8223662419048653, 0.195700694016108], ["Invert", 0.09345407040803999, 0.779843655582099]], [["TranslateY", 0.7353462929356228, 0.0468520680237382], ["Cutout", 0.36530918247940425, 0.3897292909049672]], [["Invert", 0.9676896451721213, 0.24473302189463453], ["Invert", 0.7369271521408992, 0.8193267003356975]], [["Sharpness", 0.8691871972054326, 0.4441713912682772], ["ShearY", 0.47385584832119887, 0.23521684584675429]], [["ShearY", 0.9266946026184021, 0.7611986713358834], ["TranslateX", 0.6195820760253926, 0.14661428669483678]], [["Sharpness", 0.08470870576026868, 0.3380219099907229], ["TranslateX", 0.3062343307496658, 0.7135777338095889]], [["Sharpness", 0.5246448204194909, 0.3193061215236702], ["ShearX", 0.8160637208508432, 0.9720697396582731]], [["Posterize", 0.5249259956549405, 0.3492042382504774], ["Invert", 0.8183138799547441, 0.11107271762524618]], [["TranslateY", 0.210869733350744, 0.7138905840721885], ["Sharpness", 0.7773226404450125, 0.8005353621959782]], [["Posterize", 0.33067522385556025, 0.32046239220630124], ["AutoContrast", 0.18918147708798405, 0.4646281070474484]], [["TranslateX", 0.929502026131094, 0.8029128121556285], ["Invert", 0.7319794306118105, 0.5421878712623392]], [["ShearX", 0.25645940834182723, 0.42754710760160963], ["ShearX", 0.44640695310173306, 0.8132185532296811]], [["Color", 0.018436846416536312, 0.8439313862001113], ["Sharpness", 0.3722867661453415, 0.5103570873163251]], [["TranslateX", 0.7285989086776543, 0.4809027697099264], ["TranslateY", 0.9740807004893643, 0.8241085438636939]], [["Posterize", 0.8721868989693397, 0.5700907310383815], ["Posterize", 0.4219074410577852, 0.8032643572845402]], [["Contrast", 0.9811380092558266, 0.8498397471632105], ["Sharpness", 0.8380884329421594, 0.18351306571903125]], [["TranslateY", 0.3878939366762001, 0.4699103438753077], ["Invert", 0.6055556353233807, 0.8774727658400134]], [["TranslateY", 0.052317005261018346, 0.39471450378745787], ["ShearX", 0.8612486845942395, 0.28834103278807466]], [["Color", 0.511993351208063, 0.07251427040525904], ["Solarize", 0.9898097047354855, 0.299761565689576]], [["Equalize", 0.2721248231619904, 0.6870975927455507], ["Cutout", 0.8787327242363994, 0.06228061428917098]], [["Invert", 0.8931880335225408, 0.49720931867378193], ["Posterize", 0.9619698792159256, 0.17859639696940088]], [["Posterize", 0.0061688075074411985, 0.08082938731035938], ["Brightness", 0.27745128028826993, 0.8638528796903816]], [["ShearY", 0.9140200609222026, 0.8240421430867707], ["Invert", 0.651734417415332, 0.08871906369930926]], [["Color", 0.45585010413511196, 0.44705070078574316], ["Color", 0.26394624901633146, 0.11242877788650807]], [["ShearY", 0.9200278466372522, 0.2995901331149652], ["Cutout", 0.8445407215116278, 0.7410524214287446]], [["ShearY", 0.9950483746990132, 0.112964468262847], ["ShearY", 0.4118332303218585, 0.44839613407553636]], [["Contrast", 0.7905821952255192, 0.23360046159385106], ["Posterize", 0.8611787233956044, 0.8984260048943528]], [["TranslateY", 0.21448061359312853, 0.8228112806838331], ["Contrast", 0.8992297266152983, 0.9179231590570998]], [["Invert", 0.3924194798946006, 0.31830516468371495], ["Rotate", 0.8399556845248508, 0.3764892022932781]], [["Cutout", 0.7037916990046816, 0.9214620769502728], ["AutoContrast", 0.02913794613018239, 0.07808607528954048]], [["ShearY", 0.6041490474263381, 0.6094184590800105], ["Equalize", 0.2932954517354919, 0.5840888946081727]], [["ShearX", 0.6056801676269449, 0.6948580442549543], ["Cutout", 0.3028001021044615, 0.15117101733894078]], [["Brightness", 0.8011486803860253, 0.18864079729374195], ["Solarize", 0.014965327213230961, 0.8842620292527029]], [["Invert", 0.902244007904273, 0.5634673798052033], ["Equalize", 0.13422913507398349, 0.4110956745883727]], [["TranslateY", 0.9981773319103838, 0.09568550987216096], ["Color", 0.7627662124105109, 0.8494409737419493]], [["Cutout", 0.3013527640416782, 0.03377226729898486], ["ShearX", 0.5727964831614619, 0.8784196638222834]], [["TranslateX", 0.6050722426803684, 0.3650103962378708], ["TranslateX", 0.8392084589130886, 0.6479816470292911]], [["Rotate", 0.5032806606500023, 0.09276980118866307], ["TranslateY", 0.7800234515261191, 0.18896454379343308]], [["Invert", 0.9266027256244017, 0.8246111062199752], ["Contrast", 0.12112023357797697, 0.33870762271759436]], [["Brightness", 0.8688784756993134, 0.17263759696106606], ["ShearX", 0.5133700431071326, 0.6686811994542494]], [["Invert", 0.8347840440941976, 0.03774897445901726], ["Brightness", 0.24925057499276548, 0.04293631677355758]], [["Color", 0.5998145279485104, 0.4820093200092529], ["TranslateY", 0.6709586184077769, 0.07377334081382858]], [["AutoContrast", 0.7898846202957984, 0.325293526672498], ["Contrast", 0.5156435596826767, 0.2889223168660645]], [["ShearX", 0.08147389674998307, 0.7978924681113669], ["Contrast", 0.7270003309106291, 0.009571215234092656]], [["Sharpness", 0.417607614440786, 0.9532566433338661], ["Posterize", 0.7186586546796782, 0.6936509907073302]], [["ShearX", 0.9555300215926675, 0.1399385550263872], ["Color", 0.9981041061848231, 0.5037462398323248]], [["Equalize", 0.8003487831375474, 0.5413759363796945], ["ShearY", 0.0026607045117773565, 0.019262273030984933]], [["TranslateY", 0.04845391502469176, 0.10063445212118283], ["Cutout", 0.8273170186786745, 0.5045257728554577]], [["TranslateX", 0.9690985344978033, 0.505202991815533], ["TranslateY", 0.7255326592928096, 0.02103609500701631]], [["Solarize", 0.4030771176836736, 0.8424237871457034], ["Cutout", 0.28705805963928965, 0.9601617893682582]], [["Sharpness", 0.16865290353070606, 0.6899673563468826], ["Posterize", 0.3985430034869616, 0.6540651997730774]], [["ShearY", 0.21395578485362032, 0.09519358818949009], ["Solarize", 0.6692821708524135, 0.6462523623552485]], [["AutoContrast", 0.912360598054091, 0.029800239085051583], ["Invert", 0.04319256403746308, 0.7712501517098587]], [["ShearY", 0.9081969961839055, 0.4581560239984739], ["AutoContrast", 0.5313894814729159, 0.5508393335751848]], [["ShearY", 0.860528568424097, 0.8196987216301588], ["Posterize", 0.41134650331494205, 0.3686632018978778]], [["AutoContrast", 0.8753670810078598, 0.3679438326304749], ["Invert", 0.010444228965415858, 0.9581244779208277]], [["Equalize", 0.07071836206680682, 0.7173594756186462], ["Brightness", 0.06111434312497388, 0.16175064669049277]], [["AutoContrast", 0.10522219073562122, 0.9768776621069855], ["TranslateY", 0.2744795945215529, 0.8577967957127298]], [["AutoContrast", 0.7628146493166175, 0.996157376418147], ["Contrast", 0.9255565598518469, 0.6826126662976868]], [["TranslateX", 0.017225816199011312, 0.2470332491402908], ["Solarize", 0.44048494909493807, 0.4492422515972162]], [["ShearY", 0.38885252627795064, 0.10272256704901939], ["Equalize", 0.686154959829183, 0.8973517148655337]], [["Rotate", 0.29628991573592967, 0.16639926575004715], ["ShearX", 0.9013782324726413, 0.0838318162771563]], [["Color", 0.04968391374688563, 0.6138600739645352], ["Invert", 0.11177127838716283, 0.10650198522261578]], [["Invert", 0.49655016367624016, 0.8603374164829688], ["ShearY", 0.40625439617553727, 0.4516437918820778]], [["TranslateX", 0.15015718916062992, 0.13867777502116208], ["Brightness", 0.3374464418810188, 0.7613355669536931]], [["Invert", 0.644644393321966, 0.19005804481199562], ["AutoContrast", 0.2293259789431853, 0.30335723256340186]], [["Solarize", 0.004968793254801596, 0.5370892072646645], ["Contrast", 0.9136902637865596, 0.9510587477779084]], [["Rotate", 0.38991518440867123, 0.24796987467455756], ["Sharpness", 0.9911180315669776, 0.5265657122981591]], [["Solarize", 0.3919646484436238, 0.6814994037194909], ["Sharpness", 0.4920838987787103, 0.023425724294012018]], [["TranslateX", 0.25107587874378867, 0.5414936560189212], ["Cutout", 0.7932919623814599, 0.9891303444820169]], [["Brightness", 0.07863012174272999, 0.045175652208389594], ["Solarize", 0.889609658064552, 0.8228793315963948]], [["Cutout", 0.20477096178169596, 0.6535063675027364], ["ShearX", 0.9216318577173639, 0.2908690977359947]], [["Contrast", 0.7035118947423187, 0.45982709058312454], ["Contrast", 0.7130268070749464, 0.8635123354235471]], [["Sharpness", 0.26319477541228997, 0.7451278726847078], ["Rotate", 0.8170499362173754, 0.13998593411788207]], [["Rotate", 0.8699365715164192, 0.8878057721750832], ["Equalize", 0.06682350555715044, 0.7164702080630689]], [["ShearY", 0.3137466057521987, 0.6747433496011368], ["Rotate", 0.42118828936218133, 0.980121180104441]], [["Solarize", 0.8470375049950615, 0.15287589264139223], ["Cutout", 0.14438435054693055, 0.24296463267973512]], [["TranslateY", 0.08822241792224905, 0.36163911974799356], ["TranslateY", 0.11729726813270003, 0.6230889726445291]], [["ShearX", 0.7720112337718541, 0.2773292905760122], ["Sharpness", 0.756290929398613, 0.27830353710507705]], [["Color", 0.33825031007968287, 0.4657590047522816], ["ShearY", 0.3566628994713067, 0.859750504071925]], [["TranslateY", 0.06830147433378053, 0.9348778582086664], ["TranslateX", 0.15509346516378553, 0.26320778885339435]], [["Posterize", 0.20266751150740858, 0.008351463842578233], ["Sharpness", 0.06506971109417259, 0.7294471760284555]], [["TranslateY", 0.6278911394418829, 0.8702181892620695], ["Invert", 0.9367073860264247, 0.9219230428944211]], [["Sharpness", 0.1553425337673321, 0.17601557714491345], ["Solarize", 0.7040449681338888, 0.08764313147327729]], [["Equalize", 0.6082233904624664, 0.4177428549911376], ["AutoContrast", 0.04987405274618151, 0.34516208204700916]], [["Brightness", 0.9616085936167699, 0.14561237331885468], ["Solarize", 0.8927707736296572, 0.31176907850205704]], [["Brightness", 0.6707778304730988, 0.9046457117525516], ["Brightness", 0.6801448953060988, 0.20015313057149042]], [["Color", 0.8292680845499386, 0.5181603879593888], ["Brightness", 0.08549161770369762, 0.6567870536463203]], [["ShearY", 0.267802208078051, 0.8388133819588173], ["Sharpness", 0.13453409120796123, 0.10028351311149486]], [["Posterize", 0.775796593610272, 0.05359034561289766], ["Cutout", 0.5067360625733027, 0.054451986840317934]], [["TranslateX", 0.5845238647690084, 0.7507147553486293], ["Brightness", 0.2642051786121197, 0.2578358927056452]], [["Cutout", 0.10787517610922692, 0.8147986902794228], ["Contrast", 0.2190149206329539, 0.902210615462459]], [["TranslateX", 0.5663614214181296, 0.05309965916414028], ["ShearX", 0.9682797885154938, 0.41791929533938466]], [["ShearX", 0.2345325577621098, 0.383780128037189], ["TranslateX", 0.7298083748149163, 0.644325797667087]], [["Posterize", 0.5138725709682734, 0.7901809917259563], ["AutoContrast", 0.7966018627776853, 0.14529337543427345]], [["Invert", 0.5973031989249785, 0.417399314592829], ["Solarize", 0.9147539948653116, 0.8221272315548086]], [["Posterize", 0.601596043336383, 0.18969646160963938], ["Color", 0.7527275484079655, 0.431793831326888]], [["Equalize", 0.6731483454430538, 0.7866786558207602], ["TranslateX", 0.97574396899191, 0.5970255778044692]], [["Cutout", 0.15919495850169718, 0.8916094305850562], ["Invert", 0.8351348834751027, 0.4029937360314928]], [["Invert", 0.5894085405226027, 0.7283806854157764], ["Brightness", 0.3973976860470554, 0.949681121498567]], [["AutoContrast", 0.3707914135327408, 0.21192068592079616], ["ShearX", 0.28040127351140676, 0.6754553511344856]], [["Solarize", 0.07955132378694896, 0.15073572961927306], ["ShearY", 0.5735850168851625, 0.27147326850217746]], [["Equalize", 0.678653949549764, 0.8097796067861455], ["Contrast", 0.2283048527510083, 0.15507804874474185]], [["Equalize", 0.286013868374536, 0.186785848694501], ["Posterize", 0.16319021740810458, 0.1201304443285659]], [["Sharpness", 0.9601590830563757, 0.06267915026513238], ["AutoContrast", 0.3813920685124327, 0.294224403296912]], [["Brightness", 0.2703246632402241, 0.9168405377492277], ["ShearX", 0.6156009855831097, 0.4955986055846403]], [["Color", 0.9065504424987322, 0.03393612216080133], ["ShearY", 0.6768595880405884, 0.9981068127818191]], [["Equalize", 0.28812842368483904, 0.300387487349145], ["ShearY", 0.28812248704858345, 0.27105076231533964]], [["Brightness", 0.6864882730513477, 0.8205553299102412], ["Cutout", 0.45995236371265424, 0.5422030370297759]], [["Color", 0.34941404877084326, 0.25857961830158516], ["AutoContrast", 0.3451390878441899, 0.5000938249040454]], [["Invert", 0.8268247541815854, 0.6691380821226468], ["Cutout", 0.46489193601530476, 0.22620873109485895]], [["Rotate", 0.17879730528062376, 0.22670425330593935], ["Sharpness", 0.8692795688221834, 0.36586055020855723]], [["Brightness", 0.31203975139659634, 0.6934046293010939], ["Cutout", 0.31649437872271236, 0.08078625004157935]], [["Cutout", 0.3119482836150119, 0.6397160035509996], ["Contrast", 0.8311248624784223, 0.22897510169718616]], [["TranslateX", 0.7631157841429582, 0.6482890521284557], ["Brightness", 0.12681196272427664, 0.3669813784257344]], [["TranslateX", 0.06027722649179801, 0.3101104512201861], ["Sharpness", 0.5652076706249394, 0.05210008400968136]], [["AutoContrast", 0.39213552101583127, 0.5047021194355596], ["ShearY", 0.7164003055682187, 0.8063370761002899]], [["Solarize", 0.9574307011238342, 0.21472064809226854], ["AutoContrast", 0.8102612285047174, 0.716870148067014]], [["Rotate", 0.3592634277567387, 0.6452602893051465], ["AutoContrast", 0.27188430331411506, 0.06003099168464854]], [["Cutout", 0.9529536554825503, 0.5285505311027461], ["Solarize", 0.08478231903311029, 0.15986449762728216]], [["TranslateY", 0.31176130458018936, 0.5642853506158253], ["Equalize", 0.008890883901317648, 0.5146121040955942]], [["Color", 0.40773645085566157, 0.7110398926612682], ["Color", 0.18233100156439364, 0.7830036002758337]], [["Posterize", 0.5793809197821732, 0.043748553135581236], ["Invert", 0.4479962016131668, 0.7349663010359488]], [["TranslateX", 0.1994882312299382, 0.05216859488899439], ["Rotate", 0.48288726352035416, 0.44713829026777585]], [["Posterize", 0.22122838185154603, 0.5034546841241283], ["TranslateX", 0.2538745835410222, 0.6129055170893385]], [["Color", 0.6786559960640814, 0.4529749369803212], ["Equalize", 0.30215879674415336, 0.8733394611096772]], [["Contrast", 0.47316062430673456, 0.46669538897311447], ["Invert", 0.6514906551984854, 0.3053339444067804]], [["Equalize", 0.6443202625334524, 0.8689731394616441], ["Color", 0.7549183794057628, 0.8889001426329578]], [["Solarize", 0.616709740662654, 0.7792180816399313], ["ShearX", 0.9659155537406062, 0.39436937531179495]], [["Equalize", 0.23694011299406226, 0.027711152164392128], ["TranslateY", 0.1677339686527083, 0.3482126536808231]], [["Solarize", 0.15234175951790285, 0.7893840414281341], ["TranslateX", 0.2396395768284183, 0.27727219214979715]], [["Contrast", 0.3792017455380605, 0.32323660409845334], ["Contrast", 0.1356037413846466, 0.9127772969992305]], [["ShearX", 0.02642732222284716, 0.9184662576502115], ["Equalize", 0.11504884472142995, 0.8957638893097964]], [["TranslateY", 0.3193812913345325, 0.8828100030493128], ["ShearY", 0.9374975727563528, 0.09909415611083694]], [["AutoContrast", 0.025840721736048122, 0.7941037581373024], ["TranslateY", 0.498518003323313, 0.5777122846572548]], [["ShearY", 0.6042199307830248, 0.44809668754508836], ["Cutout", 0.3243978207701482, 0.9379740926294765]], [["ShearY", 0.6858549297583574, 0.9993252035788924], ["Sharpness", 0.04682428732773203, 0.21698099707915652]], [["ShearY", 0.7737469436637263, 0.8810127181224531], ["ShearY", 0.8995655445246451, 0.4312416220354539]], [["TranslateY", 0.4953094136709374, 0.8144161580138571], ["Solarize", 0.26301211718928097, 0.518345311180405]], [["Brightness", 0.8820246486031275, 0.571075863786249], ["ShearX", 0.8586669146703955, 0.0060476383595142735]], [["Sharpness", 0.20519233710982254, 0.6144574759149729], ["Posterize", 0.07976625267460813, 0.7480145046726968]], [["ShearY", 0.374075419680195, 0.3386105402023202], ["ShearX", 0.8228083637082115, 0.5885174783155361]], [["Brightness", 0.3528780713814561, 0.6999884884306623], ["Sharpness", 0.3680348120526238, 0.16953358258959617]], [["Brightness", 0.24891223104442084, 0.7973853494920095], ["TranslateX", 0.004256803835524736, 0.0470216343108546]], [["Posterize", 0.1947344282646012, 0.7694802711054367], ["Cutout", 0.9594385534844785, 0.5469744140592429]], [["Invert", 0.19012504762806026, 0.7816140211434693], ["TranslateY", 0.17479746932338402, 0.024249345245078602]], [["Rotate", 0.9669262055946796, 0.510166180775991], ["TranslateX", 0.8990602034610352, 0.6657802719304693]], [["ShearY", 0.5453049050407278, 0.8476872739603525], ["Cutout", 0.14226529093962592, 0.15756960661106634]], [["Equalize", 0.5895291156113004, 0.6797218994447763], ["TranslateY", 0.3541442192192753, 0.05166001155849864]], [["Equalize", 0.39530681662726097, 0.8448335365081087], ["Brightness", 0.6785483272734143, 0.8805568647038574]], [["Cutout", 0.28633258271917905, 0.7750870268336066], ["Equalize", 0.7221097824537182, 0.5865506280531162]], [["Posterize", 0.9044429629421187, 0.4620266401793388], ["Invert", 0.1803008045494473, 0.8073190766288534]], [["Sharpness", 0.7054649148075851, 0.3877207948962055], ["TranslateX", 0.49260224225927285, 0.8987462620731029]], [["Sharpness", 0.11196934729294483, 0.5953704422694938], ["Contrast", 0.13969334315069737, 0.19310569898434204]], [["Posterize", 0.5484346101051778, 0.7914140118600685], ["Brightness", 0.6428044691630473, 0.18811316670808076]], [["Invert", 0.22294834094984717, 0.05173157689962704], ["Cutout", 0.6091129168510456, 0.6280845506243643]], [["AutoContrast", 0.5726444076195267, 0.2799840903601295], ["Cutout", 0.3055752727786235, 0.591639807512993]], [["Brightness", 0.3707116723204462, 0.4049175910826627], ["Rotate", 0.4811601625588309, 0.2710760253723644]], [["ShearY", 0.627791719653608, 0.6877498291550205], ["TranslateX", 0.8751753308366824, 0.011164650018719358]], [["Posterize", 0.33832547954522263, 0.7087039872581657], ["Posterize", 0.6247474435007484, 0.7707784192114796]], [["Contrast", 0.17620186308493468, 0.9946224854942095], ["Solarize", 0.5431896088395964, 0.5867904203742308]], [["ShearX", 0.4667959516719652, 0.8938082224109446], ["TranslateY", 0.7311343008292865, 0.6829842246020277]], [["ShearX", 0.6130281467237769, 0.9924010909612302], ["Brightness", 0.41039241699696916, 0.9753218875311392]], [["TranslateY", 0.0747250386427123, 0.34602725521067534], ["Rotate", 0.5902597465515901, 0.361094672021087]], [["Invert", 0.05234890878959486, 0.36914978664919407], ["Sharpness", 0.42140532878231374, 0.19204058551048275]], [["ShearY", 0.11590485361909497, 0.6518540857972316], ["Invert", 0.6482444740361704, 0.48256237896163945]], [["Rotate", 0.4931329446923608, 0.037076242417301675], ["Contrast", 0.9097939772412852, 0.5619594905306389]], [["Posterize", 0.7311032479626216, 0.4796364593912915], ["Color", 0.13912123993932402, 0.03997286439663705]], [["AutoContrast", 0.6196602944085344, 0.2531430457527588], ["Rotate", 0.5583937060431972, 0.9893379795224023]], [["AutoContrast", 0.8847753125072959, 0.19123028952580057], ["TranslateY", 0.494361716097206, 0.14232297727461696]], [["Invert", 0.6212360716340707, 0.033898871473033165], ["AutoContrast", 0.30839896957008295, 0.23603569542166247]], [["Equalize", 0.8255583546605049, 0.613736933157845], ["AutoContrast", 0.6357166629525485, 0.7894617347709095]], [["Brightness", 0.33840706322846814, 0.07917167871493658], ["ShearY", 0.15693175752528676, 0.6282773652129153]], [["Cutout", 0.7550520024859294, 0.08982367300605598], ["ShearX", 0.5844942417320858, 0.36051195083380105]]] return p def fa_resnet50_rimagenet(): p = [[["ShearY", 0.14143816458479197, 0.513124791615952], ["Sharpness", 0.9290316227291179, 0.9788406212603302]], [["Color", 0.21502874228385338, 0.3698477943880306], ["TranslateY", 0.49865058747734736, 0.4352676987103321]], [["Brightness", 0.6603452126485386, 0.6990174510500261], ["Cutout", 0.7742953773992511, 0.8362550883640804]], [["Posterize", 0.5188375788270497, 0.9863648925446865], ["TranslateY", 0.8365230108655313, 0.6000972236440252]], [["ShearY", 0.9714994964711299, 0.2563663552809896], ["Equalize", 0.8987567223581153, 0.1181761775609772]], [["Sharpness", 0.14346409304565366, 0.5342189791746006], ["Sharpness", 0.1219714162835897, 0.44746801278319975]], [["TranslateX", 0.08089260772173967, 0.028011721602479833], ["TranslateX", 0.34767877352421406, 0.45131294688688794]], [["Brightness", 0.9191164585327378, 0.5143232242627864], ["Color", 0.9235247849934283, 0.30604586249462173]], [["Contrast", 0.4584173187505879, 0.40314219914942756], ["Rotate", 0.550289356406774, 0.38419022293237126]], [["Posterize", 0.37046156420799325, 0.052693291117634544], ["Cutout", 0.7597581409366909, 0.7535799791937421]], [["Color", 0.42583964114658746, 0.6776641859552079], ["ShearY", 0.2864805671096011, 0.07580175477739545]], [["Brightness", 0.5065952125552232, 0.5508640233704984], ["Brightness", 0.4760021616081475, 0.3544313318097987]], [["Posterize", 0.5169630851995185, 0.9466018906715961], ["Posterize", 0.5390336503396841, 0.1171015788193209]], [["Posterize", 0.41153170909576176, 0.7213063942615204], ["Rotate", 0.6232230424824348, 0.7291984098675746]], [["Color", 0.06704687234714028, 0.5278429246040438], ["Sharpness", 0.9146652195810183, 0.4581415618941407]], [["ShearX", 0.22404644446773492, 0.6508620171913467], ["Brightness", 0.06421961538672451, 0.06859528721039095]], [["Rotate", 0.29864103693134797, 0.5244313199644495], ["Sharpness", 0.4006161706584276, 0.5203708477368657]], [["AutoContrast", 0.5748186910788027, 0.8185482599354216], ["Posterize", 0.9571441684265188, 0.1921474117448481]], [["ShearY", 0.5214786760436251, 0.8375629059785009], ["Invert", 0.6872393349333636, 0.9307694335024579]], [["Contrast", 0.47219838080793364, 0.8228524484275648], ["TranslateY", 0.7435518856840543, 0.5888865560614439]], [["Posterize", 0.10773482839638836, 0.6597021018893648], ["Contrast", 0.5218466423129691, 0.562985661685268]], [["Rotate", 0.4401753067886466, 0.055198255925702475], ["Rotate", 0.3702153509335602, 0.5821574425474759]], [["TranslateY", 0.6714729117832363, 0.7145542887432927], ["Equalize", 0.0023263758097700205, 0.25837341854887885]], [["Cutout", 0.3159707561240235, 0.19539664199170742], ["TranslateY", 0.8702824829864558, 0.5832348977243467]], [["AutoContrast", 0.24800812729140026, 0.08017301277245716], ["Brightness", 0.5775505849482201, 0.4905904775616114]], [["Color", 0.4143517886294533, 0.8445937742921498], ["ShearY", 0.28688910858536587, 0.17539366839474402]], [["Brightness", 0.6341134194059947, 0.43683815933640435], ["Brightness", 0.3362277685899835, 0.4612826163288225]], [["Sharpness", 0.4504035748829761, 0.6698294470467474], ["Posterize", 0.9610055612671645, 0.21070714173174876]], [["Posterize", 0.19490421920029832, 0.7235798208354267], ["Rotate", 0.8675551331308305, 0.46335565746433094]], [["Color", 0.35097958351003306, 0.42199181561523186], ["Invert", 0.914112788087429, 0.44775583211984815]], [["Cutout", 0.223575616055454, 0.6328591417299063], ["TranslateY", 0.09269465212259387, 0.5101073959070608]], [["Rotate", 0.3315734525975911, 0.9983593458299167], ["Sharpness", 0.12245416662856974, 0.6258689139914664]], [["ShearY", 0.696116760180471, 0.6317805202283014], ["Color", 0.847501151593963, 0.4440116609830195]], [["Solarize", 0.24945891607225948, 0.7651150206105561], ["Cutout", 0.7229677092930331, 0.12674657348602494]], [["TranslateX", 0.43461945065713675, 0.06476571036747841], ["Color", 0.6139316940180952, 0.7376264330632316]], [["Invert", 0.1933003530637138, 0.4497819016184308], ["Invert", 0.18391634069983653, 0.3199769100951113]], [["Color", 0.20418296626476137, 0.36785101882029814], ["Posterize", 0.624658293920083, 0.8390081535735991]], [["Sharpness", 0.5864963540530814, 0.586672446690273], ["Posterize", 0.1980280647652339, 0.222114611452575]], [["Invert", 0.3543654961628104, 0.5146369635250309], ["Equalize", 0.40751271919434434, 0.4325310837291978]], [["ShearY", 0.22602859359451877, 0.13137880879778158], ["Posterize", 0.7475029061591305, 0.803900538461099]], [["Sharpness", 0.12426276165599924, 0.5965912716602046], ["Invert", 0.22603903038966913, 0.4346802001255868]], [["TranslateY", 0.010307035630661765, 0.16577665156754046], ["Posterize", 0.4114319141395257, 0.829872913683949]], [["TranslateY", 0.9353069865746215, 0.5327821671247214], ["Color", 0.16990443486261103, 0.38794866007484197]], [["Cutout", 0.1028174322829021, 0.3955952903458266], ["ShearY", 0.4311995281335693, 0.48024695395374734]], [["Posterize", 0.1800334334284686, 0.0548749478418862], ["Brightness", 0.7545808536793187, 0.7699080551646432]], [["Color", 0.48695305373084197, 0.6674269768464615], ["ShearY", 0.4306032279086781, 0.06057690550239343]], [["Brightness", 0.4919399683825053, 0.677338905806407], ["Brightness", 0.24112708387760828, 0.42761103121157656]], [["Posterize", 0.4434818644882532, 0.9489450593207714], ["Posterize", 0.40957675116385955, 0.015664946759584186]], [["Posterize", 0.41307949855153797, 0.6843276552020272], ["Rotate", 0.8003545094091291, 0.7002300783416026]], [["Color", 0.7038570031770905, 0.4697612983649519], ["Sharpness", 0.9700016496081002, 0.25185103545948884]], [["AutoContrast", 0.714641656154856, 0.7962423001719023], ["Sharpness", 0.2410097684093468, 0.5919171048019731]], [["TranslateX", 0.8101567644494714, 0.7156447005337443], ["Solarize", 0.5634727831229329, 0.8875158446846]], [["Sharpness", 0.5335258857303261, 0.364743126378182], ["Color", 0.453280875871377, 0.5621962714743068]], [["Cutout", 0.7423678127672542, 0.7726370777867049], ["Invert", 0.2806161382641934, 0.6021111986900146]], [["TranslateY", 0.15190341320343761, 0.3860373175487939], ["Cutout", 0.9980805818665679, 0.05332384819400854]], [["Posterize", 0.36518675678786605, 0.2935819027397963], ["TranslateX", 0.26586180351840005, 0.303641300745208]], [["Brightness", 0.19994509744377761, 0.90813953707639], ["Equalize", 0.8447217761297836, 0.3449396603478335]], [["Sharpness", 0.9294773669936768, 0.999713346583839], ["Brightness", 0.1359744825665662, 0.1658489221872924]], [["TranslateX", 0.11456529257659381, 0.9063795878367734], ["Equalize", 0.017438134319894553, 0.15776887259743755]], [["ShearX", 0.9833726383270114, 0.5688194948373335], ["Equalize", 0.04975615490994345, 0.8078130016227757]], [["Brightness", 0.2654654830488695, 0.8989789725280538], ["TranslateX", 0.3681535065952329, 0.36433345713161036]], [["Rotate", 0.04956524209892327, 0.5371942433238247], ["ShearY", 0.0005527499145153714, 0.56082571605602]], [["Rotate", 0.7918337108932019, 0.5906896260060501], ["Posterize", 0.8223967034091191, 0.450216998388943]], [["Color", 0.43595106766978337, 0.5253013785221605], ["Sharpness", 0.9169421073531799, 0.8439997639348893]], [["TranslateY", 0.20052300197155504, 0.8202662448307549], ["Sharpness", 0.2875792108435686, 0.6997181624527842]], [["Color", 0.10568089980973616, 0.3349467065132249], ["Brightness", 0.13070947282207768, 0.5757725013960775]], [["AutoContrast", 0.3749999712869779, 0.6665578760607657], ["Brightness", 0.8101178402610292, 0.23271946112218125]], [["Color", 0.6473605933679651, 0.7903409763232029], ["ShearX", 0.588080941572581, 0.27223524148254086]], [["Cutout", 0.46293361616697304, 0.7107761001833921], ["AutoContrast", 0.3063766931658412, 0.8026114219854579]], [["Brightness", 0.7884854981520251, 0.5503669863113797], ["Brightness", 0.5832456158675261, 0.5840349298921661]], [["Solarize", 0.4157539625058916, 0.9161905834309929], ["Sharpness", 0.30628197221802017, 0.5386291658995193]], [["Sharpness", 0.03329610069672856, 0.17066672983670506], ["Invert", 0.9900547302690527, 0.6276238841220477]], [["Solarize", 0.551015648982762, 0.6937104775938737], ["Color", 0.8838491591064375, 0.31596634380795385]], [["AutoContrast", 0.16224182418148447, 0.6068227969351896], ["Sharpness", 0.9599468096118623, 0.4885289719905087]], [["TranslateY", 0.06576432526133724, 0.6899544605400214], ["Posterize", 0.2177096480169678, 0.9949164789616582]], [["Solarize", 0.529820544480292, 0.7576047224165541], ["Sharpness", 0.027047878909321643, 0.45425231553970685]], [["Sharpness", 0.9102526010473146, 0.8311987141993857], ["Invert", 0.5191838751826638, 0.6906136644742229]], [["Solarize", 0.4762773516008588, 0.7703654263842423], ["Color", 0.8048437792602289, 0.4741523094238038]], [["Sharpness", 0.7095055508594206, 0.7047344238075169], ["Sharpness", 0.5059623654132546, 0.6127255499234886]], [["TranslateY", 0.02150725921966186, 0.3515764519224378], ["Posterize", 0.12482170119714735, 0.7829851754051393]], [["Color", 0.7983830079184816, 0.6964694521670339], ["Brightness", 0.3666527856286296, 0.16093151636495978]], [["AutoContrast", 0.6724982375829505, 0.536777706678488], ["Sharpness", 0.43091754837597646, 0.7363240924241439]], [["Brightness", 0.2889770401966227, 0.4556557902380539], ["Sharpness", 0.8805303296690755, 0.6262218017754902]], [["Sharpness", 0.5341939854581068, 0.6697109101429343], ["Rotate", 0.6806606655137529, 0.4896914517968317]], [["Sharpness", 0.5690509737059344, 0.32790632371915096], ["Posterize", 0.7951894258661069, 0.08377850335209162]], [["Color", 0.6124132978216081, 0.5756485920709012], ["Brightness", 0.33053544654445344, 0.23321841707002083]], [["TranslateX", 0.0654795026615917, 0.5227246924310244], ["ShearX", 0.2932320531132063, 0.6732066478183716]], [["Cutout", 0.6226071187083615, 0.01009274433736012], ["ShearX", 0.7176799968189801, 0.3758780240463811]], [["Rotate", 0.18172339508029314, 0.18099184896819184], ["ShearY", 0.7862658331645667, 0.295658135767252]], [["Contrast", 0.4156099177015862, 0.7015784500878446], ["Sharpness", 0.6454135310009, 0.32335858947955287]], [["Color", 0.6215885089922037, 0.6882673235388836], ["Brightness", 0.3539881732605379, 0.39486736455795496]], [["Invert", 0.8164816716866418, 0.7238192000817796], ["Sharpness", 0.3876355847343607, 0.9870077619731956]], [["Brightness", 0.1875628712629315, 0.5068115936257], ["Sharpness", 0.8732419122060423, 0.5028019258530066]], [["Sharpness", 0.6140734993408259, 0.6458239834366959], ["Rotate", 0.5250107862824867, 0.533419456933602]], [["Sharpness", 0.5710893143725344, 0.15551651073007305], ["ShearY", 0.6548487860151722, 0.021365083044319146]], [["Color", 0.7610250354649954, 0.9084452893074055], ["Brightness", 0.6934611792619156, 0.4108071412071374]], [["ShearY", 0.07512550098923898, 0.32923768385754293], ["ShearY", 0.2559588911696498, 0.7082337365398496]], [["Cutout", 0.5401319018926146, 0.004750568603408445], ["ShearX", 0.7473354415031975, 0.34472481968368773]], [["Rotate", 0.02284154583679092, 0.1353450082435801], ["ShearY", 0.8192458031684238, 0.2811653613473772]], [["Contrast", 0.21142896718139154, 0.7230739568811746], ["Sharpness", 0.6902690582665707, 0.13488436112901683]], [["Posterize", 0.21701219600958138, 0.5900695769640687], ["Rotate", 0.7541095031505971, 0.5341162375286219]], [["Posterize", 0.5772853064792737, 0.45808311743269936], ["Brightness", 0.14366050177823675, 0.4644871239446629]], [["Cutout", 0.8951718842805059, 0.4970074074310499], ["Equalize", 0.3863835903119882, 0.9986531042150006]], [["Equalize", 0.039411354473938925, 0.7475477254908457], ["Sharpness", 0.8741966378291861, 0.7304822679596362]], [["Solarize", 0.4908704265218634, 0.5160677350249471], ["Color", 0.24961813832742435, 0.09362352627360726]], [["Rotate", 7.870457075154214e-05, 0.8086950025500952], ["Solarize", 0.10200484521793163, 0.12312889222989265]], [["Contrast", 0.8052564975559727, 0.3403813036543645], ["Solarize", 0.7690158533600184, 0.8234626822018851]], [["AutoContrast", 0.680362728854513, 0.9415320040873628], ["TranslateY", 0.5305871824686941, 0.8030609611614028]], [["Cutout", 0.1748050257378294, 0.06565343731910589], ["TranslateX", 0.1812738872339903, 0.6254461448344308]], [["Brightness", 0.4230502644722749, 0.3346463682905031], ["ShearX", 0.19107198973659312, 0.6715789128604919]], [["ShearX", 0.1706528684548394, 0.7816570201200446], ["TranslateX", 0.494545185948171, 0.4710810058360291]], [["TranslateX", 0.42356251508933324, 0.23865307292867322], ["TranslateX", 0.24407503619326745, 0.6013778508137331]], [["AutoContrast", 0.7719512185744232, 0.3107905373009763], ["ShearY", 0.49448082925617176, 0.5777951230577671]], [["Cutout", 0.13026983827940525, 0.30120438757485657], ["Brightness", 0.8857896834516185, 0.7731541459513939]], [["AutoContrast", 0.6422800349197934, 0.38637401090264556], ["TranslateX", 0.25085431400995084, 0.3170642592664873]], [["Sharpness", 0.22336654455367122, 0.4137774852324138], ["ShearY", 0.22446851054920894, 0.518341735882535]], [["Color", 0.2597579403253848, 0.7289643913060193], ["Sharpness", 0.5227416670468619, 0.9239943674030637]], [["Cutout", 0.6835337711563527, 0.24777620448593812], ["AutoContrast", 0.37260245353051846, 0.4840361183247263]], [["Posterize", 0.32756602788628375, 0.21185124493743707], ["ShearX", 0.25431504951763967, 0.19585996561416225]], [["AutoContrast", 0.07930627591849979, 0.5719381348340309], ["AutoContrast", 0.335512380071304, 0.4208050118308541]], [["Rotate", 0.2924360268257798, 0.5317629242879337], ["Sharpness", 0.4531050021499891, 0.4102650087199528]], [["Equalize", 0.5908862210984079, 0.468742362277498], ["Brightness", 0.08571766548550425, 0.5629320703375056]], [["Cutout", 0.52751122383816, 0.7287774744737556], ["Equalize", 0.28721628275296274, 0.8075179887475786]], [["AutoContrast", 0.24208377391366226, 0.34616549409607644], ["TranslateX", 0.17454707403766834, 0.5278055700078459]], [["Brightness", 0.5511881924749478, 0.999638675514418], ["Equalize", 0.14076197797220913, 0.2573030693317552]], [["ShearX", 0.668731433926434, 0.7564253049646743], ["Color", 0.63235486543845, 0.43954436063340785]], [["ShearX", 0.40511960873276237, 0.5710419512142979], ["Contrast", 0.9256769948746423, 0.7461350716211649]], [["Cutout", 0.9995917204023061, 0.22908419326246265], ["TranslateX", 0.5440902956629469, 0.9965570051216295]], [["Color", 0.22552987172228894, 0.4514558960849747], ["Sharpness", 0.638058150559443, 0.9987829481002615]], [["Contrast", 0.5362775837534763, 0.7052133185951871], ["ShearY", 0.220369845547023, 0.7593922994775721]], [["ShearX", 0.0317785822935219, 0.775536785253455], ["TranslateX", 0.7939510227015061, 0.5355620618496535]], [["Cutout", 0.46027969917602196, 0.31561199122527517], ["Color", 0.06154066467629451, 0.5384660000729091]], [["Sharpness", 0.7205483743301113, 0.552222392539886], ["Posterize", 0.5146496404711752, 0.9224333144307473]], [["ShearX", 0.00014547730356910538, 0.3553954298642108], ["TranslateY", 0.9625736029090676, 0.57403418640424]], [["Posterize", 0.9199917903297341, 0.6690259107633706], ["Posterize", 0.0932558110217602, 0.22279303372106138]], [["Invert", 0.25401453476874863, 0.3354329544078385], ["Posterize", 0.1832673201325652, 0.4304718799821412]], [["TranslateY", 0.02084122674367607, 0.12826181437197323], ["ShearY", 0.655862534043703, 0.3838330909470975]], [["Contrast", 0.35231797644104523, 0.3379356652070079], ["Cutout", 0.19685599014304822, 0.1254328595280942]], [["Sharpness", 0.18795594984191433, 0.09488678946484895], ["ShearX", 0.33332876790679306, 0.633523782574133]], [["Cutout", 0.28267175940290246, 0.7901991550267817], ["Contrast", 0.021200195312951198, 0.4733128702798515]], [["ShearX", 0.966231043411256, 0.7700673327786812], ["TranslateX", 0.7102390777763321, 0.12161245817120675]], [["Cutout", 0.5183324259533826, 0.30766086003013055], ["Color", 0.48399078150128927, 0.4967477809069189]], [["Sharpness", 0.8160855187385873, 0.47937658961644], ["Posterize", 0.46360395447862535, 0.7685454058155061]], [["ShearX", 0.10173571421694395, 0.3987290690178754], ["TranslateY", 0.8939980277379345, 0.5669994143735713]], [["Posterize", 0.6768089584801844, 0.7113149244621721], ["Posterize", 0.054896856043358935, 0.3660837250743921]], [["AutoContrast", 0.5915576211896306, 0.33607718177676493], ["Contrast", 0.3809408206617828, 0.5712201773913784]], [["AutoContrast", 0.012321347472748323, 0.06379072432796573], ["Rotate", 0.0017964439160045656, 0.7598026295973337]], [["Contrast", 0.6007100085192627, 0.36171972473370206], ["Invert", 0.09553573684975913, 0.12218510774295901]], [["AutoContrast", 0.32848604643836266, 0.2619457656206414], ["Invert", 0.27082113532501784, 0.9967965642293485]], [["AutoContrast", 0.6156282120903395, 0.9422706516080884], ["Sharpness", 0.4215509247379262, 0.4063347716503587]], [["Solarize", 0.25059210436331264, 0.7215305521159305], ["Invert", 0.1654465185253614, 0.9605851884186778]], [["AutoContrast", 0.4464438610980994, 0.685334175815482], ["Cutout", 0.24358625461158645, 0.4699066834058694]], [["Rotate", 0.5931657741857909, 0.6813978655574067], ["AutoContrast", 0.9259100547738681, 0.4903201223870492]], [["Color", 0.8203976071280751, 0.9777824466585101], ["Posterize", 0.4620669369254169, 0.2738895968716055]], [["Contrast", 0.13754352055786848, 0.3369433962088463], ["Posterize", 0.48371187792441916, 0.025718004361451302]], [["Rotate", 0.5208233630704999, 0.1760188899913535], ["TranslateX", 0.49753461392937226, 0.4142935276250922]], [["Cutout", 0.5967418240931212, 0.8028675552639539], ["Cutout", 0.20021854152659121, 0.19426330549590076]], [["ShearY", 0.549583567386676, 0.6601326640171705], ["Cutout", 0.6111813470383047, 0.4141935587984994]], [["Brightness", 0.6354891977535064, 0.31591459747846745], ["AutoContrast", 0.7853952208711621, 0.6555861906702081]], [["AutoContrast", 0.7333725370546154, 0.9919410576081586], ["Cutout", 0.9984177877923588, 0.2938253683694291]], [["Color", 0.33219296307742263, 0.6378995578424113], ["AutoContrast", 0.15432820754183288, 0.7897899838932103]], [["Contrast", 0.5905289460222578, 0.8158577207653422], ["Cutout", 0.3980284381203051, 0.43030531250317217]], [["TranslateX", 0.452093693346745, 0.5251475931559115], ["Rotate", 0.991422504871258, 0.4556503729269001]], [["Color", 0.04560406292983776, 0.061574671308480766], ["Brightness", 0.05161079440128734, 0.6718398142425688]], [["Contrast", 0.02913302416506853, 0.14402056093217708], ["Rotate", 0.7306930378774588, 0.47088249057922094]], [["Solarize", 0.3283072384190169, 0.82680847744367], ["Invert", 0.21632614168418854, 0.8792241691482687]], [["Equalize", 0.4860808352478527, 0.9440534949023064], ["Cutout", 0.31395897639184694, 0.41805859306017523]], [["Rotate", 0.2816043232522335, 0.5451282807926706], ["Color", 0.7388520447173302, 0.7706503658143311]], [["Color", 0.9342776719536201, 0.9039981381514299], ["Rotate", 0.6646389177840164, 0.5147917008383647]], [["Cutout", 0.08929430082050335, 0.22416445996932374], ["Posterize", 0.454485751267457, 0.500958345348237]], [["TranslateX", 0.14674201106374488, 0.7018633472428202], ["Sharpness", 0.6128796723832848, 0.743535235614809]], [["TranslateX", 0.5189900164469432, 0.6491132403587601], ["Contrast", 0.26309555778227806, 0.5976857969656114]], [["Solarize", 0.23569808291972655, 0.3315781686591778], ["ShearY", 0.07292078937544964, 0.7460326987587573]], [["ShearY", 0.7090542757477153, 0.5246437008439621], ["Sharpness", 0.9666919148538443, 0.4841687888767071]], [["Solarize", 0.3486952615189488, 0.7012877201721799], ["Invert", 0.1933387967311534, 0.9535472742828175]], [["AutoContrast", 0.5393460721514914, 0.6924005011697713], ["Cutout", 0.16988156769247176, 0.3667207571712882]], [["Rotate", 0.5815329514554719, 0.5390406879316949], ["AutoContrast", 0.7370538341589625, 0.7708822194197815]], [["Color", 0.8463701017918459, 0.9893491045831084], ["Invert", 0.06537367901579016, 0.5238468509941635]], [["Contrast", 0.8099771812443645, 0.39371603893945184], ["Posterize", 0.38273629875646487, 0.46493786058573966]], [["Color", 0.11164686537114032, 0.6771450570033168], ["Posterize", 0.27921361289661406, 0.7214300893597819]], [["Contrast", 0.5958265906571906, 0.5963959447666958], ["Sharpness", 0.2640889223630885, 0.3365870842641453]], [["Color", 0.255634146724125, 0.5610029792926452], ["ShearY", 0.7476893976084721, 0.36613194760395557]], [["ShearX", 0.2167581882130063, 0.022978065071245002], ["TranslateX", 0.1686864409720319, 0.4919575435512007]], [["Solarize", 0.10702753776284957, 0.3954707963684698], ["Contrast", 0.7256100635368403, 0.48845259655719686]], [["Sharpness", 0.6165615058519549, 0.2624079463213861], ["ShearX", 0.3804820351860919, 0.4738994677544202]], [["TranslateX", 0.18066394808448177, 0.8174509422318228], ["Solarize", 0.07964569396290502, 0.45495935736800974]], [["Sharpness", 0.2741884021129658, 0.9311045302358317], ["Cutout", 0.0009101326429323388, 0.5932102256756948]], [["Rotate", 0.8501796375826188, 0.5092564038282137], ["Brightness", 0.6520146983999912, 0.724091283316938]], [["Brightness", 0.10079744898900078, 0.7644088017429471], ["AutoContrast", 0.33540215138213575, 0.1487538541758792]], [["ShearY", 0.10632545944757177, 0.9565164562996977], ["Rotate", 0.275833816849538, 0.6200731548023757]], [["Color", 0.6749819274397422, 0.41042188598168844], ["AutoContrast", 0.22396590966461932, 0.5048018491863738]], [["Equalize", 0.5044277111650255, 0.2649182381110667], ["Brightness", 0.35715133289571355, 0.8653260893016869]], [["Cutout", 0.49083594426355326, 0.5602781291093129], ["Posterize", 0.721795488514384, 0.5525847430754974]], [["Sharpness", 0.5081835448947317, 0.7453323423804428], ["TranslateX", 0.11511932212234266, 0.4337766796030984]], [["Solarize", 0.3817050641766593, 0.6879004573473403], ["Invert", 0.0015041436267447528, 0.9793134066888262]], [["AutoContrast", 0.5107410439697935, 0.8276720355454423], ["Cutout", 0.2786270701864015, 0.43993387208414564]], [["Rotate", 0.6711202569428987, 0.6342930903972932], ["Posterize", 0.802820231163559, 0.42770002619222053]], [["Color", 0.9426854321337312, 0.9055431782458764], ["AutoContrast", 0.3556422423506799, 0.2773922428787449]], [["Contrast", 0.10318991257659992, 0.30841372533347416], ["Posterize", 0.4202264962677853, 0.05060395018085634]], [["Invert", 0.549305630337048, 0.886056156681853], ["Cutout", 0.9314157033373055, 0.3485836940307909]], [["ShearX", 0.5642891775895684, 0.16427372934801418], ["Invert", 0.228741164726475, 0.5066345406806475]], [["ShearY", 0.5813123201003086, 0.33474363490586106], ["Equalize", 0.11803439432255824, 0.8583936440614798]], [["Sharpness", 0.1642809706111211, 0.6958675237301609], ["ShearY", 0.5989560762277414, 0.6194018060415276]], [["Rotate", 0.05092104774529638, 0.9358045394527796], ["Cutout", 0.6443254331615441, 0.28548414658857657]], [["Brightness", 0.6986036769232594, 0.9618046340942727], ["Sharpness", 0.5564490243465492, 0.6295231286085622]], [["Brightness", 0.42725649792574105, 0.17628028916784244], ["Equalize", 0.4425109360966546, 0.6392872650036018]], [["ShearY", 0.5758622795525444, 0.8773349286588288], ["ShearX", 0.038525646435423666, 0.8755366512394268]], [["Sharpness", 0.3704459924265827, 0.9236361456197351], ["Color", 0.6379842432311235, 0.4548767717224531]], [["Contrast", 0.1619523824549347, 0.4506528800882731], ["AutoContrast", 0.34513874426188385, 0.3580290330996726]], [["Contrast", 0.728699731513527, 0.6932238009822878], ["Brightness", 0.8602917375630352, 0.5341445123280423]], [["Equalize", 0.3574552353044203, 0.16814745124536548], ["Rotate", 0.24191717169379262, 0.3279497108179034]], [["ShearY", 0.8567478695576244, 0.37746117240238164], ["ShearX", 0.9654125389830487, 0.9283047610798827]], [["ShearY", 0.4339052480582405, 0.5394548246617406], ["Cutout", 0.5070570647967001, 0.7846286976687882]], [["AutoContrast", 0.021620100406875065, 0.44425839772845227], ["AutoContrast", 0.33978157614075183, 0.47716564815092244]], [["Contrast", 0.9727600659025666, 0.6651758819229426], ["Brightness", 0.9893133904996626, 0.39176397622636105]], [["Equalize", 0.283428620586305, 0.18727922861893637], ["Rotate", 0.3556063466797136, 0.3722839913107821]], [["ShearY", 0.7276172841941864, 0.4834188516302227], ["ShearX", 0.010783217950465884, 0.9756458772142235]], [["ShearY", 0.2901753295101581, 0.5684700238749064], ["Cutout", 0.655585564610337, 0.9490071307790201]], [["AutoContrast", 0.008507193981450278, 0.4881150103902877], ["AutoContrast", 0.6561989723231185, 0.3715071329838596]], [["Contrast", 0.7702505530948414, 0.6961371266519999], ["Brightness", 0.9953051630261895, 0.3861962467326121]], [["Equalize", 0.2805270012472756, 0.17715406116880994], ["Rotate", 0.3111256593947474, 0.15824352183820073]], [["Brightness", 0.9888680802094193, 0.4856236485253163], ["ShearX", 0.022370252047332284, 0.9284975906226682]], [["ShearY", 0.4065719044318099, 0.7468528006921563], ["AutoContrast", 0.19494427109708126, 0.8613186475174786]], [["AutoContrast", 0.023296727279367765, 0.9170949567425306], ["AutoContrast", 0.11663051100921168, 0.7908646792175343]], [["AutoContrast", 0.7335191671571732, 0.4958357308292425], ["Color", 0.7964964008349845, 0.4977687544324929]], [["ShearX", 0.19905221600021472, 0.3033081933150046], ["Equalize", 0.9383410219319321, 0.3224669877230161]], [["ShearX", 0.8265450331466404, 0.6509091423603757], ["Sharpness", 0.7134181178748723, 0.6472835976443643]], [["ShearY", 0.46962439525486044, 0.223433110541722], ["Rotate", 0.7749806946212373, 0.5337060376916906]], [["Posterize", 0.1652499695106796, 0.04860659068586126], ["Brightness", 0.6644577712782511, 0.4144528269429337]], [["TranslateY", 0.6220449565731829, 0.4917495676722932], ["Posterize", 0.6255000355409635, 0.8374266890984867]], [["AutoContrast", 0.4887160797052227, 0.7106426020530529], ["Sharpness", 0.7684218571497236, 0.43678474722954763]], [["Invert", 0.13178101535845366, 0.8301141976359813], ["Color", 0.002820877424219378, 0.49444413062487075]], [["TranslateX", 0.9920683666478188, 0.5862245842588877], ["Posterize", 0.5536357075855376, 0.5454300367281468]], [["Brightness", 0.8150181219663427, 0.1411060258870707], ["Sharpness", 0.8548823004164599, 0.77008691072314]], [["Brightness", 0.9580478020413399, 0.7198667636628974], ["ShearY", 0.8431585033377366, 0.38750016565010803]], [["Solarize", 0.2331505347152334, 0.25754361489084787], ["TranslateY", 0.447431373734262, 0.5782399531772253]], [["TranslateY", 0.8904927998691309, 0.25872872455072315], ["AutoContrast", 0.7129888139716263, 0.7161603231650524]], [["ShearY", 0.6336216800247362, 0.5247508616674911], ["Cutout", 0.9167315119726633, 0.2060557387978919]], [["ShearX", 0.001661782345968199, 0.3682225725445044], ["Solarize", 0.12303352043754572, 0.5014989548584458]], [["Brightness", 0.9723625105116246, 0.6555444729681099], ["Contrast", 0.5539208721135375, 0.7819973409318487]], [["Equalize", 0.3262607499912611, 0.0006745572802121513], ["Contrast", 0.35341551623767103, 0.36814689398886347]], [["ShearY", 0.7478539900243613, 0.37322078030129185], ["TranslateX", 0.41558847793529247, 0.7394615158544118]], [["Invert", 0.13735541232529067, 0.5536403864332143], ["Cutout", 0.5109718190377135, 0.0447509485253679]], [["AutoContrast", 0.09403602327274725, 0.5909250807862687], ["ShearY", 0.53234060616395, 0.5316981359469398]], [["ShearX", 0.5651922367876323, 0.6794110241313183], ["Posterize", 0.7431624856363638, 0.7896861463783287]], [["Brightness", 0.30949179379286806, 0.7650569096019195], ["Sharpness", 0.5461629122105034, 0.6814369444005866]], [["Sharpness", 0.28459340191768434, 0.7802208350806028], ["Rotate", 0.15097973114238117, 0.5259683294104645]], [["ShearX", 0.6430803693700531, 0.9333735880102375], ["Contrast", 0.7522209520030653, 0.18831747966185058]], [["Contrast", 0.4219455937915647, 0.29949769435499646], ["Color", 0.6925322933509542, 0.8095523885795443]], [["ShearX", 0.23553236193043048, 0.17966207900468323], ["AutoContrast", 0.9039700567886262, 0.21983629944639108]], [["ShearX", 0.19256223146671514, 0.31200739880443584], ["Sharpness", 0.31962196883294713, 0.6828107668550425]], [["Cutout", 0.5947690279080912, 0.21728220253899178], ["Rotate", 0.6757188879871141, 0.489460599679474]], [["ShearY", 0.18365897125470526, 0.3988571115918058], ["Brightness", 0.7727489489504, 0.4790369956329955]], [["Contrast", 0.7090301084131432, 0.5178303607560537], ["ShearX", 0.16749258277688506, 0.33061773301592356]], [["ShearX", 0.3706690885419934, 0.38510677124319415], ["AutoContrast", 0.8288356276501032, 0.16556487668770264]], [["TranslateY", 0.16758043046445614, 0.30127092823893986], ["Brightness", 0.5194636577132354, 0.6225165310621702]], [["Cutout", 0.6087289363049726, 0.10439287037803044], ["Rotate", 0.7503452083033819, 0.7425316019981433]], [["ShearY", 0.24347189588329932, 0.5554979486672325], ["Brightness", 0.9468115239174161, 0.6132449358023568]], [["Brightness", 0.7144508395807994, 0.4610594769966929], ["ShearX", 0.16466683833092968, 0.3382903812375781]], [["Sharpness", 0.27743648684265465, 0.17200038071656915], ["Color", 0.47404262107546236, 0.7868991675614725]], [["Sharpness", 0.8603993513633618, 0.324604728411791], ["TranslateX", 0.3331597130403763, 0.9369586812977804]], [["Color", 0.1535813630595832, 0.4700116846558207], ["Color", 0.5435647971896318, 0.7639291483525243]], [["Brightness", 0.21486188101947656, 0.039347277341450576], ["Cutout", 0.7069526940684954, 0.39273934115015696]], [["ShearY", 0.7267130888840517, 0.6310800726389485], ["AutoContrast", 0.662163190824139, 0.31948540372237766]], [["ShearX", 0.5123132117185981, 0.1981015909438834], ["AutoContrast", 0.9009347363863067, 0.26790399126924036]], [["Brightness", 0.24245061453231648, 0.2673478678291436], ["ShearX", 0.31707976089283946, 0.6800582845544948]], [["Cutout", 0.9257780138367764, 0.03972673526848819], ["Rotate", 0.6807858944518548, 0.46974332280612097]], [["ShearY", 0.1543443071262312, 0.6051682587030671], ["Brightness", 0.9758203119828304, 0.4941406868162414]], [["Contrast", 0.07578049236491124, 0.38953819133407647], ["ShearX", 0.20194918288164293, 0.4141510791947318]], [["Color", 0.27826402243792286, 0.43517491081531157], ["AutoContrast", 0.6159269026143263, 0.2021846783488046]], [["AutoContrast", 0.5039377966534692, 0.19241507605941105], ["Invert", 0.5563931144385394, 0.7069728937319112]], [["Sharpness", 0.19031632433810566, 0.26310171056096743], ["Color", 0.4724537593175573, 0.6715201448387876]], [["ShearY", 0.2280910467786642, 0.33340559088059313], ["ShearY", 0.8858560034869303, 0.2598627441471076]], [["ShearY", 0.07291814128021593, 0.5819462692986321], ["Cutout", 0.27605696060512147, 0.9693427371868695]], [["Posterize", 0.4249871586563321, 0.8256952014328607], ["Posterize", 0.005907466926447169, 0.8081353382152597]], [["Brightness", 0.9071305290601128, 0.4781196213717954], ["Posterize", 0.8996214311439275, 0.5540717376630279]], [["Brightness", 0.06560728936236392, 0.9920627849065685], ["TranslateX", 0.04530789794044952, 0.5318568944702607]], [["TranslateX", 0.6800263601084814, 0.4611536772507228], ["Rotate", 0.7245888375283157, 0.0914772551375381]], [["Sharpness", 0.879556061897963, 0.42272481462067535], ["TranslateX", 0.4600350422524085, 0.5742175429334919]], [["AutoContrast", 0.5005776243176145, 0.22597121331684505], ["Invert", 0.10763286370369299, 0.6841782704962373]], [["Sharpness", 0.7422908472000116, 0.6850324203882405], ["TranslateX", 0.3832914614128403, 0.34798646673324896]], [["ShearY", 0.31939465302679326, 0.8792088167639516], ["Brightness", 0.4093604352811235, 0.21055483197261338]], [["AutoContrast", 0.7447595860998638, 0.19280222555998586], ["TranslateY", 0.317754779431227, 0.9983454520593591]], [["Equalize", 0.27706973689750847, 0.6447455020660622], ["Contrast", 0.5626579126863761, 0.7920049962776781]], [["Rotate", 0.13064369451773816, 0.1495367590684905], ["Sharpness", 0.24893941981801215, 0.6295943894521504]], [["ShearX", 0.6856269993063254, 0.5167938584189854], ["Sharpness", 0.24835352574609537, 0.9990550493102627]], [["AutoContrast", 0.461654115871693, 0.43097388896245004], ["Cutout", 0.366359682416437, 0.08011826474215511]], [["AutoContrast", 0.993892672935951, 0.2403608711236933], ["ShearX", 0.6620817870694181, 0.1744814077869482]], [["ShearY", 0.6396747719986443, 0.15031017143644265], ["Brightness", 0.9451954879495629, 0.26490678840264714]], [["Color", 0.19311480787397262, 0.15712300697448575], ["Posterize", 0.05391448762015258, 0.6943963643155474]], [["Sharpness", 0.6199669674684085, 0.5412492335319072], ["Invert", 0.14086213450149815, 0.2611850277919339]], [["Posterize", 0.5533129268803405, 0.5332478159319912], ["ShearX", 0.48956244029096635, 0.09223930853562916]], [["ShearY", 0.05871590849449765, 0.19549715278943228], ["TranslateY", 0.7208521362741379, 0.36414003004659434]], [["ShearY", 0.7316263417917531, 0.0629747985768501], ["Contrast", 0.036359793501448245, 0.48658745414898386]], [["Rotate", 0.3301497610942963, 0.5686622043085637], ["ShearX", 0.40581487555676843, 0.5866127743850192]], [["ShearX", 0.6679039628249283, 0.5292270693200821], ["Sharpness", 0.25901391739310703, 0.9778360586541461]], [["AutoContrast", 0.27373222012596854, 0.14456771405730712], ["Contrast", 0.3877220783523938, 0.7965158941894336]], [["Solarize", 0.29440905483979096, 0.06071633809388455], ["Equalize", 0.5246736285116214, 0.37575084834661976]], [["TranslateY", 0.2191269464520395, 0.7444942293988484], ["Posterize", 0.3840878524812771, 0.31812671711741247]], [["Solarize", 0.25159267140731356, 0.5833264622559661], ["Brightness", 0.07552262572348738, 0.33210648549288435]], [["AutoContrast", 0.9770099298399954, 0.46421915310428197], ["AutoContrast", 0.04707358934642503, 0.24922048012183493]], [["Cutout", 0.5379685806621965, 0.02038212605928355], ["Brightness", 0.5900728303717965, 0.28807872931416956]], [["Sharpness", 0.11596624872886108, 0.6086947716949325], ["AutoContrast", 0.34876470059667525, 0.22707897759730578]], [["Contrast", 0.276545513135698, 0.8822580384226156], ["Rotate", 0.04874027684061846, 0.6722214281612163]], [["ShearY", 0.595839851757025, 0.4389866852785822], ["Equalize", 0.5225492356128832, 0.2735290854063459]], [["Sharpness", 0.9918029636732927, 0.9919926583216121], ["Sharpness", 0.03672376137997366, 0.5563865980047012]], [["AutoContrast", 0.34169589759999847, 0.16419911552645738], ["Invert", 0.32995953043129234, 0.15073174739720568]], [["Posterize", 0.04600255098477292, 0.2632612790075844], ["TranslateY", 0.7852153329831825, 0.6990722310191976]], [["AutoContrast", 0.4414653815356372, 0.2657468780017082], ["Posterize", 0.30647061536763337, 0.3688222724948656]], [["Contrast", 0.4239361091421837, 0.6076562806342001], ["Cutout", 0.5780707784165284, 0.05361325256745192]], [["Sharpness", 0.7657895907855394, 0.9842407321667671], ["Sharpness", 0.5416352696151596, 0.6773681575200902]], [["AutoContrast", 0.13967381098331305, 0.10787258006315015], ["Posterize", 0.5019536507897069, 0.9881978222469807]], [["Brightness", 0.030528346448984903, 0.31562058762552847], ["TranslateY", 0.0843808140595676, 0.21019213305350526]], [["AutoContrast", 0.6934579165006736, 0.2530484168209199], ["Rotate", 0.0005751408130693636, 0.43790043943210005]], [["TranslateX", 0.611258547664328, 0.25465240215894935], ["Sharpness", 0.5001446909868196, 0.36102204109889413]], [["Contrast", 0.8995127327150193, 0.5493190695343996], ["Brightness", 0.242708780669213, 0.5461116653329015]], [["AutoContrast", 0.3751825351022747, 0.16845985803896962], ["Cutout", 0.25201103287363663, 0.0005893331783358435]], [["ShearX", 0.1518985779435941, 0.14768180777304504], ["Color", 0.85133530274324, 0.4006641163378305]], [["TranslateX", 0.5489668255504668, 0.4694591826554948], ["Rotate", 0.1917354490155893, 0.39993269385802177]], [["ShearY", 0.6689267479532809, 0.34304285013663577], ["Equalize", 0.24133154048883143, 0.279324043138247]], [["Contrast", 0.3412544002099494, 0.20217358823930232], ["Color", 0.8606984790510235, 0.14305503544676373]], [["Cutout", 0.21656155695311988, 0.5240101349572595], ["Brightness", 0.14109877717636352, 0.2016827341210295]], [["Sharpness", 0.24764371218833872, 0.19655480259925423], ["Posterize", 0.19460398862039913, 0.4975414350200679]], [["Brightness", 0.6071850094982323, 0.7270716448607151], ["Solarize", 0.111786402398499, 0.6325641684614275]], [["Contrast", 0.44772949532200856, 0.44267502710695955], ["AutoContrast", 0.360117506402693, 0.2623958228760273]], [["Sharpness", 0.8888131688583053, 0.936897400764746], ["Sharpness", 0.16080674198274894, 0.5681119841445879]], [["AutoContrast", 0.8004456226590612, 0.1788600469525269], ["Brightness", 0.24832285390647374, 0.02755350284841604]], [["ShearY", 0.06910320102646594, 0.26076407321544054], ["Contrast", 0.8633703022354964, 0.38968514704043056]], [["AutoContrast", 0.42306251382780613, 0.6883260271268138], ["Rotate", 0.3938724346852023, 0.16740881249086037]], [["Contrast", 0.2725343884286728, 0.6468194318074759], ["Sharpness", 0.32238942646494745, 0.6721149242783824]], [["AutoContrast", 0.942093919956842, 0.14675331481712853], ["Posterize", 0.5406276708262192, 0.683901182218153]], [["Cutout", 0.5386811894643584, 0.04498833938429728], ["Posterize", 0.17007257321724775, 0.45761177118620633]], [["Contrast", 0.13599408935104654, 0.53282738083886], ["Solarize", 0.26941667995081114, 0.20958261079465895]], [["Color", 0.6600788518606634, 0.9522228302165842], ["Invert", 0.0542722262516899, 0.5152431169321683]], [["Contrast", 0.5328934819727553, 0.2376220512388278], ["Posterize", 0.04890422575781711, 0.3182233123739474]], [["AutoContrast", 0.9289628064340965, 0.2976678437448435], ["Color", 0.20936893798507963, 0.9649612821434217]], [["Cutout", 0.9019423698575457, 0.24002036989728096], ["Brightness", 0.48734445615892974, 0.047660899809176316]], [["Sharpness", 0.09347824275711591, 0.01358686275590612], ["Posterize", 0.9248539660538934, 0.4064232632650468]], [["Brightness", 0.46575675383704634, 0.6280194775484345], ["Invert", 0.17276207634499413, 0.21263495428839635]], [["Brightness", 0.7238014711679732, 0.6178946027258592], ["Equalize", 0.3815496086340364, 0.07301281068847276]], [["Contrast", 0.754557393588416, 0.895332753570098], ["Color", 0.32709957750707447, 0.8425486003491515]], [["Rotate", 0.43406698081696576, 0.28628263254953723], ["TranslateY", 0.43949548709125374, 0.15927082198238685]], [["Brightness", 0.0015838339831640708, 0.09341692553352654], ["AutoContrast", 0.9113966907329718, 0.8345900469751112]], [["ShearY", 0.46698796308585017, 0.6150701348176804], ["Invert", 0.14894062704815722, 0.2778388046184728]], [["Color", 0.30360499169455957, 0.995713092016834], ["Contrast", 0.2597016288524961, 0.8654420870658932]], [["Brightness", 0.9661642031891435, 0.7322006407169436], ["TranslateY", 0.4393502786333408, 0.33934762664274265]], [["Color", 0.9323638351992302, 0.912776309755293], ["Brightness", 0.1618274755371618, 0.23485741708056307]], [["Color", 0.2216470771158821, 0.3359240197334976], ["Sharpness", 0.6328691811471494, 0.6298393874452548]], [["Solarize", 0.4772769142265505, 0.7073470698713035], ["ShearY", 0.2656114148206966, 0.31343097010487253]], [["Solarize", 0.3839017339304234, 0.5985505779429036], ["Equalize", 0.002412059429196589, 0.06637506181196245]], [["Contrast", 0.12751196553017863, 0.46980311434237976], ["Sharpness", 0.3467487455865491, 0.4054907610444406]], [["AutoContrast", 0.9321813669127206, 0.31328471589533274], ["Rotate", 0.05801738717432747, 0.36035756254444273]], [["TranslateX", 0.52092390458353, 0.5261722561643886], ["Contrast", 0.17836804476171306, 0.39354333443158535]], [["Posterize", 0.5458100909925713, 0.49447244994482603], ["Brightness", 0.7372536822363605, 0.5303409097463796]], [["Solarize", 0.1913974941725724, 0.5582966653986761], ["Equalize", 0.020733669175727026, 0.9377467166472878]], [["Equalize", 0.16265732137763889, 0.5206282340874929], ["Sharpness", 0.2421533133595281, 0.506389065871883]], [["AutoContrast", 0.9787324801448523, 0.24815051941486466], ["Rotate", 0.2423487151245957, 0.6456493129745148]], [["TranslateX", 0.6809867726670327, 0.6949687002397612], ["Contrast", 0.16125673359747458, 0.7582679978218987]], [["Posterize", 0.8212000950994955, 0.5225012157831872], ["Brightness", 0.8824891856626245, 0.4499216779709508]], [["Solarize", 0.12061313332505218, 0.5319371283368052], ["Equalize", 0.04120865969945108, 0.8179402157299602]], [["Rotate", 0.11278256686005855, 0.4022686554165438], ["ShearX", 0.2983451019112792, 0.42782525461812604]], [["ShearY", 0.8847385513289983, 0.5429227024179573], ["Rotate", 0.21316428726607445, 0.6712120087528564]], [["TranslateX", 0.46448081241068717, 0.4746090648963252], ["Brightness", 0.19973580961271142, 0.49252862676553605]], [["Posterize", 0.49664100539481526, 0.4460713166484651], ["Brightness", 0.6629559985581529, 0.35192346529003693]], [["Color", 0.22710733249173676, 0.37943185764616194], ["ShearX", 0.015809774971472595, 0.8472080190835669]], [["Contrast", 0.4187366322381491, 0.21621979869256666], ["AutoContrast", 0.7631045030367304, 0.44965231251615134]], [["Sharpness", 0.47240637876720515, 0.8080091811749525], ["Cutout", 0.2853425420104144, 0.6669811510150936]], [["Posterize", 0.7830320527127324, 0.2727062685529881], ["Solarize", 0.527834000867504, 0.20098218845222998]], [["Contrast", 0.366380535288225, 0.39766001659663075], ["Cutout", 0.8708808878088891, 0.20669525734273086]], [["ShearX", 0.6815427281122932, 0.6146858582671569], ["AutoContrast", 0.28330622372053493, 0.931352024154997]], [["AutoContrast", 0.8668174463154519, 0.39961453880632863], ["AutoContrast", 0.5718557712359253, 0.6337062930797239]], [["ShearY", 0.8923152519411871, 0.02480062504737446], ["Cutout", 0.14954159341231515, 0.1422219808492364]], [["Rotate", 0.3733718175355636, 0.3861928572224287], ["Sharpness", 0.5651126520194574, 0.6091103847442831]], [["Posterize", 0.8891714191922857, 0.29600154265251016], ["TranslateY", 0.7865351723963945, 0.5664998548985523]], [["TranslateX", 0.9298214806998273, 0.729856565052017], ["AutoContrast", 0.26349082482341846, 0.9638882609038888]], [["Sharpness", 0.8387378377527128, 0.42146721129032494], ["AutoContrast", 0.9860522000876452, 0.4200699464169384]], [["ShearY", 0.019609159303115145, 0.37197835936879514], ["Cutout", 0.22199340461754258, 0.015932573201085848]], [["Rotate", 0.43871085583928443, 0.3283504258860078], ["Sharpness", 0.6077702068037776, 0.6830305349618742]], [["Contrast", 0.6160211756538094, 0.32029451083389626], ["Cutout", 0.8037631428427006, 0.4025688837399259]], [["TranslateY", 0.051637820936985435, 0.6908417834391846], ["Sharpness", 0.7602756948473368, 0.4927111506643095]], [["Rotate", 0.4973618638052235, 0.45931479729281227], ["TranslateY", 0.04701789716427618, 0.9408779705948676]], [["Rotate", 0.5214194592768602, 0.8371249272013652], ["Solarize", 0.17734812472813338, 0.045020798970228315]], [["ShearX", 0.7457999920079351, 0.19025612553075893], ["Sharpness", 0.5994846101703786, 0.5665094068864229]], [["Contrast", 0.6172655452900769, 0.7811432139704904], ["Cutout", 0.09915620454670282, 0.3963692287596121]], [["TranslateX", 0.2650112299235817, 0.7377261946165307], ["AutoContrast", 0.5019539734059677, 0.26905046992024506]], [["Contrast", 0.6646299821370135, 0.41667784809592945], ["Cutout", 0.9698457154992128, 0.15429001887703997]], [["Sharpness", 0.9467079029475773, 0.44906457469098204], ["Cutout", 0.30036908747917396, 0.4766149689663106]], [["Equalize", 0.6667517691051055, 0.5014839828447363], ["Solarize", 0.4127890336820831, 0.9578274770236529]], [["Cutout", 0.6447384874120834, 0.2868806107728985], ["Cutout", 0.4800990488106021, 0.4757538246206956]], [["Solarize", 0.12560195032363236, 0.5557473475801568], ["Equalize", 0.019957161871490228, 0.5556797187823773]], [["Contrast", 0.12607637375759484, 0.4300633627435161], ["Sharpness", 0.3437273670109087, 0.40493203127714417]], [["AutoContrast", 0.884353334807183, 0.5880138314357569], ["Rotate", 0.9846032404597116, 0.3591877296622974]], [["TranslateX", 0.6862295865975581, 0.5307482119690076], ["Contrast", 0.19439251187251982, 0.3999195825722808]], [["Posterize", 0.4187641835025246, 0.5008988942651585], ["Brightness", 0.6665805605402482, 0.3853288204214253]], [["Posterize", 0.4507470690013903, 0.4232437206624681], ["TranslateX", 0.6054107416317659, 0.38123828040922203]], [["AutoContrast", 0.29562338573283276, 0.35608605102687474], ["TranslateX", 0.909954785390274, 0.20098894888066549]], [["Contrast", 0.6015278411777212, 0.6049140992035096], ["Cutout", 0.47178713636517855, 0.5333747244651914]], [["TranslateX", 0.490851976691112, 0.3829593925141144], ["Sharpness", 0.2716675173824095, 0.5131696240367152]], [["Posterize", 0.4190558294646337, 0.39316689077269873], ["Rotate", 0.5018526072725914, 0.295712490156129]], [["AutoContrast", 0.29624715560691617, 0.10937329832409388], ["Posterize", 0.8770505275992637, 0.43117765012206943]], [["Rotate", 0.6649970092751698, 0.47767131373391974], ["ShearX", 0.6257923540490786, 0.6643337040198358]], [["Sharpness", 0.5553620705849509, 0.8467799429696928], ["Cutout", 0.9006185811918932, 0.3537270716262]], [["ShearY", 0.0007619678283789788, 0.9494591850536303], ["Invert", 0.24267733654007673, 0.7851608409575828]], [["Contrast", 0.9730916198112872, 0.404670123321921], ["Sharpness", 0.5923587793251186, 0.7405792404430281]], [["Cutout", 0.07393909593373034, 0.44569630026328344], ["TranslateX", 0.2460593252211425, 0.4817527814541055]], [["Brightness", 0.31058654119340867, 0.7043749950260936], ["ShearX", 0.7632161538947713, 0.8043681264908555]], [["AutoContrast", 0.4352334371415373, 0.6377550087204297], ["Rotate", 0.2892714673415678, 0.49521052050510556]], [["Equalize", 0.509071051375276, 0.7352913414974414], ["ShearX", 0.5099959429711828, 0.7071566714593619]], [["Posterize", 0.9540506532512889, 0.8498853304461906], ["ShearY", 0.28199061357155397, 0.3161715627214629]], [["Posterize", 0.6740855359097433, 0.684004694936616], ["Posterize", 0.6816720350737863, 0.9654766942980918]], [["Solarize", 0.7149344531717328, 0.42212789795181643], ["Brightness", 0.686601460864528, 0.4263050070610551]], [["Cutout", 0.49577164991501, 0.08394890892056037], ["Rotate", 0.5810369852730606, 0.3320732965776973]], [["TranslateY", 0.1793755480490623, 0.6006520265468684], ["Brightness", 0.3769016576438939, 0.7190746300828186]], [["TranslateX", 0.7226363597757153, 0.3847027238123509], ["Brightness", 0.7641713191794035, 0.36234003077512544]], [["TranslateY", 0.1211227055347106, 0.6693523474608023], ["Brightness", 0.13011180247738063, 0.5126647617294864]], [["Equalize", 0.1501070550869129, 0.0038548909451806557], ["Posterize", 0.8266535939653881, 0.5502199643499207]], [["Sharpness", 0.550624117428359, 0.2023044586648523], ["Brightness", 0.06291556314780017, 0.7832635398703937]], [["Color", 0.3701578205508141, 0.9051537973590863], ["Contrast", 0.5763972727739397, 0.4905511239739898]], [["Rotate", 0.7678527224046323, 0.6723066265307555], ["Solarize", 0.31458533097383207, 0.38329324335154524]], [["Brightness", 0.292050127929522, 0.7047582807953063], ["ShearX", 0.040541891910333805, 0.06639328601282746]], [["TranslateY", 0.4293891393238555, 0.6608516902234284], ["Sharpness", 0.7794685477624004, 0.5168044063408147]], [["Color", 0.3682450402286552, 0.17274523597220048], ["ShearY", 0.3936056470397763, 0.5702597289866161]], [["Equalize", 0.43436990310624657, 0.9207072627823626], ["Contrast", 0.7608688260846083, 0.4759023148841439]], [["Brightness", 0.7926088966143935, 0.8270093925674497], ["ShearY", 0.4924174064969461, 0.47424347505831244]], [["Contrast", 0.043917555279430476, 0.15861903591675125], ["ShearX", 0.30439480405505853, 0.1682659341098064]], [["TranslateY", 0.5598255583454538, 0.721352536005039], ["Posterize", 0.9700921973303752, 0.6882015184440126]], [["AutoContrast", 0.3620887415037668, 0.5958176322317132], ["TranslateX", 0.14213781552733287, 0.6230799786459947]], [["Color", 0.490366889723972, 0.9863152892045195], ["Color", 0.817792262022319, 0.6755656429452775]], [["Brightness", 0.7030707021937771, 0.254633187122679], ["Color", 0.13977318232688843, 0.16378180123959793]], [["AutoContrast", 0.2933247831326118, 0.6283663376211102], ["Sharpness", 0.85430478154147, 0.9753613184208796]], [["Rotate", 0.6674299955457268, 0.48571208708018976], ["Contrast", 0.47491370175907016, 0.6401079552479657]], [["Sharpness", 0.37589579644127863, 0.8475131989077025], ["TranslateY", 0.9985149867598191, 0.057815729375099975]], [["Equalize", 0.0017194373841596389, 0.7888361311461602], ["Contrast", 0.6779293670669408, 0.796851411454113]], [["TranslateY", 0.3296782119072306, 0.39765117357271834], ["Sharpness", 0.5890554357001884, 0.6318339473765834]], [["Posterize", 0.25423810893163856, 0.5400430289894207], ["Sharpness", 0.9273643918988342, 0.6480913470982622]], [["Cutout", 0.850219975768305, 0.4169812455601289], ["Solarize", 0.5418755745870089, 0.5679666650495466]], [["Brightness", 0.008881361977310959, 0.9282562314720516], ["TranslateY", 0.7736066471553994, 0.20041167606029642]], [["Brightness", 0.05382537581401925, 0.6405265501035952], ["Contrast", 0.30484329473639593, 0.5449338155734242]], [["Color", 0.613257119787967, 0.4541503912724138], ["Brightness", 0.9061572524724674, 0.4030159294447347]], [["Brightness", 0.02739111568942537, 0.006028056532326534], ["ShearX", 0.17276751958646486, 0.05967365780621859]], [["TranslateY", 0.4376298213047888, 0.7691816164456199], ["Sharpness", 0.8162292718857824, 0.6054926462265117]], [["Color", 0.37963069679121214, 0.5946919433483344], ["Posterize", 0.08485417284005387, 0.5663580913231766]], [["Equalize", 0.49785780226818316, 0.9999137109183761], ["Sharpness", 0.7685879484682496, 0.6260846154212211]], [["AutoContrast", 0.4190931409670763, 0.2374852525139795], ["Posterize", 0.8797422264608563, 0.3184738541692057]], [["Rotate", 0.7307269024632872, 0.41523609600701106], ["ShearX", 0.6166685870692289, 0.647133807748274]], [["Sharpness", 0.5633713231039904, 0.8276694754755876], ["Cutout", 0.8329340776895764, 0.42656043027424073]], [["ShearY", 0.14934828370884312, 0.8622510773680372], ["Invert", 0.25925989086863277, 0.8813283584888576]], [["Contrast", 0.9457071292265932, 0.43228655518614034], ["Sharpness", 0.8485316947644338, 0.7590298998732413]], [["AutoContrast", 0.8386103589399184, 0.5859583131318076], ["Solarize", 0.466758711343543, 0.9956215363818983]], [["Rotate", 0.9387133710926467, 0.19180564509396503], ["Rotate", 0.5558247609706255, 0.04321698692007105]], [["ShearX", 0.3608716600695567, 0.15206159451532864], ["TranslateX", 0.47295292905710146, 0.5290760596129888]], [["TranslateX", 0.8357685981547495, 0.5991305115727084], ["Posterize", 0.5362929404188211, 0.34398525441943373]], [["ShearY", 0.6751984031632811, 0.6066293622133011], ["Contrast", 0.4122723990263818, 0.4062467515095566]], [["Color", 0.7515349936021702, 0.5122124665429213], ["Contrast", 0.03190514292904123, 0.22903520154660545]], [["Contrast", 0.5448962625054385, 0.38655673938910545], ["AutoContrast", 0.4867400684894492, 0.3433111101096984]], [["Rotate", 0.0008372434310827959, 0.28599951781141714], ["Equalize", 0.37113686925530087, 0.5243929348114981]], [["Color", 0.720054993488857, 0.2010177651701808], ["TranslateX", 0.23036196506059398, 0.11152764304368781]], [["Cutout", 0.859134208332423, 0.6727345740185254], ["ShearY", 0.02159833505865088, 0.46390076266538544]], [["Sharpness", 0.3428232157391428, 0.4067874527486514], ["Brightness", 0.5409415136577347, 0.3698432231874003]], [["Solarize", 0.27303978936454776, 0.9832186173589548], ["ShearY", 0.08831127213044043, 0.4681870331149774]], [["TranslateY", 0.2909309268736869, 0.4059460811623174], ["Sharpness", 0.6425125139803729, 0.20275737203293587]], [["Contrast", 0.32167626214661627, 0.28636162794046977], ["Invert", 0.4712405253509603, 0.7934644799163176]], [["Color", 0.867993060896951, 0.96574321666213], ["Color", 0.02233897320328512, 0.44478933557303063]], [["AutoContrast", 0.1841254751814967, 0.2779992148017741], ["Color", 0.3586283093530607, 0.3696246850445087]], [["Posterize", 0.2052935984046965, 0.16796913860308244], ["ShearX", 0.4807226832843722, 0.11296747254563266]], [["Cutout", 0.2016411266364791, 0.2765295444084803], ["Brightness", 0.3054112810424313, 0.695924264931216]], [["Rotate", 0.8405872184910479, 0.5434142541450815], ["Cutout", 0.4493615138203356, 0.893453735250007]], [["Contrast", 0.8433310507685494, 0.4915423577963278], ["ShearX", 0.22567799557913246, 0.20129892537008834]], [["Contrast", 0.045954277103674224, 0.5043900167190442], ["Cutout", 0.5552992473054611, 0.14436447810888237]], [["AutoContrast", 0.7719296115130478, 0.4440417544621306], ["Sharpness", 0.13992809206158283, 0.7988278670709781]], [["Color", 0.7838574233513952, 0.5971351401625151], ["TranslateY", 0.13562290583925385, 0.2253039635819158]], [["Cutout", 0.24870301109385806, 0.6937886690381568], ["TranslateY", 0.4033400068952813, 0.06253378991880915]], [["TranslateX", 0.0036059390486775644, 0.5234723884081843], ["Solarize", 0.42724862530733526, 0.8697702564187633]], [["Equalize", 0.5446026737834311, 0.9367992979112202], ["ShearY", 0.5943478903735789, 0.42345889214100046]], [["ShearX", 0.18611885697957506, 0.7320849092947314], ["ShearX", 0.3796416430900566, 0.03817761920009881]], [["Posterize", 0.37636778506979124, 0.26807924785236537], ["Brightness", 0.4317372554383255, 0.5473346211870932]], [["Brightness", 0.8100436240916665, 0.3817612088285007], ["Brightness", 0.4193974619003253, 0.9685902764026623]], [["Contrast", 0.701776402197012, 0.6612786008858009], ["Color", 0.19882787177960912, 0.17275597188875483]], [["Color", 0.9538303302832989, 0.48362384535228686], ["ShearY", 0.2179980837345602, 0.37027290936457313]], [["TranslateY", 0.6068028691503798, 0.3919346523454841], ["Cutout", 0.8228303342563138, 0.18372280287814613]], [["Equalize", 0.016416758802906828, 0.642838949194916], ["Cutout", 0.5761717838655257, 0.7600661153497648]], [["Color", 0.9417761826818639, 0.9916074035986558], ["Equalize", 0.2524209308597042, 0.6373703468715077]], [["Brightness", 0.75512589439513, 0.6155072321007569], ["Contrast", 0.32413476940254515, 0.4194739830159837]], [["Sharpness", 0.3339450765586968, 0.9973297539194967], ["AutoContrast", 0.6523930242124429, 0.1053482471037186]], [["ShearX", 0.2961391955838801, 0.9870036064904368], ["ShearY", 0.18705025965909403, 0.4550895821154484]], [["TranslateY", 0.36956447983807883, 0.36371471767143543], ["Sharpness", 0.6860051967688487, 0.2850190720087796]], [["Cutout", 0.13017742151902967, 0.47316674150067195], ["Invert", 0.28923829959551883, 0.9295585654924601]], [["Contrast", 0.7302368472279086, 0.7178974949876642], ["TranslateY", 0.12589674152030433, 0.7485392909494947]], [["Color", 0.6474693117772619, 0.5518269515590674], ["Contrast", 0.24643004970708016, 0.3435581358079418]], [["Contrast", 0.5650327855750835, 0.4843031798040887], ["Brightness", 0.3526684005761239, 0.3005305004600969]], [["Rotate", 0.09822284968122225, 0.13172798244520356], ["Equalize", 0.38135066977857157, 0.5135129123554154]], [["Contrast", 0.5902590645585712, 0.2196062383730596], ["ShearY", 0.14188379126120954, 0.1582612142182743]], [["Cutout", 0.8529913814417812, 0.89734031211874], ["Color", 0.07293767043078672, 0.32577659205278897]], [["Equalize", 0.21401668971453247, 0.040015259500028266], ["ShearY", 0.5126400895338797, 0.4726484828276388]], [["Brightness", 0.8269430025954498, 0.9678362841865166], ["ShearY", 0.17142069814830432, 0.4726727848289514]], [["Brightness", 0.699707089334018, 0.2795501395789335], ["ShearX", 0.5308818178242845, 0.10581814221896294]], [["Equalize", 0.32519644258946145, 0.15763390340309183], ["TranslateX", 0.6149090364414208, 0.7454832565718259]], [["AutoContrast", 0.5404508567155423, 0.7472387762067986], ["Equalize", 0.05649876539221024, 0.5628180219887216]]] return p def fa_reduced_svhn(): p = [[["TranslateX", 0.001576965129744562, 0.43180488809874773], ["Invert", 0.7395307279252639, 0.7538444307982558]], [["Contrast", 0.5762062225409211, 0.7532431872873473], ["TranslateX", 0.45212523461624615, 0.02451684483019846]], [["Contrast", 0.18962433143225088, 0.29481185671147325], ["Contrast", 0.9998112218299271, 0.813015355163255]], [["Posterize", 0.9633391295905683, 0.4136786222304747], ["TranslateY", 0.8011655496664203, 0.44102126789970797]], [["Color", 0.8231185187716968, 0.4171602946893402], ["TranslateX", 0.8684965619113907, 0.36514568324909674]], [["Color", 0.904075230324581, 0.46319140331093767], ["Contrast", 0.4115196534764559, 0.7773329158740563]], [["Sharpness", 0.6600262774093967, 0.8045637700026345], ["TranslateY", 0.5917663766021198, 0.6844241908520602]], [["AutoContrast", 0.16223989311434306, 0.48169653554195924], ["ShearX", 0.5433173232860344, 0.7460278151912152]], [["ShearX", 0.4913604762760715, 0.83391837859561], ["Color", 0.5580367056511908, 0.2961512691312932]], [["Color", 0.18567091721211237, 0.9296983204905286], ["Cutout", 0.6074026199060156, 0.03303273406448193]], [["Invert", 0.8049054771963224, 0.1340792344927909], ["Color", 0.4208839940504979, 0.7096454840962345]], [["ShearX", 0.7997786664546294, 0.6492629575700173], ["AutoContrast", 0.3142777134084793, 0.6526010594925064]], [["TranslateX", 0.2581027144644976, 0.6997433332894101], ["Rotate", 0.45490480973606834, 0.238620570022944]], [["Solarize", 0.837397161027719, 0.9311141273136286], ["Contrast", 0.640364826293148, 0.6299761518677469]], [["Brightness", 0.3782457347141744, 0.7085036717054278], ["Brightness", 0.5346150083208507, 0.5858930737867671]], [["Invert", 0.48780391510474086, 0.610086407879722], ["Color", 0.5601999247616932, 0.5393836220423195]], [["Brightness", 0.00250086643283564, 0.5003355864896979], ["Brightness", 0.003922153283353616, 0.41107110154584925]], [["TranslateX", 0.4073069009685957, 0.9843435292693372], ["Invert", 0.38837085318721926, 0.9298542033875989]], [["ShearY", 0.05479740443795811, 0.9113983424872698], ["AutoContrast", 0.2181108114232728, 0.713996037012164]], [["Brightness", 0.27747508429413903, 0.3217467607288693], ["ShearX", 0.02715239061946995, 0.5430731635396449]], [["Sharpness", 0.08994432959374538, 0.004706443546453831], ["Posterize", 0.10768206853226996, 0.39020299239900236]], [["Cutout", 0.37498679037853905, 0.20784809761469553], ["Color", 0.9825516352194511, 0.7654155662756019]], [["Color", 0.8899349124453552, 0.7797700766409008], ["Rotate", 0.1370222187174981, 0.2622119295138398]], [["Cutout", 0.7088223332663685, 0.7884456023190028], ["Solarize", 0.5362257505160836, 0.6426837537811545]], [["Invert", 0.15686225694987552, 0.5500563899117913], ["Rotate", 0.16315224193260078, 0.4246854030170752]], [["Rotate", 0.005266247922433631, 0.06612026206223394], ["Contrast", 0.06494357829209037, 0.2738420319474947]], [["Cutout", 0.30200619566806275, 0.06558008068236942], ["Rotate", 0.2168576483823022, 0.878645566986328]], [["Color", 0.6358930679444622, 0.613404714161498], ["Rotate", 0.08733206733004326, 0.4348276574435751]], [["Cutout", 0.8834634887239585, 0.0006853845293474659], ["Solarize", 0.38132051231951847, 0.42558752668491195]], [["ShearY", 0.08830136548479937, 0.5522438878371283], ["Brightness", 0.23816560427834074, 0.3033709051157141]], [["Solarize", 0.9015331490756151, 0.9108788708847556], ["Contrast", 0.2057898014670072, 0.03260096030427456]], [["Equalize", 0.9455978685121174, 0.14850077333434056], ["TranslateY", 0.6888705996522545, 0.5300565492007543]], [["Cutout", 0.16942673959343585, 0.7294197201361826], ["TranslateX", 0.41184830642301534, 0.7060207449376135]], [["Color", 0.30133344118702166, 0.24384417956342314], ["Sharpness", 0.4640904544421743, 0.32431840288061864]], [["Sharpness", 0.5195055033472676, 0.9386677467005835], ["Color", 0.9536519432978372, 0.9624043444556467]], [["Rotate", 0.8689597230556101, 0.23955490826730633], ["Contrast", 0.050071600927462656, 0.1309891556004179]], [["Cutout", 0.5349421090878962, 0.08239510727779054], ["Rotate", 0.46064964710717216, 0.9037689320897339]], [["AutoContrast", 0.5625256909986802, 0.5358003783186498], ["Equalize", 0.09204330691163354, 0.4386906784850649]], [["ShearX", 0.0011061172864470226, 0.07150284682189278], ["AutoContrast", 0.6015956946553209, 0.4375362295530898]], [["ShearY", 0.25294276499800983, 0.7937560397859562], ["Brightness", 0.30834103299704474, 0.21960258701547009]], [["Posterize", 0.7423948904688074, 0.4598609935109695], ["Rotate", 0.5510348811675979, 0.26763724868985933]], [["TranslateY", 0.3208729319318745, 0.945513054853888], ["ShearX", 0.4916473963030882, 0.8743840560039451]], [["ShearY", 0.7557718687011286, 0.3125397104722828], ["Cutout", 0.5565359791865849, 0.5151359251135629]], [["AutoContrast", 0.16652786355571275, 0.1101575800958632], ["Rotate", 0.05108851703032641, 0.2612966401802814]], [["Brightness", 0.380296489835016, 0.0428162454174662], ["ShearX", 0.3911934083168285, 0.18933607362790178]], [["Color", 0.002476250465397678, 0.07795275305347571], ["Posterize", 0.08131841266654188, 0.14843363184306413]], [["Cutout", 0.36664558716104434, 0.20904484995063996], ["Cutout", 0.07986452057223141, 0.9287747671053432]], [["Color", 0.9296812469919231, 0.6634239915141935], ["Rotate", 0.07632463573240006, 0.408624029443747]], [["Cutout", 0.7594470171961278, 0.9834672124229463], ["Solarize", 0.4471371303745053, 0.5751101102286562]], [["Posterize", 0.051186719734032285, 0.5110941294710823], ["Sharpness", 0.040432522797391596, 0.42652298706992164]], [["Sharpness", 0.2645335264327221, 0.8844553189835457], ["Brightness", 0.7229600357932696, 0.16660749270785696]], [["Sharpness", 0.6296376086802589, 0.15564989758083458], ["Sharpness", 0.7913410481400365, 0.7022615408082826]], [["Cutout", 0.5517247347343883, 0.43794888517764674], ["ShearX", 0.6951051782530201, 0.6230992857867065]], [["ShearX", 0.9015708556331022, 0.6322135168527783], ["Contrast", 0.4285629283441831, 0.18158321019502988]], [["Brightness", 0.9014292329524769, 0.3660463325457713], ["Invert", 0.6700729097206592, 0.16502732071917703]], [["AutoContrast", 0.6432764477303431, 0.9998909112400834], ["Invert", 0.8124063975545761, 0.8149683327882365]], [["Cutout", 0.6023944009428617, 0.9630976951918225], ["ShearX", 0.2734723568803071, 0.3080911542121765]], [["Sharpness", 0.048949115014412806, 0.44497866256845164], ["Brightness", 0.5611832867244329, 0.12994217480426257]], [["TranslateY", 0.4619112333002525, 0.47317728091588396], ["Solarize", 0.618638784910472, 0.9508297099190338]], [["Sharpness", 0.9656274391147018, 0.3402622993963962], ["Cutout", 0.8452511174508919, 0.3094717093312621]], [["ShearX", 0.04942201651478659, 0.6910568465705691], ["AutoContrast", 0.7155342517619936, 0.8565418847743523]], [["Brightness", 0.5222290590721783, 0.6462675303633422], ["Sharpness", 0.7756317511341633, 0.05010730683866704]], [["Contrast", 0.17098396012942796, 0.9128908626236187], ["TranslateY", 0.1523815376677518, 0.4269909829886339]], [["Cutout", 0.7679024720089866, 0.22229116396644455], ["Sharpness", 0.47714827844878843, 0.8242815864830401]], [["Brightness", 0.9321772357292445, 0.11339758604001371], ["Invert", 0.7021078495093375, 0.27507749184928154]], [["ShearY", 0.7069449324510433, 0.07262757954730437], ["Cutout", 0.6298690227159313, 0.8866813664859028]], [["ShearX", 0.8153137620199989, 0.8478194179953927], ["ShearX", 0.7519451353411938, 0.3914579556959725]], [["Cutout", 0.07152574469472753, 0.2629935229222503], ["TranslateX", 0.43728405510089485, 0.2610201002449789]], [["AutoContrast", 0.5824529633013098, 0.5619551536261955], ["Rotate", 0.45434137552116965, 0.7567169855140041]], [["TranslateY", 0.9338431187142137, 0.14230481341042783], ["Cutout", 0.744797723251028, 0.4346601666787713]], [["ShearX", 0.3197252560289169, 0.8770408070016171], ["Color", 0.7657013088540465, 0.2685586719812284]], [["ShearY", 0.6542181749801549, 0.8148188744344297], ["Sharpness", 0.5108985661436543, 0.9926016115463769]], [["ShearY", 0.39218730620135694, 0.857769946478945], ["Color", 0.39588355914920886, 0.9910530523789284]], [["Invert", 0.4993610396803735, 0.08449723470758526], ["TranslateX", 0.46267456928508305, 0.46691125646493964]], [["Equalize", 0.8640576819821256, 0.3973808869887604], ["ShearY", 0.5491163877063172, 0.422429328786161]], [["Contrast", 0.6146206387722841, 0.8453559854684094], ["TranslateX", 0.7974333014574718, 0.47395476786951773]], [["Contrast", 0.6828704722015236, 0.6952755697785722], ["Brightness", 0.7903069452567497, 0.8350915035109574]], [["Rotate", 0.1211091761531299, 0.9667702562228727], ["Color", 0.47888534537103344, 0.8298620028065332]], [["Equalize", 0.20009722872711086, 0.21851235854853018], ["Invert", 0.4433641154198673, 0.41902203581091935]], [["AutoContrast", 0.6333190204577053, 0.23965630032835372], ["Color", 0.38651217030044804, 0.06447323778198723]], [["Brightness", 0.378274337541471, 0.5482593116308322], ["Cutout", 0.4856574442608347, 0.8889688535495244]], [["Rotate", 0.8201259323479384, 0.7404525573938633], ["Color", 0.28371236449364595, 0.7866003515933161]], [["Brightness", 0.10053196350009105, 0.18814037089411267], ["Sharpness", 0.5572102497672569, 0.04458217557977126]], [["AutoContrast", 0.6445330112376135, 0.48082049184921843], ["TranslateY", 0.378898917914949, 0.9338102625289362]], [["AutoContrast", 0.08482623401924708, 0.25199930695784384], ["Solarize", 0.5981823550521426, 0.19626357596662092]], [["Solarize", 0.4373030803918095, 0.22907881245285625], ["AutoContrast", 0.6383084635487905, 0.29517603235993883]], [["AutoContrast", 0.922112624726991, 0.29398098144910145], ["AutoContrast", 0.8550184811514672, 0.8030331582292343]], [["ShearX", 0.38761582800913896, 0.06304125015084923], ["Contrast", 0.3225758804984975, 0.7089696696094797]], [["TranslateY", 0.27499498563849206, 0.1917583097241206], ["Color", 0.5845853711746438, 0.5353520071667661]], [["ShearY", 0.530881951424285, 0.47961248148116453], ["ShearX", 0.04666387744533289, 0.275772822690165]], [["Solarize", 0.5727309318844802, 0.02889734544563341], ["AutoContrast", 0.638852434854615, 0.9819440776921611]], [["AutoContrast", 0.9766868312173507, 0.9651796447738792], ["AutoContrast", 0.3489760216898085, 0.3082182741354106]], [["Sharpness", 0.13693510871346704, 0.08297205456926067], ["Contrast", 0.3155812019005854, 0.031402991638917896]], [["TranslateY", 0.2664707540547008, 0.4838091910041236], ["ShearX", 0.5935665395229432, 0.7813088248538167]], [["ShearY", 0.7578577752251343, 0.5116014090216161], ["ShearX", 0.8332831240873545, 0.26781876290841017]], [["TranslateY", 0.473254381651761, 0.4203181582821155], ["ShearY", 0.732848696900726, 0.47895514793728433]], [["Solarize", 0.6922689176672292, 0.36403255869823725], ["AutoContrast", 0.910654040826914, 0.888651414068326]], [["ShearX", 0.37326536936166244, 0.47830923320699525], ["Equalize", 0.4724702976076929, 0.8176108279939023]], [["Contrast", 0.3839906424759326, 0.09109695563933692], ["Invert", 0.36305435543972325, 0.5701589223795499]], [["Invert", 0.5175591137387999, 0.38815675919253867], ["TranslateY", 0.1354848160153554, 0.41734106283245065]], [["Color", 0.829616006981199, 0.18631472346156963], ["Color", 0.2465115448326214, 0.9439365672808333]], [["Contrast", 0.18207939197942158, 0.39841173152850873], ["ShearX", 0.16723588254695632, 0.2868649619006758]], [["Posterize", 0.1941909136988733, 0.6322499882557473], ["Contrast", 0.6109060391509794, 0.27329598688783296]], [["AutoContrast", 0.9148775146158022, 0.09129288311923844], ["Sharpness", 0.4222442287436423, 0.847961820057229]], [["Color", 0.21084007475489852, 0.008218056412554131], ["Contrast", 0.43996934555301637, 0.500680146508504]], [["ShearY", 0.6745287915240038, 0.6120305524405164], ["Equalize", 0.467403794543269, 0.2207148995882467]], [["Color", 0.7712823974371379, 0.2839161885566902], ["Color", 0.8725368489709752, 0.3349470222415115]], [["Solarize", 0.5563976601161562, 0.540446614847802], ["Invert", 0.14228071175107454, 0.2242332811481905]], [["Contrast", 0.34596757983998383, 0.9158971503395041], ["Cutout", 0.6823724203724072, 0.5221518922863516]], [["Posterize", 0.3275475232882672, 0.6520033254468702], ["Color", 0.7434224109271398, 0.0824308188060544]], [["Cutout", 0.7295122229650082, 0.277887573018184], ["Brightness", 0.5303655506515258, 0.28628046739964497]], [["Color", 0.8533293996815943, 0.24909788223027743], ["Color", 0.6915962825167857, 0.33592561040195834]], [["TranslateX", 0.0761441550001345, 0.7043906245420134], ["Equalize", 0.670845297717783, 0.30986063097084215]], [["Contrast", 0.30592723366237995, 0.7365013059287382], ["Color", 0.6173835128817455, 0.6417028717640598]], [["Rotate", 0.05558240682703821, 0.7284722849011761], ["Color", 0.7814801133853666, 0.13335113981884217]], [["ShearY", 0.6521743070190724, 0.6272195913574455], ["Rotate", 0.36278432239870423, 0.2335623679787695]], [["Color", 0.6799351102482663, 0.3850250771244986], ["Brightness", 0.613901077818094, 0.2374900558949702]], [["Color", 0.551451255148252, 0.7284757153447965], ["Solarize", 0.4863815212982878, 0.3857941567681324]], [["Contrast", 0.32516343965159267, 0.689921852601276], ["Cutout", 0.5922142001124506, 0.7709605594115009]], [["Brightness", 0.23760063764495856, 0.6392077018854179], ["Brightness", 0.7288124083714078, 0.4487520490201095]], [["Sharpness", 0.5631112298553713, 0.6803534985114782], ["ShearX", 0.6743791169050775, 0.34039227245151127]], [["AutoContrast", 0.8260911840078349, 0.7705607269534767], ["Rotate", 0.8880749478363638, 0.8182460047684648]], [["ShearY", 0.7037620764408412, 0.5219573160970589], ["Posterize", 0.7186150466761102, 0.6187857686944253]], [["TranslateY", 0.2140494926702246, 0.9104233882669488], ["TranslateX", 0.4096039512896902, 0.9692703030784571]], [["Equalize", 0.5404313549028165, 0.04094078980738014], ["AutoContrast", 0.07870278300673744, 0.841020779977939]], [["ShearY", 0.2684638876128488, 0.5599793678740521], ["Cutout", 0.19537995362704022, 0.2400995206366768]], [["AutoContrast", 0.19366394417090382, 0.4130755503251951], ["Sharpness", 0.11735660606190662, 0.39276612830651914]], [["Cutout", 0.8313266945081518, 0.37171822186374703], ["Contrast", 0.5088549187459019, 0.2956405118511817]], [["Cutout", 0.28375485371479847, 0.37020183949342683], ["Posterize", 0.718761436947423, 0.2278804627251678]], [["ShearY", 0.6625840735667625, 0.5045065697748213], ["Rotate", 0.5175257698523389, 0.39496923901188824]], [["Color", 0.6498154010188212, 0.38674158604408604], ["Brightness", 0.8157804892728057, 0.05660118670560971]], [["Color", 0.5512855420254102, 0.7812054820692542], ["Solarize", 0.8851292984174468, 0.2808951606943277]], [["Contrast", 0.35258433539074363, 0.8085377169629859], ["Cutout", 0.5197965849563265, 0.8657111726930974]], [["Cutout", 0.23650925054419358, 0.746860862983295], ["Brightness", 0.8842190203336139, 0.4389347348156118]], [["Rotate", 0.8651460526861932, 0.0031372441327392753], ["Equalize", 0.3909498933963822, 0.6221687914603954]], [["TranslateX", 0.5793690303540427, 0.37939687327382987], ["Invert", 0.846172545690258, 0.36950442052945853]], [["Invert", 0.5151721602607067, 0.5860134277259832], ["Contrast", 0.6868708526377458, 0.2188104093363727]], [["Contrast", 0.28019632529718025, 0.8403553410328943], ["Cutout", 0.5238340355491738, 0.6948434115725599]], [["Rotate", 0.1592592617684533, 0.5212044951482974], ["Color", 0.42404215473874546, 0.45894052919059103]], [["AutoContrast", 0.21780978427851283, 0.11813011387113281], ["Contrast", 0.14557770349869537, 0.5468616480449002]], [["Cutout", 0.03573873600256905, 0.8747186430368771], ["AutoContrast", 0.4804465018567564, 0.3968185812087325]], [["ShearY", 0.027192162947493492, 0.35923750027515866], ["Sharpness", 0.03207302705814674, 0.25868625346023777]], [["AutoContrast", 0.9111793886013045, 0.33534571661592005], ["ShearY", 0.31365410004768934, 0.37055495208177025]], [["Color", 0.5119732811716222, 0.10635303813092001], ["Solarize", 0.9828759703639677, 0.33302532900783466]], [["Contrast", 0.9652840964645487, 0.9550826002089741], ["ShearY", 0.16934262075572262, 0.35893022906919625]], [["Invert", 0.21526903298837538, 0.5491812432380025], ["TranslateX", 0.27691575128765095, 0.9916365493500338]], [["AutoContrast", 0.7223428288831728, 0.3001506080569529], ["Posterize", 0.28280773693692957, 0.5630226986948541]], [["TranslateY", 0.5334698670580152, 0.4329627064903895], ["Solarize", 0.11621274404555687, 0.38564564358937725]], [["Brightness", 0.9001900081991266, 0.15453762529292236], ["Equalize", 0.6749827304986464, 0.2174408558291521]], [["TranslateY", 0.703293071780793, 0.20371204513522137], ["Invert", 0.7921926919880306, 0.2647654009616249]], [["AutoContrast", 0.32650519442680254, 0.5567514700913352], ["ShearY", 0.7627653627354407, 0.5363510886152073]], [["Rotate", 0.364293676091047, 0.4262321334071656], ["Posterize", 0.7284189361001443, 0.6052618047275847]], [["Contrast", 0.004679138490284229, 0.6985327823420937], ["Posterize", 0.25412559986607497, 0.969098825421215]], [["ShearY", 0.6831738973100172, 0.6916463366962687], ["TranslateY", 0.8744153159733203, 0.3667879549647143]], [["Posterize", 0.39138456188265913, 0.8617909225610128], ["TranslateX", 0.5198303654364824, 0.5518823068009463]], [["Invert", 0.6471155996761706, 0.4793957129423701], ["ShearX", 0.8046274258703997, 0.9711394307595065]], [["Solarize", 0.2442520851809611, 0.5518114414771629], ["Sharpness", 0.02324109511463257, 0.18216585433541427]], [["Cutout", 0.7004457278387007, 0.4904439660213413], ["Contrast", 0.6516622044646659, 0.7324290164242575]], [["Brightness", 0.594212018801632, 0.5624822682300464], ["ShearX", 0.47929863548325596, 0.5610640338380719]], [["TranslateX", 0.20863492063218445, 0.23761872077836552], ["Color", 0.9374148559524687, 0.06390809573246009]], [["AutoContrast", 0.5548946725094693, 0.40547561665765874], ["Equalize", 0.26341425401933344, 0.2763692089379619]], [["Invert", 0.8224614398122034, 0.15547159819315676], ["Rotate", 0.4915912924663281, 0.6995695827608112]], [["Equalize", 0.05752620481520809, 0.80230125774557], ["Rotate", 0.16338857010673558, 0.8066738989167762]], [["ShearY", 0.5437502855505825, 0.252101665309144], ["Contrast", 0.9268450172095902, 0.13437399256747992]], [["TranslateY", 0.6946438457089812, 0.35376889837139813], ["Sharpness", 0.15438234648960253, 0.2668696344562673]], [["Invert", 0.24506516252953542, 0.1939315433476327], ["Sharpness", 0.8921986990130818, 0.21478051316241717]], [["TranslateY", 0.5292829065905086, 0.6896826369723732], ["Invert", 0.4461047865540309, 0.9854416526561315]], [["Posterize", 0.8085062334285464, 0.4538963572040656], ["Brightness", 0.2623572045603854, 0.16723779221170698]], [["Solarize", 0.1618752496191097, 0.6007634864056693], ["TranslateY", 0.07808851801433346, 0.3951252736249746]], [["TranslateX", 0.35426056783145843, 0.8875451782909476], ["Brightness", 0.5537927990151869, 0.3042790536918476]], [["Cutout", 0.9051584028783342, 0.6050507821593669], ["ShearX", 0.31185875057627255, 0.39145181108334876]], [["Brightness", 0.43157388465566776, 0.45511767545129933], ["ShearY", 0.626464342187273, 0.5251031991594401]], [["Contrast", 0.7978520212540166, 0.45088491126800995], ["ShearY", 0.20415027867560143, 0.24369493783350643]], [["ShearX", 0.48152242363853065, 0.001652619381325604], ["Sharpness", 0.6154899720956758, 0.22465778944283568]], [["Posterize", 0.0008092255557418104, 0.8624848793450179], ["Solarize", 0.7580784903978838, 0.4141187863855049]], [["TranslateY", 0.4829597846471378, 0.6077028815706373], ["ShearX", 0.43316420981872894, 0.007119694447608018]], [["Equalize", 0.2914045973615852, 0.6298874433109889], ["Cutout", 0.18663096101056076, 0.20634383363149222]], [["TranslateX", 0.6909947340830737, 0.40843889682671003], ["ShearX", 0.3693105697811625, 0.070573833710386]], [["Rotate", 0.6184027722396339, 0.6483359499288176], ["AutoContrast", 0.8658233903089285, 0.31462524418660626]], [["Brightness", 0.8165837262133947, 0.38138221738335765], ["Contrast", 0.01566790570443702, 0.1250581265407818]], [["Equalize", 0.16745169701901802, 0.9239433721204139], ["ShearY", 0.5535908803004554, 0.35879199699526654]], [["Color", 0.9675880875486578, 0.19745998576077994], ["Posterize", 0.641736196661405, 0.5702363593336868]], [["ShearY", 0.27730895136251943, 0.4730273890919014], ["Posterize", 0.35829530316120517, 0.9040968539551122]], [["Cutout", 0.9989158254302966, 0.3210048366589035], ["Equalize", 0.9226385492886618, 0.21132010337062]], [["Posterize", 0.32861829410989934, 0.7608163668499222], ["TranslateY", 0.528381246453454, 0.6837459631017135]], [["ShearY", 0.6786278797045173, 0.49006792710382946], ["ShearX", 0.7860409944610941, 0.7960317025665418]], [["Solarize", 0.4420731874598513, 0.7163961196254427], ["Sharpness", 0.11927615232343353, 0.3649599343067734]], [["Cutout", 0.4606157449857542, 0.4682141505042986], ["Contrast", 0.8955528913735222, 0.8468556570983498]], [["Brightness", 0.5742349576881501, 0.5633914487991978], ["ShearX", 0.8288987143597276, 0.5937556836469728]], [["Posterize", 0.05362153577922808, 0.40072961361335696], ["Rotate", 0.6681795049585278, 0.5348470042353504]], [["TranslateY", 0.6190833866612555, 0.7338431624993972], ["Color", 0.5352400737236565, 0.1598194251940268]], [["Brightness", 0.9942846465176832, 0.11918348505217388], ["Brightness", 0.0659098729688602, 0.6558077481794591]], [["Equalize", 0.34089122700685126, 0.048940774058585546], ["ShearX", 0.5472987107071652, 0.2965222509150173]], [["Sharpness", 0.3660728361470086, 0.37607120931207433], ["Sharpness", 0.9974987257291261, 0.2483317486035219]], [["Posterize", 0.931283270966942, 0.7525022430475327], ["Cutout", 0.6299208568533524, 0.3313382622423058]], [["Invert", 0.5074998650080915, 0.9722820836624784], ["Solarize", 0.13997049847474802, 0.19340041815763026]], [["AutoContrast", 0.6804950477263457, 0.31675149536227815], ["Solarize", 0.800632422196852, 0.09054278636377117]], [["TranslateY", 0.6886579465517867, 0.549118383513461], ["Brightness", 0.7298771973550124, 0.59421647759784]], [["Equalize", 0.8117050130827859, 0.22494316766261946], ["AutoContrast", 0.5217061631918504, 0.6106946809838144]], [["Equalize", 0.4734718117645248, 0.7746036952254298], ["Posterize", 0.032049205574512685, 0.9681402692267316]], [["Brightness", 0.4724177066851541, 0.7969700024018729], ["Solarize", 0.6930049134926459, 0.3880086567038069]], [["TranslateX", 0.2833979092130342, 0.6873833799104118], ["Rotate", 0.37167767436617366, 0.03249352593350204]], [["Posterize", 0.7080588381354884, 0.03014586990329654], ["Posterize", 0.20883930954891392, 0.1328596635826556]], [["Cutout", 0.1992050307454733, 0.8079881690617468], ["ShearY", 0.3057279570820446, 0.34868823290010564]], [["TranslateY", 0.6204358851346782, 0.24978856155434062], ["ShearX", 0.2403059671388028, 0.6706906799258086]], [["Contrast", 0.5527380063918701, 0.27504242043334765], ["Rotate", 0.37361791978638376, 0.17818567121454373]], [["Cutout", 0.3368229687890997, 0.013512329226772313], ["Contrast", 0.18480406673028238, 0.21653280083721013]], [["AutoContrast", 0.13634047961070397, 0.5322441057075571], ["Posterize", 0.3409948654529233, 0.2562132228604077]], [["Invert", 0.3375636037272626, 0.5417577242453775], ["Sharpness", 0.10271458969925179, 0.5125859420868099]], [["Invert", 0.26465503753231256, 0.7386494688407392], ["AutoContrast", 0.5310106090963371, 0.14699248759273964]], [["Sharpness", 0.8494538270706318, 0.9524607358113082], ["Solarize", 0.21142978953773187, 0.10711867917080763]], [["Equalize", 0.5185117903942263, 0.06342404369282638], ["ShearY", 0.26812877371366156, 0.32386585917978056]], [["TranslateY", 0.42724471339053904, 0.5218262942425845], ["Brightness", 0.7618037699290332, 0.5773256674209075]], [["Solarize", 0.5683461491921462, 0.7988018975591509], ["AutoContrast", 0.21826664523938988, 0.4395073407383595]], [["Posterize", 0.2564295537162734, 0.6778150727248975], ["Equalize", 0.7571361164411801, 0.4281744623444925]], [["Invert", 0.5171620125994946, 0.8719074953677988], ["ShearX", 0.10216776728552601, 0.20888013515457593]], [["Equalize", 0.934033636879294, 0.7724470445507672], ["ShearX", 0.14671590364536757, 0.06500753170863127]], [["Cutout", 0.48433709681747783, 0.8989915985203363], ["ShearY", 0.5161346572684965, 0.3154078452465332]], [["AutoContrast", 0.4337913490682531, 0.8651407398083308], ["AutoContrast", 0.31402168607643444, 0.5001710653814162]], [["Brightness", 0.4805460794016203, 0.8182812769485313], ["Equalize", 0.6811585495672738, 0.25172380097389147]], [["TranslateX", 0.05384872718386273, 0.7854623644701991], ["Color", 0.12583336502656287, 0.08656304042059215]], [["TranslateX", 0.3949348949001942, 0.0668909826131569], ["ShearX", 0.2895255694762277, 0.23998090792480392]], [["TranslateY", 0.3183346601371876, 0.5869865305603826], ["Cutout", 0.38601500458347904, 0.37785641359408184]], [["Sharpness", 0.3676509660134142, 0.6370727445512337], ["Rotate", 0.17589815946040205, 0.912442427082365]], [["Equalize", 0.46427003979798154, 0.7771177715171392], ["Cutout", 0.6622980582423883, 0.47780927252115374]], [["TranslateX", 0.4535588156726688, 0.9548833090146791], ["ShearY", 0.18609208838268262, 0.034329918652624025]], [["Rotate", 0.4896172340987028, 0.4842683413051553], ["Brightness", 0.08416972178617699, 0.2946109607041465]], [["TranslateY", 0.1443363248914217, 0.7352253161146544], ["ShearX", 0.025210952382823004, 0.6249971039957651]], [["Brightness", 0.08771030702840285, 0.5926338109828604], ["Contrast", 0.629121304110493, 0.36114268164347396]], [["Cutout", 0.003318169533990778, 0.984234627407162], ["Color", 0.5656264894233379, 0.9913705503959709]], [["Cutout", 0.17582168928005226, 0.5163176285036686], ["Sharpness", 0.42976684239235224, 0.9936723374147685]], [["Rotate", 0.13343297511611085, 0.730719022391835], ["Cutout", 0.43419793455016154, 0.9802436121876401]], [["ShearX", 0.8761482122895571, 0.11688364945899332], ["Solarize", 0.6071032746712549, 0.9972373138154098]], [["Contrast", 0.2721995133325574, 0.9467839388553563], ["AutoContrast", 0.357368427575824, 0.6530359095247653]], [["Equalize", 0.5334298945812708, 0.7157629957411794], ["Brightness", 0.8885107405370157, 0.2909013041171791]], [["Equalize", 0.4907081744271751, 0.9999203497290372], ["ShearX", 0.0055186544890628575, 0.20501406304441697]], [["Color", 0.4865852751351166, 0.14717278223914915], ["TranslateX", 0.0492335566831905, 0.01654291587484527]], [["Contrast", 0.3753662301521211, 0.866484274102244], ["Color", 0.21148416029328898, 0.37861792266657684]], [["TranslateY", 0.03960047686663052, 0.9948086048192006], ["TranslateX", 0.5802633545422445, 0.7696464344779717]], [["Contrast", 0.6456791961464718, 0.6304663998505495], ["Sharpness", 0.594774521429873, 0.8024138008893688]], [["Equalize", 0.5326123709954759, 0.7361990154971826], ["Invert", 0.5337609996065145, 0.06826577456972233]], [["ShearY", 0.7177596430755101, 0.16672206074906565], ["Equalize", 0.1847132768987843, 0.16186121936769876]], [["ShearY", 0.037342495065949534, 0.7762322168034441], ["Rotate", 0.28731231550023495, 0.4605573565280328]], [["Contrast", 0.6815742688289678, 0.04073638022156048], ["Cutout", 0.20201133153964437, 0.048429819360450654]], [["Color", 0.5295323372448824, 0.8591352159356821], ["Posterize", 0.7743900815037675, 0.8308865010050488]], [["Solarize", 0.9325362059095493, 0.4070769736318192], ["Contrast", 0.09359008071252661, 0.2808191171337515]], [["Sharpness", 0.6413241263332543, 0.5493867784897841], ["Solarize", 0.021951790397463734, 0.1045868634597023]], [["Color", 0.006027943433085061, 0.698043169126901], ["TranslateX", 0.06672167045857719, 0.6096719632236709]], [["TranslateX", 0.42167004878865333, 0.8844171486107537], ["Color", 0.12383835252312375, 0.9559595374068695]], [["Posterize", 0.5382560989047361, 0.6014252438301297], ["Color", 0.26197040526014054, 0.3423981550778665]], [["Cutout", 0.33150268513579584, 0.40828564490879615], ["AutoContrast", 0.6907753092981255, 0.05779246756831708]], [["Equalize", 0.31608006376116865, 0.9958870759781376], ["TranslateY", 0.15842255624921547, 0.5764254535539765]], [["Contrast", 0.19859706438565994, 0.12680764238281503], ["TranslateY", 0.4694115475285127, 0.45831161348904836]], [["TranslateX", 0.18768081492494126, 0.7718605539481094], ["Cutout", 0.2340834739291012, 0.3290460999084155]], [["Posterize", 0.17300123510877463, 0.5276823821218432], ["AutoContrast", 0.5861008799330297, 0.31557924295308126]], [["TranslateX", 0.36140745478517367, 0.4172762477431993], ["Sharpness", 0.6518477061748665, 0.9033991248207786]], [["AutoContrast", 0.1757278990984992, 0.9562490311064124], ["Invert", 0.43712652497757065, 0.26925880337078234]], [["TranslateX", 0.38113274849599377, 0.35742156735271613], ["TranslateY", 0.47708889990018216, 0.7975974044609476]], [["Brightness", 0.39538470887490523, 0.09692156164771923], ["Equalize", 0.876825166573471, 0.0979346217138612]], [["Solarize", 0.07679586061933875, 0.45996163577975313], ["Invert", 0.039726680682847904, 0.23574574397443826]], [["ShearX", 0.9739648414905278, 0.5217986621319772], ["TranslateY", 0.21653455086845896, 0.30415852174016683]], [["TranslateY", 0.26965366633030263, 0.4355259497820251], ["Sharpness", 0.6343493801543757, 0.9337027079656623]], [["Rotate", 0.42301232492240126, 0.07813015342326983], ["AutoContrast", 0.28524730310382906, 0.24127293503900557]], [["Color", 0.826300213905907, 0.008451115447607682], ["Equalize", 0.6770124607838715, 0.2889698349030014]], [["Cutout", 0.3461911530045792, 0.7481322146924341], ["Brightness", 0.1831459184570124, 0.5487074846857195]], [["Brightness", 0.8455429603962046, 0.4838335496721761], ["Cutout", 0.5778222397066808, 0.7789798279724414]], [["Brightness", 0.7859388330361665, 0.5907006126719181], ["Brightness", 0.5299842953874527, 0.008670514958094622]], [["Rotate", 0.9584331504536162, 0.7242692977964363], ["TranslateY", 0.46941406313257866, 0.748911298847083]], [["AutoContrast", 0.5878130357161462, 0.25218818797390996], ["Solarize", 0.815466142337258, 0.20231731395730107]], [["ShearX", 0.15594838773787617, 0.9764784874102524], ["TranslateY", 0.5805369037495945, 0.1412009058745196]], [["Sharpness", 0.7936370935749524, 0.5142489498674206], ["Sharpness", 0.1544307510097193, 0.3678451501088748]], [["TranslateY", 0.29391437860633873, 0.3520843012638746], ["Brightness", 0.5885278199370352, 0.04915265122854349]], [["AutoContrast", 0.3329771519033218, 0.2459852352278583], ["Equalize", 0.8674782697650298, 0.2900192232303214]], [["Cutout", 0.58997726901359, 0.9910393463442352], ["Contrast", 0.09792234559792412, 0.23341828880112486]], [["Cutout", 0.4643317809492098, 0.3224299097542076], ["TranslateY", 0.7998033586490294, 0.27086436352896565]], [["AutoContrast", 0.13138317155414905, 0.3419742927322439], ["TranslateY", 0.05413070060788905, 0.5504283113763994]], [["Posterize", 0.3645493423712921, 0.10684861674653627], ["Color", 0.6343589365592908, 0.9712261380583729]], [["Color", 0.06539862123316142, 0.34370535435837324], ["Equalize", 0.8098077629435421, 0.1272416658849032]], [["Invert", 0.3600258964493429, 0.7455698641930473], ["Color", 0.4118102215241555, 0.4489347750419333]], [["Sharpness", 0.2230673636976691, 0.2240713255305713], ["AutoContrast", 0.5039292091174429, 0.033700713206763835]], [["ShearX", 0.10611028325684749, 0.4235430688519599], ["Brightness", 0.354597328722803, 0.6835155193055997]], [["ShearX", 0.101313662029975, 0.3048854771395032], ["ShearX", 0.39832929626318425, 0.5569152062399838]], [["ShearX", 0.46033087857932264, 0.5976525683159943], ["Color", 0.8117411866929898, 0.22950658046373415]], [["Cutout", 0.04125062306390376, 0.5021647863925347], ["TranslateY", 0.4949139091550513, 0.40234738545601595]], [["TranslateX", 0.9982425877241792, 0.3912268450702254], ["Cutout", 0.8094853705295444, 0.4628037417520003]], [["Contrast", 0.47154787535001147, 0.5116549800625204], ["Invert", 0.4929108509901112, 0.713690694626014]], [["ShearX", 0.3073913369156325, 0.5912409524756753], ["Equalize", 0.5603975982699875, 0.12046838435247365]], [["TranslateY", 0.8622939212850868, 0.057802109037417344], ["Invert", 0.7577173459800602, 0.33727019024447835]], [["Cutout", 0.3646694663986778, 0.6285264075514656], ["Color", 0.5589259087346165, 0.6650676195317845]], [["Invert", 0.8563008117600374, 0.6216056385231019], ["AutoContrast", 0.7575002303510038, 0.6906934785154547]], [["ShearX", 0.4415411885102101, 0.301535484182858], ["TranslateY", 0.779716145113622, 0.5792057745092073]], [["Invert", 0.10736083594024397, 0.10640910911300788], ["Posterize", 0.5923391813408784, 0.5437447559328059]], [["Color", 0.4745215286268124, 0.08046291318852558], ["Rotate", 0.1642897827127771, 0.20754337935267492]], [["Invert", 0.3141086213412405, 0.5865422721808763], ["AutoContrast", 0.7551954144793225, 0.5588044000850431]], [["Equalize", 0.979500405577596, 0.6846916489547885], ["Rotate", 0.11257616752512875, 0.8137724117751907]], [["Equalize", 0.6315666801659133, 0.71548254701219], ["Cutout", 0.38805635642306224, 0.29282906744304604]], [["Posterize", 0.022485702859896456, 0.2794994040845844], ["Color", 0.4554990465860552, 0.5842888808848151]], [["Invert", 0.15787502346886398, 0.5137397924063724], ["TranslateY", 0.487638703473969, 0.6428121360825987]], [["Rotate", 0.20473927977443407, 0.6090899892067203], ["Contrast", 0.3794752343740154, 0.8056548374185936]], [["AutoContrast", 0.35889225269685354, 0.7311496777471619], ["Sharpness", 0.10152796686794396, 0.34768639850633193]], [["Rotate", 0.6298704242033275, 0.09649334401126405], ["Solarize", 0.24713244934163017, 0.4292117526982358]], [["Contrast", 0.9851015107131748, 0.30895068679118054], ["Sharpness", 0.7167845732283787, 0.36269175386392893]], [["Equalize", 0.49699932368219435, 0.21262924430159158], ["Contrast", 0.8497731498354579, 0.672321242252727]], [["ShearX", 0.18955591368056923, 0.47178691165954034], ["Sharpness", 0.17732805705271348, 0.5486957094984023]], [["ShearY", 0.5087926728214892, 0.8236809302978783], ["AutoContrast", 0.9661195881001936, 0.1309360428195535]], [["Rotate", 0.7825835251082691, 0.8292427086033229], ["TranslateX", 0.2034110174253454, 0.4073091408820304]], [["Cutout", 0.33457316681888716, 0.480098511703719], ["Sharpness", 0.8686004956803908, 0.21719357589897192]], [["ShearX", 0.30750577846813, 0.6349236735519613], ["Color", 0.5096781256213182, 0.5367289796478476]], [["Rotate", 0.7881847986981432, 0.846966895144323], ["Posterize", 0.33955649631388407, 0.9484449471562024]], [["Posterize", 0.5154127791998345, 0.8765287012129974], ["Posterize", 0.09621562708431097, 0.42108077474553995]], [["ShearX", 0.5513772653411826, 0.27285892893658015], ["AutoContrast", 0.027608088485522986, 0.1738173285576814]], [["Equalize", 0.7950881609822011, 0.05938388811616446], ["ShearX", 0.7864733097562856, 0.5928584864954718]], [["Equalize", 0.03401947599579436, 0.4936643525799874], ["Solarize", 0.8445332527647407, 0.4695434980914176]], [["AutoContrast", 0.9656295942383031, 0.6330670076537706], ["Brightness", 0.303859679517296, 0.8882002295195086]], [["ShearY", 0.5242765280639856, 0.7977406809732712], ["Rotate", 0.24810823616083127, 0.41392557985700773]], [["Posterize", 0.6824268148168342, 0.21831492475831715], ["ShearY", 0.0008811906288737209, 0.1939566265644924]], [["ShearY", 0.8413370823124643, 0.7075999817793881], ["Brightness", 0.7942266192900009, 0.0384845738170444]], [["ShearY", 0.9003919463843213, 0.5068340457708402], ["AutoContrast", 0.9990937631537938, 0.35323621376481695]], [["Contrast", 0.3266913024108897, 0.5470774782762176], ["Contrast", 0.31235464476196995, 0.5723334696204473]], [["AutoContrast", 0.40137522654585955, 0.4274859892417776], ["Sharpness", 0.6173858127038773, 0.9629236289042568]], [["Sharpness", 0.3728210261025356, 0.7873518787942092], ["Solarize", 0.4319848902062112, 0.799524274852396]], [["Sharpness", 0.009379857090624758, 0.3143858944787348], ["ShearY", 0.20273037650420184, 0.3501104740582885]], [["Color", 0.1837135820716444, 0.5709648984713641], ["Solarize", 0.36312838060628455, 0.3753448575775562]], [["Cutout", 0.3400431457353702, 0.6871688775988243], ["ShearX", 0.42524570507364123, 0.7108865889616602]], [["Sharpness", 0.30703348499729893, 0.885278643437672], ["Cutout", 0.04407034125935705, 0.6821013415071144]], [["Brightness", 0.7164362367177879, 0.3383891625406651], ["Posterize", 0.002136409392137939, 0.5744439712876557]], [["Rotate", 0.757566991428807, 0.41351586654059386], ["TranslateY", 0.6716670812367449, 0.45381701497377025]], [["Color", 0.29554345831738604, 0.5747484938203239], ["Brightness", 0.6495565535422139, 0.38353714282675055]], [["Color", 0.6552239827844064, 0.6396684879350223], ["Rotate", 0.4078437959841622, 0.8229364582618871]], [["ShearX", 0.3325165311431108, 0.99875651917317], ["Cutout", 0.060614087173980605, 0.8655206968462149]], [["ShearY", 0.8591223614020521, 0.47375809606391645], ["ShearY", 0.09964216351993155, 0.7076762087109618]], [["Color", 0.9353968383925787, 0.5171703648813921], ["Cutout", 0.7542267059402566, 0.4591488152776885]], [["ShearX", 0.6832456179177027, 0.6798505733549863], ["Color", 0.7408439718746301, 0.5061967673457707]], [["Equalize", 0.4451729339243929, 0.9242958562575693], ["Posterize", 0.2426742903818478, 0.7914731845374992]], [["Posterize", 0.6241497285503436, 0.6800650930438693], ["Rotate", 0.8212761169895445, 0.42470879405266637]], [["Sharpness", 0.35467334577635123, 0.4150922293649909], ["Color", 0.38988011871489925, 0.08762395748275534]], [["Invert", 0.20231176261188386, 0.34300045056881756], ["Color", 0.6311643386438919, 0.4311911861691113]], [["Contrast", 0.2892223327756343, 0.533349670629816], ["ShearY", 0.6483243327679983, 0.37584367848303185]], [["Contrast", 0.6516401043089397, 0.3801387361685983], ["Contrast", 0.38470661862567795, 0.994720698440467]], [["Contrast", 0.44558087160644655, 0.4234506152228727], ["AutoContrast", 0.30132391715441104, 0.7758068064149011]], [["ShearY", 0.8336612877669443, 0.6961881064757953], ["TranslateX", 0.111182606133131, 0.7138593872015647]], [["Brightness", 0.7252053408816349, 0.6883715819669095], ["Cutout", 0.6664014893052573, 0.5118622737562747]], [["TranslateX", 0.04294623433241698, 0.4737274091618545], ["Solarize", 0.15848056715239178, 0.436678451116009]], [["ShearX", 0.41843604414439584, 0.5571669083243844], ["Solarize", 0.31754187268874345, 0.643294796216908]], [["Cutout", 0.308644829376876, 0.9455913104658791], ["Cutout", 0.04221174396591258, 0.8004389485099825]], [["Invert", 0.7644819805649288, 0.393641460630097], ["Posterize", 0.20832144467525543, 0.6449709932505365]], [["ShearY", 0.60954354330238, 0.45193814135157406], ["Rotate", 0.07564178568434804, 0.5700158941616946]], [["Color", 0.47993653910354905, 0.18770437256254732], ["Equalize", 0.16540989366253533, 0.3295832145751728]], [["Sharpness", 0.773656112445468, 0.899183686347773], ["AutoContrast", 0.6225833171499476, 0.8375805811436356]], [["Brightness", 0.3119630413126101, 0.21694186245727698], ["Cutout", 0.08263220622864997, 0.9910421137289533]], [["TranslateY", 0.5200200210314198, 0.44467464167817444], ["Cutout", 0.3466375681433383, 0.22385957813397142]], [["ShearY", 0.4445374219718209, 0.23917745675733915], ["Equalize", 0.32094329607540717, 0.6286388268054685]], [["Invert", 0.6194633221674505, 0.6219326801360905], ["Color", 0.43219405413154555, 0.5463431710956901]], [["ShearX", 0.5491808798436206, 0.4485147269153593], ["ShearX", 0.9624243432991532, 0.581319457926692]], [["Cutout", 0.8486066390061917, 0.48538785811340557], ["Cutout", 0.15945182827781573, 0.4114259503742423]], [["TranslateX", 0.9845485123667319, 0.7590166645874611], ["Solarize", 0.9920857955871512, 0.33259831689209834]], [["Brightness", 0.3985764491687188, 0.3516086190155328], ["Cutout", 0.13907765098725244, 0.42430309616193995]], [["Color", 0.35877942890428727, 0.363294622757879], ["Equalize", 0.4997709941984466, 0.34475754120666147]], [["Sharpness", 0.5234916035905941, 0.8988480410886609], ["AutoContrast", 0.793554237802939, 0.2575758806963965]], [["Brightness", 0.36998588693418133, 0.24144652775222428], ["Cutout", 0.06610767765334377, 0.9979246311006975]], [["TranslateY", 0.6132425595571164, 0.43952345951359123], ["Cutout", 0.361849532200793, 0.8462247954545264]], [["Posterize", 0.36953849915949677, 0.3144747463577223], ["Equalize", 0.3258985378881982, 0.6314053736452068]], [["TranslateY", 0.35835648104981205, 0.08075066564380576], ["TranslateX", 0.5242389109555177, 0.11959330395816647]], [["ShearX", 0.32773751079554303, 0.9307864751586945], ["Sharpness", 0.006921805496030664, 0.8736511230672348]], [["TranslateY", 0.48202000226401526, 0.7058919195136056], ["ShearY", 0.6998308555145181, 0.21074360071080764]], [["AutoContrast", 0.7615852152325713, 0.24914859158079972], ["Cutout", 0.8270894478252626, 0.5804285538051077]], [["AutoContrast", 0.5391662421077847, 0.5233969710179517], ["Brightness", 0.04205906143049083, 0.382677139318253]], [["Brightness", 0.6904817357054526, 0.9116378156160974], ["Invert", 0.24305250280628815, 0.2384731852843838]], [["TranslateX", 0.2661235046256291, 0.9705982948874188], ["Sharpness", 0.35821873293899625, 0.0030835471296858444]], [["Posterize", 0.39029991982997647, 0.4286238191447004], ["TranslateX", 0.08954883207184736, 0.7263973533121859]], [["Cutout", 0.040284118298638344, 0.0388330236482832], ["Posterize", 0.7807814946471116, 0.5238352731112299]], [["ShearY", 0.43556653451802413, 0.6924037743225071], ["Contrast", 0.001081515338562919, 0.7340363920548519]], [["Sharpness", 0.6966467544442373, 0.10202517317137291], ["Color", 0.18836344735972566, 0.31736252662501935]], [["Contrast", 0.6460000689193517, 0.16242196500430484], ["AutoContrast", 0.6003831047484897, 0.8612141912778188]], [["Brightness", 0.9172874494072921, 0.292364504408795], ["Solarize", 0.344602582555059, 0.7054248176903991]], [["Brightness", 0.020940469451794064, 0.5051042440134866], ["Cutout", 0.569500058123745, 0.9091247933460598]], [["Invert", 0.7367715506799225, 0.636137024500329], ["TranslateY", 0.6186960283294023, 0.37626001619073624]], [["TranslateX", 0.2863246154089121, 0.7454318730628517], ["ShearY", 0.6649909124084395, 0.37639265910774133]], [["Equalize", 0.34603376919062656, 0.9324026002997775], ["Sharpness", 0.8481669261233902, 0.14545759197862507]], [["Contrast", 0.6184370038862784, 0.8074198580702933], ["TranslateX", 0.07036135693949985, 0.46222686847401306]], [["Invert", 0.9304884364616345, 0.26298808050002387], ["Color", 0.8027813156985396, 0.7748486756116594]], [["Posterize", 0.2887993806199106, 0.9576118517235523], ["Contrast", 0.07498577510121784, 0.09131727137211232]], [["Contrast", 0.8110536569461197, 0.051038215841138386], ["Solarize", 0.8799018446258887, 0.25028365826721977]], [["Cutout", 0.006954733791187662, 0.030507696587206496], ["Brightness", 0.45329597160103124, 0.9623148451520953]], [["TranslateX", 0.7436227980344521, 0.45996857241163086], ["Solarize", 0.9682234479355196, 0.70777684485634]], [["Brightness", 0.2080557865889058, 0.025557286020371328], ["AutoContrast", 0.4786039197123853, 0.9271157120589375]], [["Solarize", 0.1822930503108656, 0.8448222682426465], ["ShearX", 0.6221001240196488, 0.207994745014715]], [["Color", 0.27879201870553094, 0.9112278219836276], ["Color", 0.7508664408516654, 0.14885798940641318]], [["ShearX", 0.5496326925552889, 0.7643918760952656], ["AutoContrast", 0.7887459433195374, 0.5993900500657054]], [["ShearY", 0.7182376017241904, 0.7470412126724141], ["Rotate", 0.7644845975844854, 0.38510752407409893]], [["Contrast", 0.7984591239416293, 0.054767400038152704], ["Posterize", 0.7324315466290486, 0.41749946919991243]], [["Contrast", 0.596887781894766, 0.14832691232456097], ["Contrast", 0.05140651977459313, 0.14459348285712803]], [["TranslateX", 0.32766681876233766, 0.5291103977440215], ["Color", 0.6039423443931029, 0.6280077043167083]], [["Invert", 0.5267106136816635, 0.9429838545064784], ["Sharpness", 0.9999053422304087, 0.24764251340211074]], [["Contrast", 0.495767451313242, 0.6744720418896594], ["Brightness", 0.2220993631062378, 0.023842431692152832]], [["Invert", 0.7609399278201697, 0.38010826932678554], ["Color", 0.8454251931688355, 0.5876680099851194]], [["Posterize", 0.24967505238473384, 0.3801835337368412], ["Contrast", 0.15106121477353399, 0.6785384814310887]], [["Invert", 0.49594153211743874, 0.32307787492774986], ["Contrast", 0.46822075688054793, 0.7106858486805577]], [["Sharpness", 0.7204076261101202, 0.5928585438185809], ["Rotate", 0.2922878012111486, 0.2742491027179961]], [["Solarize", 0.2866813728691532, 0.2856363754608978], ["TranslateY", 0.7817609208793659, 0.17156048740523572]], [["Cutout", 0.03345540659323987, 0.30068271036485605], ["ShearY", 0.2556603044234358, 0.32397855468866993]], [["TranslateY", 0.20032231858163152, 0.4577561841994639], ["Cutout", 0.8063563515601337, 0.9224365467344459]], [["TranslateY", 0.27130034613023113, 0.7446375583249849], ["ShearX", 0.8254766023480402, 0.4187078898038131]], [["ShearX", 0.2937536068210411, 0.3864492533047109], ["Contrast", 0.7069611463424469, 0.686695922492015]], [["TranslateX", 0.5869084659063555, 0.7866008068031776], ["Invert", 0.289041613918004, 0.5774431720429087]], [["Posterize", 0.6199250263408456, 0.36010044446077893], ["Color", 0.7216853388297056, 0.18586684958836489]], [["Posterize", 0.16831615585406814, 0.08052519983493259], ["Cutout", 0.7325882891023244, 0.77416439921321]], [["Posterize", 0.3000961100422498, 0.5181759282337892], ["Contrast", 0.40376073196794304, 0.613724714153924]], [["ShearX", 0.32203193464136226, 0.037459860897434916], ["Solarize", 0.961542785512965, 0.5176575408248285]], [["Posterize", 0.8986732529036036, 0.7773257927223327], ["AutoContrast", 0.9765986969928243, 0.2092264330225745]], [["Posterize", 0.7463386563644007, 0.7086671048242543], ["Posterize", 0.6433819807034994, 0.00541136425219968]], [["Contrast", 0.8810746688690078, 0.4821029611474963], ["Invert", 0.5121169325265204, 0.6360694878582249]], [["AutoContrast", 0.457606735372388, 0.6104794570624505], ["Color", 0.0020511991982608124, 0.6488142202778011]], [["Invert", 0.01744463899367027, 0.9799156424364703], ["ShearY", 0.3448213456605478, 0.04437356383800711]], [["Solarize", 0.28511589596283315, 0.283465265528744], ["Rotate", 0.6831807199089897, 0.0617176467316177]], [["Sharpness", 0.329148970281285, 0.398397318402924], ["Color", 0.9125837011914073, 0.4724426676489746]], [["Posterize", 0.05701522811381192, 0.17109014518445975], ["Cutout", 0.785885656821686, 0.39072624694455804]], [["TranslateY", 0.36644251447248277, 0.5818480868136134], ["Equalize", 0.06162286852923926, 0.710929848709861]], [["ShearY", 0.8667124241442813, 0.7556246528256454], ["ShearY", 0.505190335528531, 0.2935701441277698]], [["Brightness", 0.6369570015916268, 0.5131486964430919], ["Color", 0.4887119711633827, 0.9364572089679907]], [["Equalize", 0.06596702627228657, 0.42632445412423303], ["Equalize", 0.583434672187985, 0.045592788478947655]], [["ShearY", 0.12701084021549092, 0.501622939075192], ["Cutout", 0.7948319202684251, 0.5662618207034569]], [["Posterize", 0.24586808377061664, 0.5178008194277262], ["Contrast", 0.1647040530405073, 0.7459410952796975]], [["Solarize", 0.346601298126444, 0.02933266448415553], ["ShearY", 0.9571781647031095, 0.4992610484566735]], [["Brightness", 0.5174960605130408, 0.4387498174634591], ["AutoContrast", 0.6327403754086753, 0.8279630556620247]], [["Posterize", 0.7591448754183128, 0.6265369743070788], ["Posterize", 0.5030300462943854, 0.00401699185532868]], [["Contrast", 0.02643254602183477, 0.44677741300429646], ["Invert", 0.2921779546234399, 0.732876182854368]], [["TranslateY", 0.3516821152310867, 0.7142224211142528], ["Brightness", 0.07382104862245475, 0.45368581543623165]], [["Invert", 0.21382474908836685, 0.8413922690356168], ["Invert", 0.4082563426777157, 0.17018243778787834]], [["Brightness", 0.9533955059573749, 0.8279651051553477], ["Cutout", 0.6730769221406385, 0.07780554260470988]], [["Brightness", 0.6022173063382547, 0.6008500678386571], ["Sharpness", 0.5051909719558138, 0.002298383273851839]], [["Contrast", 0.03373395758348563, 0.3343918835437655], ["Sharpness", 0.8933651164916847, 0.21738300404986516]], [["TranslateX", 0.7095755408419822, 0.26445508146225394], ["Equalize", 0.18255527363432034, 0.38857557766574147]], [["Solarize", 0.4045911117686074, 0.009106925727519921], ["Posterize", 0.9380296936271705, 0.5485821516085955]], [["Posterize", 0.20361995432403968, 0.45378735898242406], ["AutoContrast", 0.9020357653982511, 0.7880592087609304]], [["AutoContrast", 0.9921550787672145, 0.7396130723399785], ["Cutout", 0.4203609896071977, 0.13000504717682415]], [["Equalize", 0.1917806394805356, 0.5549114911941102], ["Posterize", 0.27636900597148506, 0.02953514963949344]], [["AutoContrast", 0.5427071893197213, 0.6650127340685553], ["Color", 0.011762461060904839, 0.3793508738225649]], [["Invert", 0.18495006059896424, 0.8561476625981166], ["ShearY", 0.6417068692813954, 0.9908751019535517]], [["Solarize", 0.2992385431633619, 0.33622162977907644], ["Rotate", 0.6070550252540432, 0.010205544695142064]], [["Sharpness", 0.33292787606841845, 0.549446566149951], ["Color", 0.9097665730481233, 0.9947658451503181]], [["Posterize", 0.11207465085954937, 0.23296263754645155], ["Cutout", 0.6159972426858633, 0.38289684517298556]], [["TranslateX", 0.7343689718523805, 0.16303049089087485], ["Equalize", 0.3138385390145809, 0.6096356352129273]], [["Solarize", 0.4807269891506887, 0.28116279654856363], ["Posterize", 0.9753467973380021, 0.6327025372916857]], [["Posterize", 0.837244997106023, 0.5586046483574153], ["AutoContrast", 0.9005775602024721, 0.7983389828641411]], [["AutoContrast", 0.8347112949943837, 0.7321850307727004], ["Cutout", 0.3322676575657192, 0.14409873524237032]], [["Equalize", 0.12285967262649124, 0.5368519477089722], ["Posterize", 0.2693593445898034, 0.15098267759162076]], [["Invert", 0.331021587020619, 0.3140868578915853], ["Cutout", 0.48268387543799884, 0.7642598986625201]], [["Equalize", 0.47573794714622175, 0.8628185952549363], ["Solarize", 0.14860046214144496, 0.3739284346347912]], [["AutoContrast", 0.6747373196190459, 0.2912917979635714], ["Posterize", 0.27259573208358623, 0.9643671211873469]], [["Sharpness", 0.15019788105901233, 0.7289238028242861], ["ShearY", 0.7998448015985137, 0.5924798900807636]], [["Brightness", 0.7874052186079156, 0.9446398428550358], ["Equalize", 0.5105557539139616, 0.6719808885741001]], [["ShearX", 0.783252331899515, 0.74960184771181], ["ShearX", 0.4327935527932927, 0.29980994764698565]], [["Rotate", 0.03892023906368644, 0.24868635699639904], ["Cutout", 0.6408903979315637, 0.32135851733523907]], [["Invert", 0.9972802027590713, 0.9374194642823106], ["ShearX", 0.20016463162924894, 0.0052278586143255645]], [["AutoContrast", 0.9328687102578992, 0.44280614999256235], ["Color", 0.05637751621265141, 0.26921974769786455]], [["AutoContrast", 0.2798532308065416, 0.5283914274806746], ["Cutout", 0.12930089032151, 0.25624459046884057]], [["Invert", 0.2397428994839993, 0.31011715409282065], ["Cutout", 0.5875151915473042, 0.7454458580264322]], [["Equalize", 0.374815667651982, 0.9502053862625081], ["Solarize", 0.10100323698574426, 0.5124939317648691]], [["AutoContrast", 0.6009889057852652, 0.3080148907275367], ["Posterize", 0.6543352447742621, 0.17498668744492413]], [["Sharpness", 0.14402909409016001, 0.9239239955843186], ["ShearY", 0.8959818090635513, 0.7258262803413784]], [["Brightness", 0.8672271320432974, 0.8241439816189235], ["Equalize", 0.4954433852960082, 0.6687050430971254]], [["Solarize", 0.47813402689782114, 0.9447222576804901], ["TranslateY", 0.32546974113401694, 0.8367777573080345]], [["Sharpness", 0.48098022972519927, 0.2731904819197933], ["Rotate", 0.14601550238940067, 0.3955290089346866]], [["AutoContrast", 0.3777442613874327, 0.9991495158709968], ["TranslateY", 0.2951496731751222, 0.6276755696126608]], [["Cutout", 0.487150344941835, 0.7976642551725155], ["Solarize", 0.643407733524025, 0.6313641977306543]], [["Rotate", 0.35017053741686033, 0.23960877779589906], ["Sharpness", 0.8741761196478873, 0.12362019972427862]], [["Invert", 0.8849459784626776, 0.48532144354199647], ["Invert", 0.702430443380318, 0.924655906426149]], [["Equalize", 0.6324140359298986, 0.9780539325897597], ["AutoContrast", 0.39105074227907843, 0.3636856607173081]], [["AutoContrast", 0.8049993541952016, 0.3231157206314408], ["ShearY", 0.6675686366141409, 0.7345332792455934]], [["Sharpness", 0.12332351413693327, 0.9345179453120547], ["Solarize", 0.1594280186083361, 0.422049311332906]], [["Rotate", 0.38227253679386375, 0.7664364038099101], ["AutoContrast", 0.5725492572719726, 0.21049701651094446]], [["Brightness", 0.6432891832524184, 0.8243948738979008], ["Equalize", 0.20355899618080098, 0.7983877568044979]], [["ShearY", 0.694393675204811, 0.3686964692262895], ["TranslateX", 0.5593122846101599, 0.3378904046390629]], [["Invert", 0.9139730140623171, 0.7183505086140822], ["Posterize", 0.2675839177893596, 0.21399738931234905]], [["TranslateX", 0.05309461965184896, 0.032983777975422554], ["Sharpness", 0.412621944330688, 0.4752089612268503]], [["Equalize", 0.06901149860261116, 0.27405796188385945], ["AutoContrast", 0.7710451977604326, 0.20474249114426807]], [["ShearX", 0.47416427531072325, 0.2738614239087857], ["Cutout", 0.2820106413231565, 0.6295219975308107]], [["Cutout", 0.19984489885141582, 0.7019895950299546], ["ShearX", 0.4264722378410729, 0.8483962467724536]], [["ShearY", 0.42111446850243256, 0.1837626718066795], ["Brightness", 0.9187856196205942, 0.07478292286531767]], [["Solarize", 0.2832036589192868, 0.8253473638854684], ["Cutout", 0.7279303826662196, 0.615420010694839]], [["ShearX", 0.963251873356884, 0.5625577053738846], ["Color", 0.9637046840298858, 0.9992644813427337]], [["Invert", 0.7976502716811696, 0.43330238739921956], ["ShearY", 0.9113181667853614, 0.9066729024232627]], [["Posterize", 0.5750620807485399, 0.7729691927432935], ["Contrast", 0.4527879467651071, 0.9647739595774402]], [["Posterize", 0.5918751472569104, 0.26467375535556653], ["Posterize", 0.6347402742279589, 0.7476940787143674]], [["Invert", 0.16552404612306285, 0.9829939598708993], ["Solarize", 0.29886553921638087, 0.22487098773064948]], [["Cutout", 0.24209211313246753, 0.5522928952260516], ["AutoContrast", 0.6212831649673523, 0.4191071063984261]], [["ShearX", 0.4726406722647257, 0.26783614257572447], ["TranslateY", 0.251078162624763, 0.26103450676044304]], [["Cutout", 0.8721775527314426, 0.6284108541347894], ["ShearX", 0.7063325779145683, 0.8467168866724094]], [["ShearY", 0.42226987564279606, 0.18012694533480308], ["Brightness", 0.858499853702629, 0.4738929353785444]], [["Solarize", 0.30039851082582764, 0.8151511479162529], ["Cutout", 0.7228873804059033, 0.6174351379837011]], [["ShearX", 0.4921198221896609, 0.5678998037958154], ["Color", 0.7865298825314806, 0.9309020966406338]], [["Invert", 0.8077821007916464, 0.7375015762124386], ["Cutout", 0.032464574567796195, 0.25405044477004846]], [["Color", 0.6061325441870133, 0.2813794250571565], ["TranslateY", 0.5882949270385848, 0.33262043078220227]], [["ShearX", 0.7877331864215293, 0.8001131937448647], ["Cutout", 0.19828215489868783, 0.5949317580743655]], [["Contrast", 0.529508728421701, 0.36477855845285007], ["Color", 0.7145481740509138, 0.2950794787786947]], [["Contrast", 0.9932891064746089, 0.46930062926732646], ["Posterize", 0.9033014136780437, 0.5745902253320527]]] return p def policy_decoder(augment, num_policy, num_op): op_list = augment_list(False) policies = [] for i in range(num_policy): ops = [] for j in range(num_op): op_idx = augment['policy_%d_%d' % (i, j)] op_prob = augment['prob_%d_%d' % (i, j)] op_level = augment['level_%d_%d' % (i, j)] ops.append((op_list[op_idx][0].__name__, op_prob, op_level)) policies.append(ops) return policies ================================================ FILE: fast_autoaugment/confs/efficientnet_b0.yaml ================================================ model: type: efficientnet-b0 condconv_num_expert: 1 # if this is greater than 1(eg. 4), it activates condconv. dataset: imagenet aug: fa_reduced_imagenet cutout: 0 batch: 128 # per gpu epoch: 350 lr: 0.008 # 0.256 for 4096 batch lr_schedule: type: 'efficientnet' warmup: multiplier: 1 epoch: 5 optimizer: type: rmsprop decay: 0.00001 clip: 0 ema: 0.9999 ema_interval: -1 lb_smooth: 0.1 ================================================ FILE: fast_autoaugment/confs/efficientnet_b0_condconv.yaml ================================================ model: type: efficientnet-b0 condconv_num_expert: 8 # if this is greater than 1(eg. 4), it activates condconv. dataset: imagenet aug: fa_reduced_imagenet cutout: 0 batch: 128 # per gpu epoch: 350 lr: 0.008 # 0.256 for 4096 batch lr_schedule: type: 'efficientnet' warmup: multiplier: 1 epoch: 5 optimizer: type: rmsprop decay: 0.00001 clip: 0 ema: 0.9999 ema_interval: -1 lb_smooth: 0.1 mixup: 0.2 ================================================ FILE: fast_autoaugment/confs/efficientnet_b1.yaml ================================================ model: type: efficientnet-b1 condconv_num_expert: 1 # if this is greater than 1(eg. 4), it activates condconv. dataset: imagenet aug: fa_reduced_imagenet cutout: 0 batch: 128 # per gpu epoch: 350 lr: 0.008 # 0.256 for 4096 batch lr_schedule: type: 'efficientnet' warmup: multiplier: 1 epoch: 5 optimizer: type: rmsprop decay: 0.00001 clip: 0 ema: 0.9999 ema_interval: -1 lb_smooth: 0.1 ================================================ FILE: fast_autoaugment/confs/efficientnet_b2.yaml ================================================ model: type: efficientnet-b2 condconv_num_expert: 1 # if this is greater than 1(eg. 4), it activates condconv. dataset: imagenet aug: fa_reduced_imagenet cutout: 0 batch: 128 # per gpu epoch: 350 lr: 0.008 # 0.256 for 4096 batch lr_schedule: type: 'efficientnet' warmup: multiplier: 1 epoch: 5 optimizer: type: rmsprop decay: 0.00001 clip: 0 ema: 0.9999 ema_interval: -1 lb_smooth: 0.1 ================================================ FILE: fast_autoaugment/confs/efficientnet_b3.yaml ================================================ model: type: efficientnet-b3 condconv_num_expert: 1 # if this is greater than 1(eg. 4), it activates condconv. dataset: imagenet aug: fa_reduced_imagenet cutout: 0 batch: 64 # per gpu epoch: 350 lr: 0.004 # 0.256 for 4096 batch lr_schedule: type: 'efficientnet' warmup: multiplier: 1 epoch: 5 optimizer: type: rmsprop decay: 0.00001 clip: 0 ema: 0.9999 ema_interval: -1 lb_smooth: 0.1 ================================================ FILE: fast_autoaugment/confs/efficientnet_b4.yaml ================================================ model: type: efficientnet-b4 condconv_num_expert: 1 # if this is greater than 1(eg. 4), it activates condconv. dataset: imagenet aug: fa_reduced_imagenet cutout: 0 batch: 32 # per gpu epoch: 350 lr: 0.002 # 0.256 for 4096 batch lr_schedule: type: 'efficientnet' warmup: multiplier: 1 epoch: 5 optimizer: type: rmsprop decay: 0.00001 clip: 0 ema: 0.9999 ema_interval: -1 lb_smooth: 0.1 ================================================ FILE: fast_autoaugment/confs/pyramid272_cifar.yaml ================================================ model: type: pyramid depth: 272 alpha: 200 bottleneck: True dataset: cifar10 aug: fa_reduced_cifar10 cutout: 16 batch: 64 epoch: 1800 lr: 0.05 lr_schedule: type: 'cosine' warmup: multiplier: 1 epoch: 5 optimizer: type: sgd nesterov: True decay: 0.00005 ema: 0 ================================================ FILE: fast_autoaugment/confs/resnet200.yaml ================================================ model: type: resnet200 dataset: imagenet aug: fa_reduced_imagenet cutout: 0 batch: 64 epoch: 270 lr: 0.025 lr_schedule: type: 'resnet' warmup: multiplier: 1 epoch: 5 optimizer: type: sgd nesterov: True decay: 0.0001 clip: 0 ema: 0 ================================================ FILE: fast_autoaugment/confs/resnet50.yaml ================================================ model: type: resnet50 dataset: imagenet aug: fa_reduced_imagenet cutout: 0 batch: 128 epoch: 270 lr: 0.05 lr_schedule: type: 'resnet' warmup: multiplier: 1 epoch: 5 optimizer: type: sgd nesterov: True decay: 0.0001 clip: 0 ema: 0 ================================================ FILE: fast_autoaugment/confs/resnet50_mixup.yaml ================================================ model: type: resnet50 dataset: imagenet aug: fa_reduced_imagenet cutout: 0 batch: 128 epoch: 270 lr: 0.05 lr_schedule: type: 'resnet' warmup: multiplier: 1 epoch: 5 optimizer: type: sgd nesterov: True decay: 0.0001 clip: 0 ema: 0 #lb_smooth: 0.1 mixup: 0.2 ================================================ FILE: fast_autoaugment/confs/shake26_2x112d_cifar.yaml ================================================ model: type: shakeshake26_2x112d dataset: cifar10 aug: fa_reduced_cifar10 cutout: 16 batch: 128 epoch: 1800 lr: 0.01 lr_schedule: type: 'cosine' warmup: multiplier: 1 epoch: 5 optimizer: type: sgd nesterov: True decay: 0.002 ema: 0 ================================================ FILE: fast_autoaugment/confs/shake26_2x32d_cifar.yaml ================================================ model: type: shakeshake26_2x32d dataset: cifar10 aug: fa_reduced_cifar10 cutout: 16 batch: 128 epoch: 1800 lr: 0.01 lr_schedule: type: 'cosine' warmup: multiplier: 1 epoch: 5 optimizer: type: sgd nesterov: True decay: 0.001 ema: 0 ================================================ FILE: fast_autoaugment/confs/shake26_2x96d_cifar.yaml ================================================ model: type: shakeshake26_2x96d dataset: cifar10 aug: fa_reduced_cifar10 cutout: 16 batch: 128 epoch: 1800 lr: 0.01 lr_schedule: type: 'cosine' warmup: multiplier: 1 epoch: 5 optimizer: type: sgd nesterov: True decay: 0.001 ema: 0 ================================================ FILE: fast_autoaugment/confs/wresnet28x10_cifar.yaml ================================================ model: type: wresnet28_10 dataset: cifar10 aug: fa_reduced_cifar10 cutout: 16 batch: 128 epoch: 200 lr: 0.1 lr_schedule: type: 'cosine' warmup: multiplier: 1 epoch: 5 optimizer: type: sgd nesterov: True decay: 0.0005 ema: 0 ================================================ FILE: fast_autoaugment/confs/wresnet28x10_svhn.yaml ================================================ model: type: wresnet28_10 dataset: svhn aug: fa_reduced_svhn cutout: 20 batch: 128 epoch: 200 lr: 0.01 lr_schedule: type: 'cosine' warmup: multiplier: 1 epoch: 5 optimizer: type: sgd nesterov: True decay: 0.0005 ema: 0 ================================================ FILE: fast_autoaugment/confs/wresnet40x2_cifar.yaml ================================================ model: type: wresnet40_2 dataset: cifar10 aug: fa_reduced_cifar10 cutout: 16 batch: 128 epoch: 200 lr: 0.1 lr_schedule: type: 'cosine' warmup: multiplier: 1 epoch: 5 optimizer: type: sgd nesterov: True decay: 0.0002 ema: 0 ================================================ FILE: fast_autoaugment/requirements.txt ================================================ git+https://github.com/wbaek/theconf@de32022f8c0651a043dc812d17194cdfd62066e8 git+https://github.com/ildoonet/pytorch-gradual-warmup-lr.git@08f7d5e git+https://github.com/ildoonet/pystopwatch2.git git+https://github.com/hyperopt/hyperopt.git pretrainedmodels tqdm tensorboardx sklearn ray matplotlib psutil requests ================================================ FILE: madrys.py ================================================ import torch import torch.nn as nn import torch.nn.functional as F import models from torch.autograd import Variable if torch.cuda.is_available(): device = torch.device('cuda') else: device = torch.device('cpu') class MadrysLoss(nn.Module): def __init__(self, step_size=0.007, epsilon=0.031, perturb_steps=10, distance='l_inf', cutmix=False): super(MadrysLoss, self).__init__() self.step_size = step_size self.epsilon = epsilon self.perturb_steps = perturb_steps self.distance = distance self.cross_entropy = models.CutMixCrossEntropyLoss() if cutmix else torch.nn.CrossEntropyLoss() def forward(self, model, x_natural, y, optimizer): model.eval() for param in model.parameters(): param.requires_grad = False # generate adversarial example x_adv = x_natural.clone() + self.step_size * torch.randn(x_natural.shape).to(device) if self.distance == 'l_inf': for _ in range(self.perturb_steps): x_adv.requires_grad_() loss_ce = self.cross_entropy(model(x_adv), y) grad = torch.autograd.grad(loss_ce, [x_adv])[0] x_adv = x_adv.detach() + self.step_size * torch.sign(grad.detach()) x_adv = torch.min(torch.max(x_adv, x_natural - self.epsilon), x_natural + self.epsilon) x_adv = torch.clamp(x_adv, 0.0, 1.0) else: x_adv = torch.clamp(x_adv, 0.0, 1.0) for param in model.parameters(): param.requires_grad = True model.train() # x_adv = Variable(x_adv, requires_grad=False) optimizer.zero_grad() logits = model(x_adv) loss = self.cross_entropy(logits, y) return logits, loss ================================================ FILE: main.py ================================================ import argparse import datetime import os import shutil import time import numpy as np import dataset import mlconfig import torch import util import madrys import models from evaluator import Evaluator from trainer import Trainer mlconfig.register(madrys.MadrysLoss) # General Options parser = argparse.ArgumentParser(description='ClasswiseNoise') parser.add_argument('--seed', type=int, default=0, help='seed') parser.add_argument('--version', type=str, default="resnet18") parser.add_argument('--exp_name', type=str, default="test_exp") parser.add_argument('--config_path', type=str, default='configs/cifar10') parser.add_argument('--load_model', action='store_true', default=False) parser.add_argument('--data_parallel', action='store_true', default=False) parser.add_argument('--train', action='store_true', default=False) parser.add_argument('--save_frequency', default=-1, type=int) # Datasets Options parser.add_argument('--train_face', action='store_true', default=False) parser.add_argument('--train_portion', default=1.0, type=float) parser.add_argument('--train_batch_size', default=128, type=int, help='perturb step size') parser.add_argument('--eval_batch_size', default=256, type=int, help='perturb step size') parser.add_argument('--num_of_workers', default=8, type=int, help='workers for loader') parser.add_argument('--train_data_type', type=str, default='CIFAR10') parser.add_argument('--test_data_type', type=str, default='CIFAR10') parser.add_argument('--train_data_path', type=str, default='../datasets') parser.add_argument('--test_data_path', type=str, default='../datasets') parser.add_argument('--perturb_type', default='classwise', type=str, choices=['classwise', 'samplewise'], help='Perturb type') parser.add_argument('--patch_location', default='center', type=str, choices=['center', 'random'], help='Location of the noise') parser.add_argument('--poison_rate', default=1.0, type=float) parser.add_argument('--perturb_tensor_filepath', default=None, type=str) args = parser.parse_args() # Set up Experiments if args.exp_name == '': args.exp_name = 'exp_' + datetime.datetime.now() exp_path = os.path.join(args.exp_name, args.version) log_file_path = os.path.join(exp_path, args.version) checkpoint_path = os.path.join(exp_path, 'checkpoints') checkpoint_path_file = os.path.join(checkpoint_path, args.version) util.build_dirs(exp_path) util.build_dirs(checkpoint_path) logger = util.setup_logger(name=args.version, log_file=log_file_path + ".log") # CUDA Options logger.info("PyTorch Version: %s" % (torch.__version__)) if torch.cuda.is_available(): torch.cuda.manual_seed(args.seed) torch.backends.cudnn.enabled = True torch.backends.cudnn.benchmark = True device = torch.device('cuda') device_list = [torch.cuda.get_device_name(i) for i in range(0, torch.cuda.device_count())] logger.info("GPU List: %s" % (device_list)) else: device = torch.device('cpu') # Load Exp Configs config_file = os.path.join(args.config_path, args.version)+'.yaml' config = mlconfig.load(config_file) config.set_immutable() for key in config: logger.info("%s: %s" % (key, config[key])) shutil.copyfile(config_file, os.path.join(exp_path, args.version+'.yaml')) def train(starting_epoch, model, optimizer, scheduler, criterion, trainer, evaluator, ENV, data_loader): for epoch in range(starting_epoch, config.epochs): logger.info("") logger.info("="*20 + "Training Epoch %d" % (epoch) + "="*20) # Train ENV['global_step'] = trainer.train(epoch, model, criterion, optimizer) ENV['train_history'].append(trainer.acc_meters.avg*100) scheduler.step() # Eval logger.info("="*20 + "Eval Epoch %d" % (epoch) + "="*20) is_best = False if not args.train_face: evaluator.eval(epoch, model) payload = ('Eval Loss:%.4f\tEval acc: %.2f' % (evaluator.loss_meters.avg, evaluator.acc_meters.avg*100)) logger.info(payload) ENV['eval_history'].append(evaluator.acc_meters.avg*100) ENV['curren_acc'] = evaluator.acc_meters.avg*100 ENV['cm_history'].append(evaluator.confusion_matrix.cpu().numpy().tolist()) # Reset Stats trainer._reset_stats() evaluator._reset_stats() else: pass # model.eval() # model.module.classify = True # evaluator.eval(epoch, model) # payload = ('Eval Loss:%.4f\tEval acc: %.2f' % (evaluator.loss_meters.avg, evaluator.acc_meters.avg*100)) # logger.info(payload) # model.classify = False # identity_list = lfw_test.get_lfw_list('lfw_test_pair.txt') # img_paths = [os.path.join('../datasets/lfw-112x112', each) for each in identity_list] # eval_acc = lfw_test.lfw_test(model, img_paths, identity_list, 'lfw_test_pair.txt', args.eval_batch_size, logger=logger) # ENV['curren_acc'] = eval_acc # ENV['best_acc'] = max(ENV['best_acc'], eval_acc) # ENV['eval_history'].append(eval_acc) # # Reset Stats # trainer._reset_stats() # evaluator._reset_stats() # Save Model target_model = model.module if args.data_parallel else model util.save_model(ENV=ENV, epoch=epoch, model=target_model, optimizer=optimizer, scheduler=scheduler, is_best=is_best, filename=checkpoint_path_file) logger.info('Model Saved at %s', checkpoint_path_file) if args.save_frequency > 0 and epoch % args.save_frequency == 0: filename = checkpoint_path_file + '_epoch%d' % (epoch) util.save_model(ENV=ENV, epoch=epoch, model=target_model, optimizer=optimizer, scheduler=scheduler, filename=filename) logger.info('Model Saved at %s', filename) return def main(): model = config.model().to(device) datasets_generator = config.dataset(train_data_type=args.train_data_type, train_data_path=args.train_data_path, test_data_type=args.test_data_type, test_data_path=args.test_data_path, train_batch_size=args.train_batch_size, eval_batch_size=args.eval_batch_size, num_of_workers=args.num_of_workers, poison_rate=args.poison_rate, perturb_type=args.perturb_type, patch_location=args.patch_location, perturb_tensor_filepath=args.perturb_tensor_filepath, seed=args.seed) logger.info('Training Dataset: %s' % str(datasets_generator.datasets['train_dataset'])) logger.info('Test Dataset: %s' % str(datasets_generator.datasets['test_dataset'])) if 'Poison' in args.train_data_type: with open(os.path.join(exp_path, 'poison_targets.npy'), 'wb') as f: if not (isinstance(datasets_generator.datasets['train_dataset'], dataset.MixUp) or isinstance(datasets_generator.datasets['train_dataset'], dataset.CutMix)): poison_targets = np.array(datasets_generator.datasets['train_dataset'].poison_samples_idx) np.save(f, poison_targets) logger.info(poison_targets) logger.info('Poisoned: %d/%d' % (len(poison_targets), len(datasets_generator.datasets['train_dataset']))) logger.info('Poisoned samples idx saved at %s' % (os.path.join(exp_path, 'poison_targets'))) logger.info('Poisoned Class %s' % (str(datasets_generator.datasets['train_dataset'].poison_class))) if args.train_portion == 1.0: data_loader = datasets_generator.getDataLoader() train_target = 'train_dataset' else: train_target = 'train_subset' data_loader = datasets_generator._split_validation_set(args.train_portion, train_shuffle=True, train_drop_last=True) logger.info("param size = %fMB", util.count_parameters_in_MB(model)) optimizer = config.optimizer(model.parameters()) scheduler = config.scheduler(optimizer) criterion = config.criterion() trainer = Trainer(criterion, data_loader, logger, config, target=train_target) evaluator = Evaluator(data_loader, logger, config) starting_epoch = 0 ENV = {'global_step': 0, 'best_acc': 0.0, 'curren_acc': 0.0, 'best_pgd_acc': 0.0, 'train_history': [], 'eval_history': [], 'pgd_eval_history': [], 'genotype_list': [], 'cm_history': []} if args.load_model: checkpoint = util.load_model(filename=checkpoint_path_file, model=model, optimizer=optimizer, alpha_optimizer=None, scheduler=scheduler) starting_epoch = checkpoint['epoch'] ENV = checkpoint['ENV'] trainer.global_step = ENV['global_step'] logger.info("File %s loaded!" % (checkpoint_path_file)) if args.data_parallel: model = torch.nn.DataParallel(model) if args.train: train(starting_epoch, model, optimizer, scheduler, criterion, trainer, evaluator, ENV, data_loader) if __name__ == '__main__': for arg in vars(args): logger.info("%s: %s" % (arg, getattr(args, arg))) start = time.time() main() end = time.time() cost = (end - start) / 86400 payload = "Running Cost %.2f Days \n" % cost logger.info(payload) ================================================ FILE: models/DenseNet.py ================================================ ''' https://github.com/kuangliu/pytorch-cifar DenseNet in PyTorch. ''' import math import torch import torch.nn as nn import torch.nn.functional as F class Bottleneck(nn.Module): def __init__(self, in_planes, growth_rate): super(Bottleneck, self).__init__() self.bn1 = nn.BatchNorm2d(in_planes) self.conv1 = nn.Conv2d(in_planes, 4*growth_rate, kernel_size=1, bias=False) self.bn2 = nn.BatchNorm2d(4*growth_rate) self.conv2 = nn.Conv2d(4*growth_rate, growth_rate, kernel_size=3, padding=1, bias=False) def forward(self, x): out = self.conv1(F.relu(self.bn1(x))) out = self.conv2(F.relu(self.bn2(out))) out = torch.cat([out, x], 1) return out class Transition(nn.Module): def __init__(self, in_planes, out_planes): super(Transition, self).__init__() self.bn = nn.BatchNorm2d(in_planes) self.conv = nn.Conv2d(in_planes, out_planes, kernel_size=1, bias=False) def forward(self, x): out = self.conv(F.relu(self.bn(x))) out = F.avg_pool2d(out, 2) return out class DenseNet(nn.Module): def __init__(self, block, nblocks, growth_rate=12, reduction=0.5, num_classes=10): super(DenseNet, self).__init__() self.growth_rate = growth_rate num_planes = 2*growth_rate self.conv1 = nn.Conv2d(3, num_planes, kernel_size=3, padding=1, bias=False) self.dense1 = self._make_dense_layers(block, num_planes, nblocks[0]) num_planes += nblocks[0]*growth_rate out_planes = int(math.floor(num_planes*reduction)) self.trans1 = Transition(num_planes, out_planes) num_planes = out_planes self.dense2 = self._make_dense_layers(block, num_planes, nblocks[1]) num_planes += nblocks[1]*growth_rate out_planes = int(math.floor(num_planes*reduction)) self.trans2 = Transition(num_planes, out_planes) num_planes = out_planes self.dense3 = self._make_dense_layers(block, num_planes, nblocks[2]) num_planes += nblocks[2]*growth_rate out_planes = int(math.floor(num_planes*reduction)) self.trans3 = Transition(num_planes, out_planes) num_planes = out_planes self.dense4 = self._make_dense_layers(block, num_planes, nblocks[3]) num_planes += nblocks[3]*growth_rate self.bn = nn.BatchNorm2d(num_planes) self.linear = nn.Linear(num_planes, num_classes) def _make_dense_layers(self, block, in_planes, nblock): layers = [] for i in range(nblock): layers.append(block(in_planes, self.growth_rate)) in_planes += self.growth_rate return nn.Sequential(*layers) def forward(self, x): out = self.conv1(x) out = self.trans1(self.dense1(out)) out = self.trans2(self.dense2(out)) out = self.trans3(self.dense3(out)) out = self.dense4(out) out = F.avg_pool2d(F.relu(self.bn(out)), 4) out = out.view(out.size(0), -1) out = self.linear(out) return out def DenseNet121(num_classes=10): return DenseNet(Bottleneck, [6, 12, 24, 16], growth_rate=32, num_classes=num_classes) def DenseNet169(num_classes=10): return DenseNet(Bottleneck, [6, 12, 32, 32], growth_rate=32, num_classes=num_classes) def DenseNet201(num_classes=10): return DenseNet(Bottleneck, [6, 12, 48, 32], growth_rate=32, num_classes=num_classes) def DenseNet161(num_classes=10): return DenseNet(Bottleneck, [6, 12, 36, 24], growth_rate=48, num_classes=num_classes) def densenet_cifar(): return DenseNet(Bottleneck, [6, 12, 24, 16], growth_rate=12) ================================================ FILE: models/ResNet.py ================================================ import torch import torch.nn as nn import torch.nn.functional as F import math class BasicBlock(nn.Module): expansion = 1 def __init__(self, in_planes, planes, stride=1): super(BasicBlock, self).__init__() self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(planes) self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(planes) self.shortcut = nn.Sequential() if stride != 1 or in_planes != self.expansion * planes: self.shortcut = nn.Sequential( nn.Conv2d(in_planes, self.expansion * planes, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(self.expansion * planes) ) def forward(self, x): out = F.relu(self.bn1(self.conv1(x))) out = self.bn2(self.conv2(out)) out += self.shortcut(x) out = F.relu(out) return out class Bottleneck(nn.Module): expansion = 4 def __init__(self, in_planes, planes, stride=1): super(Bottleneck, self).__init__() self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=1, bias=False) self.bn1 = nn.BatchNorm2d(planes) self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(planes) self.conv3 = nn.Conv2d(planes, self.expansion * planes, kernel_size=1, bias=False) self.bn3 = nn.BatchNorm2d(self.expansion * planes) self.shortcut = nn.Sequential() if stride != 1 or in_planes != self.expansion * planes: self.shortcut = nn.Sequential( nn.Conv2d(in_planes, self.expansion * planes, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(self.expansion * planes) ) def forward(self, x): out = F.relu(self.bn1(self.conv1(x))) out = F.relu(self.bn2(self.conv2(out))) out = self.bn3(self.conv3(out)) out += self.shortcut(x) out = F.relu(out) return out class ResNet(nn.Module): def __init__(self, block, num_blocks, num_classes=10): super(ResNet, self).__init__() self.in_planes = 64 self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(64) self.layer1 = self._make_layer(block, 64, num_blocks[0], stride=1) self.layer2 = self._make_layer(block, 128, num_blocks[1], stride=2) self.layer3 = self._make_layer(block, 256, num_blocks[2], stride=2) self.layer4 = self._make_layer(block, 512, num_blocks[3], stride=2) self.linear = nn.Linear(512 * block.expansion, num_classes) def _make_layer(self, block, planes, num_blocks, stride): strides = [stride] + [1] * (num_blocks - 1) layers = [] for stride in strides: layers.append(block(self.in_planes, planes, stride)) self.in_planes = planes * block.expansion return nn.Sequential(*layers) def forward(self, x): out = F.relu(self.bn1(self.conv1(x))) out = self.layer1(out) out = self.layer2(out) out = self.layer3(out) out = self.layer4(out) out = F.avg_pool2d(out, 4) out = out.view(out.size(0), -1) out = self.linear(out) return out def ResNet18(num_classes=10): return ResNet(BasicBlock, [2, 2, 2, 2], num_classes=num_classes) def ResNet34(num_classes=10): return ResNet(BasicBlock, [3, 4, 6, 3], num_classes=num_classes) def ResNet50(num_classes=10): return ResNet(Bottleneck, [3, 4, 6, 3], num_classes=num_classes) def ResNet101(num_classes=10): return ResNet(Bottleneck, [3, 4, 23, 3], num_classes=num_classes) def ResNet152(num_classes=10): return ResNet(Bottleneck, [3, 8, 36, 3], num_classes=num_classes) def test(): net = ResNet18() y = net(torch.randn(1, 3, 32, 32)) print(y.size()) class BasicConv2d(nn.Module): def __init__(self, in_planes, out_planes, kernel_size, stride, padding=0): super().__init__() self.conv = nn.Conv2d( in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=padding, bias=False ) self.bn = nn.BatchNorm2d( out_planes, eps=0.001, momentum=0.1, affine=True ) self.relu = nn.ReLU(inplace=False) def forward(self, x): x = self.conv(x) x = self.bn(x) x = self.relu(x) return x class Block35(nn.Module): def __init__(self, scale=1.0): super().__init__() self.scale = scale self.branch0 = BasicConv2d(256, 32, kernel_size=1, stride=1) self.branch1 = nn.Sequential( BasicConv2d(256, 32, kernel_size=1, stride=1), BasicConv2d(32, 32, kernel_size=3, stride=1, padding=1) ) self.branch2 = nn.Sequential( BasicConv2d(256, 32, kernel_size=1, stride=1), BasicConv2d(32, 32, kernel_size=3, stride=1, padding=1), BasicConv2d(32, 32, kernel_size=3, stride=1, padding=1) ) self.conv2d = nn.Conv2d(96, 256, kernel_size=1, stride=1) self.relu = nn.ReLU(inplace=False) def forward(self, x): x0 = self.branch0(x) x1 = self.branch1(x) x2 = self.branch2(x) out = torch.cat((x0, x1, x2), 1) out = self.conv2d(out) out = out * self.scale + x out = self.relu(out) return out class Block17(nn.Module): def __init__(self, scale=1.0): super().__init__() self.scale = scale self.branch0 = BasicConv2d(896, 128, kernel_size=1, stride=1) self.branch1 = nn.Sequential( BasicConv2d(896, 128, kernel_size=1, stride=1), BasicConv2d(128, 128, kernel_size=(1, 7), stride=1, padding=(0, 3)), BasicConv2d(128, 128, kernel_size=(7, 1), stride=1, padding=(3, 0)) ) self.conv2d = nn.Conv2d(256, 896, kernel_size=1, stride=1) self.relu = nn.ReLU(inplace=False) def forward(self, x): x0 = self.branch0(x) x1 = self.branch1(x) out = torch.cat((x0, x1), 1) out = self.conv2d(out) out = out * self.scale + x out = self.relu(out) return out class Block8(nn.Module): def __init__(self, scale=1.0, noReLU=False): super().__init__() self.scale = scale self.noReLU = noReLU self.branch0 = BasicConv2d(1792, 192, kernel_size=1, stride=1) self.branch1 = nn.Sequential( BasicConv2d(1792, 192, kernel_size=1, stride=1), BasicConv2d(192, 192, kernel_size=(1, 3), stride=1, padding=(0, 1)), BasicConv2d(192, 192, kernel_size=(3, 1), stride=1, padding=(1, 0)) ) self.conv2d = nn.Conv2d(384, 1792, kernel_size=1, stride=1) if not self.noReLU: self.relu = nn.ReLU(inplace=False) def forward(self, x): x0 = self.branch0(x) x1 = self.branch1(x) out = torch.cat((x0, x1), 1) out = self.conv2d(out) out = out * self.scale + x if not self.noReLU: out = self.relu(out) return out class Mixed_6a(nn.Module): def __init__(self): super().__init__() self.branch0 = BasicConv2d(256, 384, kernel_size=3, stride=2) self.branch1 = nn.Sequential( BasicConv2d(256, 192, kernel_size=1, stride=1), BasicConv2d(192, 192, kernel_size=3, stride=1, padding=1), BasicConv2d(192, 256, kernel_size=3, stride=2) ) self.branch2 = nn.MaxPool2d(3, stride=2) def forward(self, x): x0 = self.branch0(x) x1 = self.branch1(x) x2 = self.branch2(x) out = torch.cat((x0, x1, x2), 1) return out class Mixed_7a(nn.Module): def __init__(self): super().__init__() self.branch0 = nn.Sequential( BasicConv2d(896, 256, kernel_size=1, stride=1), BasicConv2d(256, 384, kernel_size=3, stride=2) ) self.branch1 = nn.Sequential( BasicConv2d(896, 256, kernel_size=1, stride=1), BasicConv2d(256, 256, kernel_size=3, stride=2) ) self.branch2 = nn.Sequential( BasicConv2d(896, 256, kernel_size=1, stride=1), BasicConv2d(256, 256, kernel_size=3, stride=1, padding=1), BasicConv2d(256, 256, kernel_size=3, stride=2) ) self.branch3 = nn.MaxPool2d(3, stride=2) def forward(self, x): x0 = self.branch0(x) x1 = self.branch1(x) x2 = self.branch2(x) x3 = self.branch3(x) out = torch.cat((x0, x1, x2, x3), 1) return out class InceptionResnetV1(nn.Module): def __init__(self, num_classes=10575, face_features=512, dropout_prob=0.6): super().__init__() self.num_classes = num_classes # Define layers self.conv2d_1a = BasicConv2d(3, 32, kernel_size=3, stride=2) self.conv2d_2a = BasicConv2d(32, 32, kernel_size=3, stride=1) self.conv2d_2b = BasicConv2d(32, 64, kernel_size=3, stride=1, padding=1) self.maxpool_3a = nn.MaxPool2d(3, stride=2) self.conv2d_3b = BasicConv2d(64, 80, kernel_size=1, stride=1) self.conv2d_4a = BasicConv2d(80, 192, kernel_size=3, stride=1) self.conv2d_4b = BasicConv2d(192, 256, kernel_size=3, stride=2) self.repeat_1 = nn.Sequential( Block35(scale=0.17), Block35(scale=0.17), Block35(scale=0.17), Block35(scale=0.17), Block35(scale=0.17), ) self.mixed_6a = Mixed_6a() self.repeat_2 = nn.Sequential( Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), ) self.mixed_7a = Mixed_7a() self.repeat_3 = nn.Sequential( Block8(scale=0.20), Block8(scale=0.20), Block8(scale=0.20), Block8(scale=0.20), Block8(scale=0.20), ) self.block8 = Block8(noReLU=True) self.avgpool_1a = nn.AdaptiveAvgPool2d(1) self.dropout = nn.Dropout(dropout_prob) self.last_linear = nn.Linear(1792, face_features, bias=False) self.last_bn = nn.BatchNorm1d(512, eps=0.001, momentum=0.1, affine=True) self.fc = nn.Linear(512, self.num_classes) def forward(self, x): x = self.conv2d_1a(x) x = self.conv2d_2a(x) x = self.conv2d_2b(x) x = self.maxpool_3a(x) x = self.conv2d_3b(x) x = self.conv2d_4a(x) x = self.conv2d_4b(x) x = self.repeat_1(x) x = self.mixed_6a(x) x = self.repeat_2(x) x = self.mixed_7a(x) x = self.repeat_3(x) x = self.block8(x) x = self.avgpool_1a(x) x = self.dropout(x) x = self.last_linear(x.view(x.shape[0], -1)) x = self.last_bn(x) if self.training: return self.fc(x) else: return F.normalize(x, p=2, dim=1) ================================================ FILE: models/ToyModel.py ================================================ import torch.nn as nn import torch.nn.functional as F class ConvBrunch(nn.Module): def __init__(self, in_planes, out_planes, kernel_size=3): super(ConvBrunch, self).__init__() padding = (kernel_size - 1) // 2 self.out_conv = nn.Sequential( nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, padding=padding), nn.BatchNorm2d(out_planes), nn.ReLU()) def forward(self, x): return self.out_conv(x) class ToyModel(nn.Module): def __init__(self, num_classes=10): super(ToyModel, self).__init__() self.block1 = nn.Sequential( ConvBrunch(3, 64, 3), nn.MaxPool2d(kernel_size=2, stride=2), ConvBrunch(64, 128, 3), nn.MaxPool2d(kernel_size=2, stride=2), ConvBrunch(128, 256, 3), nn.MaxPool2d(kernel_size=2, stride=2)) self.global_avg_pool = nn.AdaptiveAvgPool2d((1, 1)) self.fc = nn.Linear(256, num_classes) def forward(self, x): x = self.block1(x) x = self.global_avg_pool(x) x = x.view(-1, 256) x = self.fc(x) return x ================================================ FILE: models/__init__.py ================================================ import mlconfig import torch import torch.nn as nn import torchvision from . import DenseNet, ResNet, ToyModel, inception_resnet_v1 mlconfig.register(torch.optim.SGD) mlconfig.register(torch.optim.Adam) mlconfig.register(torch.optim.lr_scheduler.MultiStepLR) mlconfig.register(torch.optim.lr_scheduler.CosineAnnealingLR) mlconfig.register(torch.optim.lr_scheduler.StepLR) mlconfig.register(torch.optim.lr_scheduler.ExponentialLR) mlconfig.register(torch.nn.CrossEntropyLoss) # Models mlconfig.register(ResNet.ResNet) mlconfig.register(ResNet.ResNet18) mlconfig.register(ResNet.ResNet34) mlconfig.register(ResNet.ResNet50) mlconfig.register(ResNet.ResNet101) mlconfig.register(ResNet.ResNet152) mlconfig.register(ToyModel.ToyModel) mlconfig.register(DenseNet.DenseNet121) mlconfig.register(inception_resnet_v1.InceptionResnetV1) # torchvision models mlconfig.register(torchvision.models.resnet18) mlconfig.register(torchvision.models.resnet50) mlconfig.register(torchvision.models.densenet121) # CUDA Options if torch.cuda.is_available(): device = torch.device('cuda') else: device = torch.device('cpu') @mlconfig.register class FocalLoss(nn.Module): def __init__(self, gamma=0, eps=1e-7): super(FocalLoss, self).__init__() self.gamma = gamma self.eps = eps self.ce = torch.nn.CrossEntropyLoss() def forward(self, input, target): logp = self.ce(input, target) p = torch.exp(-logp) loss = (1 - p) ** self.gamma * logp return loss.mean() def cross_entropy(input, target, size_average=True): """ Cross entropy that accepts soft targets Args: pred: predictions for neural network targets: targets, can be soft size_average: if false, sum is returned instead of mean Examples:: input = torch.FloatTensor([[1.1, 2.8, 1.3], [1.1, 2.1, 4.8]]) input = torch.autograd.Variable(out, requires_grad=True) target = torch.FloatTensor([[0.05, 0.9, 0.05], [0.05, 0.05, 0.9]]) target = torch.autograd.Variable(y1) loss = cross_entropy(input, target) loss.backward() """ logsoftmax = torch.nn.LogSoftmax(dim=1) if size_average: return torch.mean(torch.sum(-target * logsoftmax(input), dim=1)) else: return torch.sum(torch.sum(-target * logsoftmax(input), dim=1)) @mlconfig.register class CutMixCrossEntropyLoss(torch.nn.Module): def __init__(self, size_average=True): super().__init__() self.size_average = size_average def forward(self, input, target): if len(target.size()) == 1: target = torch.nn.functional.one_hot(target, num_classes=input.size(-1)) target = target.float().cuda() return cross_entropy(input, target, self.size_average) ================================================ FILE: models/download.py ================================================ import hashlib import os import shutil import sys import tempfile from urllib.request import urlopen, Request try: from tqdm.auto import tqdm # automatically select proper tqdm submodule if available except ImportError: try: from tqdm import tqdm except ImportError: # fake tqdm if it's not installed class tqdm(object): # type: ignore def __init__(self, total=None, disable=False, unit=None, unit_scale=None, unit_divisor=None): self.total = total self.disable = disable self.n = 0 # ignore unit, unit_scale, unit_divisor; they're just for real tqdm def update(self, n): if self.disable: return self.n += n if self.total is None: sys.stderr.write("\r{0:.1f} bytes".format(self.n)) else: sys.stderr.write("\r{0:.1f}%".format(100 * self.n / float(self.total))) sys.stderr.flush() def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): if self.disable: return sys.stderr.write('\n') def download_url_to_file(url, dst, hash_prefix=None, progress=True): r"""Download object at the given URL to a local path. Args: url (string): URL of the object to download dst (string): Full path where object will be saved, e.g. `/tmp/temporary_file` hash_prefix (string, optional): If not None, the SHA256 downloaded file should start with `hash_prefix`. Default: None progress (bool, optional): whether or not to display a progress bar to stderr Default: True Example: >>> torch.hub.download_url_to_file('https://s3.amazonaws.com/pytorch/models/resnet18-5c106cde.pth', '/tmp/temporary_file') """ file_size = None # We use a different API for python2 since urllib(2) doesn't recognize the CA # certificates in older Python req = Request(url, headers={"User-Agent": "torch.hub"}) u = urlopen(req) meta = u.info() if hasattr(meta, 'getheaders'): content_length = meta.getheaders("Content-Length") else: content_length = meta.get_all("Content-Length") if content_length is not None and len(content_length) > 0: file_size = int(content_length[0]) # We deliberately save it in a temp file and move it after # download is complete. This prevents a local working checkpoint # being overridden by a broken download. dst = os.path.expanduser(dst) dst_dir = os.path.dirname(dst) f = tempfile.NamedTemporaryFile(delete=False, dir=dst_dir) try: if hash_prefix is not None: sha256 = hashlib.sha256() with tqdm(total=file_size, disable=not progress, unit='B', unit_scale=True, unit_divisor=1024) as pbar: while True: buffer = u.read(8192) if len(buffer) == 0: break f.write(buffer) if hash_prefix is not None: sha256.update(buffer) pbar.update(len(buffer)) f.close() if hash_prefix is not None: digest = sha256.hexdigest() if digest[:len(hash_prefix)] != hash_prefix: raise RuntimeError('invalid hash value (expected "{}", got "{}")' .format(hash_prefix, digest)) shutil.move(f.name, dst) finally: f.close() if os.path.exists(f.name): os.remove(f.name) ================================================ FILE: models/inception_resnet_v1.py ================================================ import torch from torch import nn from torch.nn import functional as F from .download import download_url_to_file if torch.cuda.is_available(): device = torch.device('cuda') else: device = torch.device('cpu') class BasicConv2d(nn.Module): def __init__(self, in_planes, out_planes, kernel_size, stride, padding=0): super().__init__() self.conv = nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=padding, bias=False) self.bn = nn.BatchNorm2d(out_planes, eps=0.001, momentum=0.1, affine=True) self.relu = nn.ReLU(inplace=False) def forward(self, x): x = self.conv(x) x = self.bn(x) x = self.relu(x) return x class Block35(nn.Module): def __init__(self, scale=1.0): super().__init__() self.scale = scale self.branch0 = BasicConv2d(256, 32, kernel_size=1, stride=1) self.branch1 = nn.Sequential( BasicConv2d(256, 32, kernel_size=1, stride=1), BasicConv2d(32, 32, kernel_size=3, stride=1, padding=1) ) self.branch2 = nn.Sequential( BasicConv2d(256, 32, kernel_size=1, stride=1), BasicConv2d(32, 32, kernel_size=3, stride=1, padding=1), BasicConv2d(32, 32, kernel_size=3, stride=1, padding=1) ) self.conv2d = nn.Conv2d(96, 256, kernel_size=1, stride=1) self.relu = nn.ReLU(inplace=False) def forward(self, x): x0 = self.branch0(x) x1 = self.branch1(x) x2 = self.branch2(x) out = torch.cat((x0, x1, x2), 1) out = self.conv2d(out) out = out * self.scale + x out = self.relu(out) return out class Block17(nn.Module): def __init__(self, scale=1.0): super().__init__() self.scale = scale self.branch0 = BasicConv2d(896, 128, kernel_size=1, stride=1) self.branch1 = nn.Sequential( BasicConv2d(896, 128, kernel_size=1, stride=1), BasicConv2d(128, 128, kernel_size=(1, 7), stride=1, padding=(0, 3)), BasicConv2d(128, 128, kernel_size=(7, 1), stride=1, padding=(3, 0)) ) self.conv2d = nn.Conv2d(256, 896, kernel_size=1, stride=1) self.relu = nn.ReLU(inplace=False) def forward(self, x): x0 = self.branch0(x) x1 = self.branch1(x) out = torch.cat((x0, x1), 1) out = self.conv2d(out) out = out * self.scale + x out = self.relu(out) return out class Block8(nn.Module): def __init__(self, scale=1.0, noReLU=False): super().__init__() self.scale = scale self.noReLU = noReLU self.branch0 = BasicConv2d(1792, 192, kernel_size=1, stride=1) self.branch1 = nn.Sequential( BasicConv2d(1792, 192, kernel_size=1, stride=1), BasicConv2d(192, 192, kernel_size=(1, 3), stride=1, padding=(0, 1)), BasicConv2d(192, 192, kernel_size=(3, 1), stride=1, padding=(1, 0)) ) self.conv2d = nn.Conv2d(384, 1792, kernel_size=1, stride=1) if not self.noReLU: self.relu = nn.ReLU(inplace=False) def forward(self, x): x0 = self.branch0(x) x1 = self.branch1(x) out = torch.cat((x0, x1), 1) out = self.conv2d(out) out = out * self.scale + x if not self.noReLU: out = self.relu(out) return out class Mixed_6a(nn.Module): def __init__(self): super().__init__() self.branch0 = BasicConv2d(256, 384, kernel_size=3, stride=2) self.branch1 = nn.Sequential( BasicConv2d(256, 192, kernel_size=1, stride=1), BasicConv2d(192, 192, kernel_size=3, stride=1, padding=1), BasicConv2d(192, 256, kernel_size=3, stride=2) ) self.branch2 = nn.MaxPool2d(3, stride=2) def forward(self, x): x0 = self.branch0(x) x1 = self.branch1(x) x2 = self.branch2(x) out = torch.cat((x0, x1, x2), 1) return out class Mixed_7a(nn.Module): def __init__(self): super().__init__() self.branch0 = nn.Sequential( BasicConv2d(896, 256, kernel_size=1, stride=1), BasicConv2d(256, 384, kernel_size=3, stride=2) ) self.branch1 = nn.Sequential( BasicConv2d(896, 256, kernel_size=1, stride=1), BasicConv2d(256, 256, kernel_size=3, stride=2) ) self.branch2 = nn.Sequential( BasicConv2d(896, 256, kernel_size=1, stride=1), BasicConv2d(256, 256, kernel_size=3, stride=1, padding=1), BasicConv2d(256, 256, kernel_size=3, stride=2) ) self.branch3 = nn.MaxPool2d(3, stride=2) def forward(self, x): x0 = self.branch0(x) x1 = self.branch1(x) x2 = self.branch2(x) x3 = self.branch3(x) out = torch.cat((x0, x1, x2, x3), 1) return out class InceptionResnetV1(nn.Module): """Inception Resnet V1 model with optional loading of pretrained weights. Model parameters can be loaded based on pretraining on the VGGFace2 or CASIA-Webface datasets. Pretrained state_dicts are automatically downloaded on model instantiation if requested and cached in the torch cache. Subsequent instantiations use the cache rather than redownloading. Keyword Arguments: pretrained {str} -- Optional pretraining dataset. Either 'vggface2' or 'casia-webface'. (default: {None}) classify {bool} -- Whether the model should output classification probabilities or feature embeddings. (default: {False}) num_classes {int} -- Number of output classes. If 'pretrained' is set and num_classes not equal to that used for the pretrained model, the final linear layer will be randomly initialized. (default: {None}) dropout_prob {float} -- Dropout probability. (default: {0.6}) """ def __init__(self, pretrained=None, classify=False, num_classes=None, dropout_prob=0.6): super().__init__() # Set simple attributes self.pretrained = pretrained self.classify = classify self.num_classes = num_classes if pretrained == 'vggface2': tmp_classes = 8631 elif pretrained == 'casia-webface': tmp_classes = 10575 elif pretrained is None and self.classify and self.num_classes is None: raise Exception('If "pretrained" is not specified and "classify" is True, "num_classes" must be specified') # Define layers self.conv2d_1a = BasicConv2d(3, 32, kernel_size=3, stride=2) self.conv2d_2a = BasicConv2d(32, 32, kernel_size=3, stride=1) self.conv2d_2b = BasicConv2d(32, 64, kernel_size=3, stride=1, padding=1) self.maxpool_3a = nn.MaxPool2d(3, stride=2) self.conv2d_3b = BasicConv2d(64, 80, kernel_size=1, stride=1) self.conv2d_4a = BasicConv2d(80, 192, kernel_size=3, stride=1) self.conv2d_4b = BasicConv2d(192, 256, kernel_size=3, stride=2) self.repeat_1 = nn.Sequential( Block35(scale=0.17), Block35(scale=0.17), Block35(scale=0.17), Block35(scale=0.17), Block35(scale=0.17), ) self.mixed_6a = Mixed_6a() self.repeat_2 = nn.Sequential( Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), Block17(scale=0.10), ) self.mixed_7a = Mixed_7a() self.repeat_3 = nn.Sequential( Block8(scale=0.20), Block8(scale=0.20), Block8(scale=0.20), Block8(scale=0.20), Block8(scale=0.20), ) self.block8 = Block8(noReLU=True) self.avgpool_1a = nn.AdaptiveAvgPool2d(1) self.dropout = nn.Dropout(dropout_prob) self.last_linear = nn.Linear(1792, 512, bias=False) self.last_bn = nn.BatchNorm1d(512, eps=0.001, momentum=0.1, affine=True) self.logits = nn.Linear(512, self.num_classes) if pretrained is not None: self.logits = nn.Linear(512, tmp_classes) load_weights(self, pretrained) def forward(self, x): """Calculate embeddings or logits given a batch of input image tensors. Arguments: x {torch.tensor} -- Batch of image tensors representing faces. Returns: torch.tensor -- Batch of embedding vectors or multinomial logits. """ x = self.conv2d_1a(x) x = self.conv2d_2a(x) x = self.conv2d_2b(x) x = self.maxpool_3a(x) x = self.conv2d_3b(x) x = self.conv2d_4a(x) x = self.conv2d_4b(x) x = self.repeat_1(x) x = self.mixed_6a(x) x = self.repeat_2(x) x = self.mixed_7a(x) x = self.repeat_3(x) x = self.block8(x) x = self.avgpool_1a(x) x = self.dropout(x) x = self.last_linear(x.view(x.shape[0], -1)) x = self.last_bn(x) if self.training or self.classify: x = self.logits(x) else: x = F.normalize(x, p=2, dim=1) return x def load_weights(mdl, name): """Download pretrained state_dict and load into model. Arguments: mdl {torch.nn.Module} -- Pytorch model. name {str} -- Name of dataset that was used to generate pretrained state_dict. Raises: ValueError: If 'pretrained' not equal to 'vggface2' or 'casia-webface'. """ if name == 'vggface2': path = 'https://github.com/timesler/facenet-pytorch/releases/download/v2.2.9/20180402-114759-vggface2.pt' elif name == 'casia-webface': path = 'https://github.com/timesler/facenet-pytorch/releases/download/v2.2.9/20180408-102900-casia-webface.pt' else: raise ValueError('Pretrained models only exist for "vggface2" and "casia-webface"') model_dir = 'pretrained_checkpoints' os.makedirs(model_dir, exist_ok=True) cached_file = os.path.join(model_dir, os.path.basename(path)) if not os.path.exists(cached_file): download_url_to_file(path, cached_file) state_dict = torch.load(cached_file) mdl.load_state_dict(state_dict) def get_torch_home(): torch_home = os.path.expanduser( os.getenv( 'TORCH_HOME', os.path.join(os.getenv('XDG_CACHE_HOME', '~/.cache'), 'torch') ) ) return torch_home ================================================ FILE: perturbation.py ================================================ import argparse import collections import datetime import os import shutil import time import dataset import mlconfig import toolbox import torch import util import madrys import numpy as np from evaluator import Evaluator from tqdm import tqdm from trainer import Trainer mlconfig.register(madrys.MadrysLoss) # General Options parser = argparse.ArgumentParser(description='ClasswiseNoise') parser.add_argument('--seed', type=int, default=0, help='seed') parser.add_argument('--version', type=str, default="resnet18") parser.add_argument('--exp_name', type=str, default="test_exp") parser.add_argument('--config_path', type=str, default='configs/cifar10') parser.add_argument('--load_model', action='store_true', default=False) parser.add_argument('--data_parallel', action='store_true', default=False) # Datasets Options parser.add_argument('--train_batch_size', default=512, type=int, help='perturb step size') parser.add_argument('--eval_batch_size', default=512, type=int, help='perturb step size') parser.add_argument('--num_of_workers', default=8, type=int, help='workers for loader') parser.add_argument('--train_data_type', type=str, default='CIFAR10') parser.add_argument('--train_data_path', type=str, default='../datasets') parser.add_argument('--test_data_type', type=str, default='CIFAR10') parser.add_argument('--test_data_path', type=str, default='../datasets') # Perturbation Options parser.add_argument('--universal_train_portion', default=0.2, type=float) parser.add_argument('--universal_stop_error', default=0.5, type=float) parser.add_argument('--universal_train_target', default='train_subset', type=str) parser.add_argument('--train_step', default=10, type=int) parser.add_argument('--use_subset', action='store_true', default=False) parser.add_argument('--attack_type', default='min-min', type=str, choices=['min-min', 'min-max', 'random'], help='Attack type') parser.add_argument('--perturb_type', default='classwise', type=str, choices=['classwise', 'samplewise'], help='Perturb type') parser.add_argument('--patch_location', default='center', type=str, choices=['center', 'random'], help='Location of the noise') parser.add_argument('--noise_shape', default=[10, 3, 32, 32], nargs='+', type=int, help='noise shape') parser.add_argument('--epsilon', default=8, type=float, help='perturbation') parser.add_argument('--num_steps', default=1, type=int, help='perturb number of steps') parser.add_argument('--step_size', default=0.8, type=float, help='perturb step size') parser.add_argument('--random_start', action='store_true', default=False) args = parser.parse_args() # Convert Eps args.epsilon = args.epsilon / 255 args.step_size = args.step_size / 255 # Set up Experiments if args.exp_name == '': args.exp_name = 'exp_' + datetime.datetime.now() exp_path = os.path.join(args.exp_name, args.version) log_file_path = os.path.join(exp_path, args.version) checkpoint_path = os.path.join(exp_path, 'checkpoints') checkpoint_path_file = os.path.join(checkpoint_path, args.version) util.build_dirs(exp_path) util.build_dirs(checkpoint_path) logger = util.setup_logger(name=args.version, log_file=log_file_path + ".log") # CUDA Options logger.info("PyTorch Version: %s" % (torch.__version__)) if torch.cuda.is_available(): torch.cuda.manual_seed(args.seed) torch.backends.cudnn.enabled = True torch.backends.cudnn.benchmark = True device = torch.device('cuda') device_list = [torch.cuda.get_device_name(i) for i in range(0, torch.cuda.device_count())] logger.info("GPU List: %s" % (device_list)) else: device = torch.device('cpu') # Load Exp Configs config_file = os.path.join(args.config_path, args.version)+'.yaml' config = mlconfig.load(config_file) config.set_immutable() for key in config: logger.info("%s: %s" % (key, config[key])) shutil.copyfile(config_file, os.path.join(exp_path, args.version+'.yaml')) def train(starting_epoch, model, optimizer, scheduler, criterion, trainer, evaluator, ENV, data_loader): for epoch in range(starting_epoch, config.epochs): logger.info("") logger.info("="*20 + "Training Epoch %d" % (epoch) + "="*20) # Train ENV['global_step'] = trainer.train(epoch, model, criterion, optimizer) ENV['train_history'].append(trainer.acc_meters.avg*100) scheduler.step() # Eval logger.info("="*20 + "Eval Epoch %d" % (epoch) + "="*20) evaluator.eval(epoch, model) payload = ('Eval Loss:%.4f\tEval acc: %.2f' % (evaluator.loss_meters.avg, evaluator.acc_meters.avg*100)) logger.info(payload) ENV['eval_history'].append(evaluator.acc_meters.avg*100) ENV['curren_acc'] = evaluator.acc_meters.avg*100 # Reset Stats trainer._reset_stats() evaluator._reset_stats() # Save Model target_model = model.module if args.data_parallel else model util.save_model(ENV=ENV, epoch=epoch, model=target_model, optimizer=optimizer, scheduler=scheduler, filename=checkpoint_path_file) logger.info('Model Saved at %s', checkpoint_path_file) return def universal_perturbation_eval(noise_generator, random_noise, data_loader, model, eval_target=args.universal_train_target): loss_meter = util.AverageMeter() err_meter = util.AverageMeter() random_noise = random_noise.to(device) model = model.to(device) for i, (images, labels) in enumerate(data_loader[eval_target]): images, labels = images.to(device, non_blocking=True), labels.to(device, non_blocking=True) if random_noise is not None: for i in range(len(labels)): class_index = labels[i].item() noise = random_noise[class_index] mask_cord, class_noise = noise_generator._patch_noise_extend_to_img(noise, image_size=images[i].shape, patch_location=args.patch_location) images[i] += class_noise pred = model(images) err = (pred.data.max(1)[1] != labels.data).float().sum() loss = torch.nn.CrossEntropyLoss()(pred, labels) loss_meter.update(loss.item(), len(labels)) err_meter.update(err / len(labels)) return loss_meter.avg, err_meter.avg def universal_perturbation(noise_generator, trainer, evaluator, model, criterion, optimizer, scheduler, random_noise, ENV): # Class-Wise perturbation # Generate Data loader datasets_generator = dataset.DatasetGenerator(train_batch_size=args.train_batch_size, eval_batch_size=args.eval_batch_size, train_data_type=args.train_data_type, train_data_path=args.train_data_path, test_data_type=args.test_data_type, test_data_path=args.test_data_path, num_of_workers=args.num_of_workers, seed=args.seed, no_train_augments=True) if args.use_subset: data_loader = datasets_generator._split_validation_set(train_portion=args.universal_train_portion, train_shuffle=True, train_drop_last=True) else: data_loader = datasets_generator.getDataLoader(train_shuffle=True, train_drop_last=True) condition = True data_iter = iter(data_loader['train_dataset']) logger.info('=' * 20 + 'Searching Universal Perturbation' + '=' * 20) if hasattr(model, 'classify'): model.classify = True while condition: if args.attack_type == 'min-min' and not args.load_model: # Train Batch for min-min noise for j in range(0, args.train_step): try: (images, labels) = next(data_iter) except: data_iter = iter(data_loader['train_dataset']) (images, labels) = next(data_iter) images, labels = images.to(device), labels.to(device) # Add Class-wise Noise to each sample train_imgs = [] for i, (image, label) in enumerate(zip(images, labels)): noise = random_noise[label.item()] mask_cord, class_noise = noise_generator._patch_noise_extend_to_img(noise, image_size=image.shape, patch_location=args.patch_location) train_imgs.append(images[i]+class_noise) # Train model.train() for param in model.parameters(): param.requires_grad = True trainer.train_batch(torch.stack(train_imgs).to(device), labels, model, optimizer) for i, (images, labels) in tqdm(enumerate(data_loader[args.universal_train_target]), total=len(data_loader[args.universal_train_target])): images, labels, model = images.to(device), labels.to(device), model.to(device) # Add Class-wise Noise to each sample batch_noise, mask_cord_list = [], [] for i, (image, label) in enumerate(zip(images, labels)): noise = random_noise[label.item()] mask_cord, class_noise = noise_generator._patch_noise_extend_to_img(noise, image_size=image.shape, patch_location=args.patch_location) batch_noise.append(class_noise) mask_cord_list.append(mask_cord) # Update universal perturbation model.eval() for param in model.parameters(): param.requires_grad = False batch_noise = torch.stack(batch_noise).to(device) if args.attack_type == 'min-min': perturb_img, eta = noise_generator.min_min_attack(images, labels, model, optimizer, criterion, random_noise=batch_noise) elif args.attack_type == 'min-max': perturb_img, eta = noise_generator.min_max_attack(images, labels, model, optimizer, criterion, random_noise=batch_noise) else: raise('Invalid attack') class_noise_eta = collections.defaultdict(list) for i in range(len(eta)): x1, x2, y1, y2 = mask_cord_list[i] delta = eta[i][:, x1: x2, y1: y2] class_noise_eta[labels[i].item()].append(delta.detach().cpu()) for key in class_noise_eta: delta = torch.stack(class_noise_eta[key]).mean(dim=0) - random_noise[key] class_noise = random_noise[key] class_noise += delta random_noise[key] = torch.clamp(class_noise, -args.epsilon, args.epsilon) # Eval termination conditions loss_avg, error_rate = universal_perturbation_eval(noise_generator, random_noise, data_loader, model, eval_target=args.universal_train_target) logger.info('Loss: {:.4f} Acc: {:.2f}%'.format(loss_avg, 100 - error_rate*100)) random_noise = random_noise.detach() ENV['random_noise'] = random_noise if args.attack_type == 'min-min': condition = error_rate > args.universal_stop_error elif args.attack_type == 'min-max': condition = error_rate < args.universal_stop_error return random_noise def samplewise_perturbation_eval(random_noise, data_loader, model, eval_target='train_dataset', mask_cord_list=[]): loss_meter = util.AverageMeter() err_meter = util.AverageMeter() # random_noise = random_noise.to(device) model = model.to(device) idx = 0 for i, (images, labels) in enumerate(data_loader[eval_target]): images, labels = images.to(device, non_blocking=True), labels.to(device, non_blocking=True) if random_noise is not None: for i, (image, label) in enumerate(zip(images, labels)): if not torch.is_tensor(random_noise): sample_noise = torch.tensor(random_noise[idx]).to(device) else: sample_noise = random_noise[idx].to(device) c, h, w = image.shape[0], image.shape[1], image.shape[2] mask = np.zeros((c, h, w), np.float32) x1, x2, y1, y2 = mask_cord_list[idx] mask[:, x1: x2, y1: y2] = sample_noise.cpu().numpy() sample_noise = torch.from_numpy(mask).to(device) images[i] = images[i] + sample_noise idx += 1 pred = model(images) err = (pred.data.max(1)[1] != labels.data).float().sum() loss = torch.nn.CrossEntropyLoss()(pred, labels) loss_meter.update(loss.item(), len(labels)) err_meter.update(err / len(labels)) return loss_meter.avg, err_meter.avg def sample_wise_perturbation(noise_generator, trainer, evaluator, model, criterion, optimizer, scheduler, random_noise, ENV): datasets_generator = dataset.DatasetGenerator(train_batch_size=args.train_batch_size, eval_batch_size=args.eval_batch_size, train_data_type=args.train_data_type, train_data_path=args.train_data_path, test_data_type=args.test_data_type, test_data_path=args.test_data_path, num_of_workers=args.num_of_workers, seed=args.seed, no_train_augments=True) if args.train_data_type == 'ImageNetMini' and args.perturb_type == 'samplewise': data_loader = datasets_generator._split_validation_set(0.2, train_shuffle=False, train_drop_last=False) data_loader['train_dataset'] = data_loader['train_subset'] else: data_loader = datasets_generator.getDataLoader(train_shuffle=False, train_drop_last=False) mask_cord_list = [] idx = 0 for images, labels in data_loader['train_dataset']: for i, (image, label) in enumerate(zip(images, labels)): noise = random_noise[idx] mask_cord, _ = noise_generator._patch_noise_extend_to_img(noise, image_size=image.shape, patch_location=args.patch_location) mask_cord_list.append(mask_cord) idx += 1 condition = True train_idx = 0 data_iter = iter(data_loader['train_dataset']) logger.info('=' * 20 + 'Searching Samplewise Perturbation' + '=' * 20) while condition: if args.attack_type == 'min-min' and not args.load_model: # Train Batch for min-min noise for j in tqdm(range(0, args.train_step), total=args.train_step): try: (images, labels) = next(data_iter) except: train_idx = 0 data_iter = iter(data_loader['train_dataset']) (images, labels) = next(data_iter) images, labels = images.to(device), labels.to(device) # Add Sample-wise Noise to each sample for i, (image, label) in enumerate(zip(images, labels)): sample_noise = random_noise[train_idx] c, h, w = image.shape[0], image.shape[1], image.shape[2] mask = np.zeros((c, h, w), np.float32) x1, x2, y1, y2 = mask_cord_list[train_idx] if type(sample_noise) is np.ndarray: mask[:, x1: x2, y1: y2] = sample_noise else: mask[:, x1: x2, y1: y2] = sample_noise.cpu().numpy() # mask[:, x1: x2, y1: y2] = sample_noise.cpu().numpy() sample_noise = torch.from_numpy(mask).to(device) images[i] = images[i] + sample_noise train_idx += 1 model.train() for param in model.parameters(): param.requires_grad = True trainer.train_batch(images, labels, model, optimizer) # Search For Noise idx = 0 for i, (images, labels) in tqdm(enumerate(data_loader['train_dataset']), total=len(data_loader['train_dataset'])): images, labels, model = images.to(device), labels.to(device), model.to(device) # Add Sample-wise Noise to each sample batch_noise, batch_start_idx = [], idx for i, (image, label) in enumerate(zip(images, labels)): sample_noise = random_noise[idx] c, h, w = image.shape[0], image.shape[1], image.shape[2] mask = np.zeros((c, h, w), np.float32) x1, x2, y1, y2 = mask_cord_list[idx] if type(sample_noise) is np.ndarray: mask[:, x1: x2, y1: y2] = sample_noise else: mask[:, x1: x2, y1: y2] = sample_noise.cpu().numpy() # mask[:, x1: x2, y1: y2] = sample_noise.cpu().numpy() sample_noise = torch.from_numpy(mask).to(device) batch_noise.append(sample_noise) idx += 1 # Update sample-wise perturbation model.eval() for param in model.parameters(): param.requires_grad = False batch_noise = torch.stack(batch_noise).to(device) if args.attack_type == 'min-min': perturb_img, eta = noise_generator.min_min_attack(images, labels, model, optimizer, criterion, random_noise=batch_noise) elif args.attack_type == 'min-max': perturb_img, eta = noise_generator.min_max_attack(images, labels, model, optimizer, criterion, random_noise=batch_noise) else: raise('Invalid attack') for i, delta in enumerate(eta): x1, x2, y1, y2 = mask_cord_list[batch_start_idx+i] delta = delta[:, x1: x2, y1: y2] if torch.is_tensor(random_noise): random_noise[batch_start_idx+i] = delta.detach().cpu().clone() else: random_noise[batch_start_idx+i] = delta.detach().cpu().numpy() # Eval termination conditions loss_avg, error_rate = samplewise_perturbation_eval(random_noise, data_loader, model, eval_target='train_dataset', mask_cord_list=mask_cord_list) logger.info('Loss: {:.4f} Acc: {:.2f}%'.format(loss_avg, 100 - error_rate*100)) if torch.is_tensor(random_noise): random_noise = random_noise.detach() ENV['random_noise'] = random_noise if args.attack_type == 'min-min': condition = error_rate > args.universal_stop_error elif args.attack_type == 'min-max': condition = error_rate < args.universal_stop_error # Update Random Noise to shape if torch.is_tensor(random_noise): new_random_noise = [] for idx in range(len(random_noise)): sample_noise = random_noise[idx] c, h, w = image.shape[0], image.shape[1], image.shape[2] mask = np.zeros((c, h, w), np.float32) x1, x2, y1, y2 = mask_cord_list[idx] mask[:, x1: x2, y1: y2] = sample_noise.cpu().numpy() new_random_noise.append(torch.from_numpy(mask)) new_random_noise = torch.stack(new_random_noise) return new_random_noise else: return random_noise def main(): # Setup ENV datasets_generator = dataset.DatasetGenerator(train_batch_size=args.train_batch_size, eval_batch_size=args.eval_batch_size, train_data_type=args.train_data_type, train_data_path=args.train_data_path, test_data_type=args.test_data_type, test_data_path=args.test_data_path, num_of_workers=args.num_of_workers, seed=args.seed) data_loader = datasets_generator.getDataLoader() model = config.model().to(device) logger.info("param size = %fMB", util.count_parameters_in_MB(model)) optimizer = config.optimizer(model.parameters()) scheduler = config.scheduler(optimizer) criterion = config.criterion() if args.perturb_type == 'samplewise': train_target = 'train_dataset' else: if args.use_subset: data_loader = datasets_generator._split_validation_set(train_portion=args.universal_train_portion, train_shuffle=True, train_drop_last=True) train_target = 'train_subset' else: data_loader = datasets_generator.getDataLoader(train_shuffle=True, train_drop_last=True) train_target = 'train_dataset' trainer = Trainer(criterion, data_loader, logger, config, target=train_target) evaluator = Evaluator(data_loader, logger, config) ENV = {'global_step': 0, 'best_acc': 0.0, 'curren_acc': 0.0, 'best_pgd_acc': 0.0, 'train_history': [], 'eval_history': [], 'pgd_eval_history': [], 'genotype_list': []} if args.data_parallel: model = torch.nn.DataParallel(model) if args.load_model: checkpoint = util.load_model(filename=checkpoint_path_file, model=model, optimizer=optimizer, alpha_optimizer=None, scheduler=scheduler) ENV = checkpoint['ENV'] trainer.global_step = ENV['global_step'] logger.info("File %s loaded!" % (checkpoint_path_file)) noise_generator = toolbox.PerturbationTool(epsilon=args.epsilon, num_steps=args.num_steps, step_size=args.step_size) if args.attack_type == 'random': noise = noise_generator.random_noise(noise_shape=args.noise_shape) torch.save(noise, os.path.join(args.exp_name, 'perturbation.pt')) logger.info(noise) logger.info(noise.shape) logger.info('Noise saved at %s' % (os.path.join(args.exp_name, 'perturbation.pt'))) elif args.attack_type == 'min-min' or args.attack_type == 'min-max': if args.attack_type == 'min-max': # min-max noise need model to converge first train(0, model, optimizer, scheduler, criterion, trainer, evaluator, ENV, data_loader) if args.random_start: random_noise = noise_generator.random_noise(noise_shape=args.noise_shape) else: random_noise = torch.zeros(*args.noise_shape) if args.perturb_type == 'samplewise': noise = sample_wise_perturbation(noise_generator, trainer, evaluator, model, criterion, optimizer, scheduler, random_noise, ENV) elif args.perturb_type == 'classwise': noise = universal_perturbation(noise_generator, trainer, evaluator, model, criterion, optimizer, scheduler, random_noise, ENV) torch.save(noise, os.path.join(args.exp_name, 'perturbation.pt')) logger.info(noise) logger.info(noise.shape) logger.info('Noise saved at %s' % (os.path.join(args.exp_name, 'perturbation.pt'))) else: raise('Not implemented yet') return if __name__ == '__main__': for arg in vars(args): logger.info("%s: %s" % (arg, getattr(args, arg))) start = time.time() main() end = time.time() cost = (end - start) / 86400 payload = "Running Cost %.2f Days \n" % cost logger.info(payload) ================================================ FILE: requirements.txt ================================================ torch torchvision mlconfig ================================================ FILE: scripts/cifar10/min-max-noise/classwise-noise/exp_setting.sh ================================================ #!/bin/bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-max export perturb_type=classwise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.8 export universal_train_target='train_subset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar10/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/cifar10/min-max-noise/classwise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_path python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 10 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar10/min-max-noise/classwise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" # "resnet18_augmentation" ) # Poison Rates declare -a poison_rate_arr=( 1.0 0.8 0.6 0.4 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done ================================================ FILE: scripts/cifar10/min-max-noise/classwise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name rm -rf $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10/min-max-noise/classwise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10/min-max-noise/samplewise-noise/exp_setting.sh ================================================ #!/bin/bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-max export perturb_type=samplewise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=20 export universal_stop_error=0.9 export universal_train_target='train_dataset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar10/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/cifar10/min-max-noise/samplewise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_path python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 50000 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ ================================================ FILE: scripts/cifar10/min-max-noise/samplewise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" # "resnet18_augmentation" ) # Poison Rates declare -a poison_rate_arr=( 1.0 0.8 0.6 0.4 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # # Submit Adv Training # echo resnet18-madrys-1.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-1.0 train.slurm resnet18_madrys 1.0 $scripts_path # echo resnet18-madrys-0.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-0.0 train.slurm resnet18_madrys 0.0 $scripts_path ================================================ FILE: scripts/cifar10/min-max-noise/samplewise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10/min-max-noise/samplewise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10/min-min-noise/classwise-noise/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.01 export universal_train_target='train_subset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar10/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/cifar10/min-min-noise/classwise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 10 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar10/min-min-noise/classwise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" "resnet50" "dense121" "resnet18_augmentation" "resnet18_add-uniform-noise" "resnet18_classpoison" "resnet18_add-uniform-noise-aug" "resnet18_cutout" "resnet18_cutmix" "resnet18_mixup" ) # Poison Rates declare -a poison_rate_arr=( 1.0 0.8 0.6 0.4 0.2 0.1 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # Submit Adv Training for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path done # echo resnet18-madrys-1.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-1.0 train.slurm resnet18_madrys 1.0 $scripts_path # echo resnet18-madrys-0.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-0.0 train.slurm resnet18_madrys 0.0 $scripts_path ================================================ FILE: scripts/cifar10/min-min-noise/classwise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10/min-min-noise/classwise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10/min-min-noise/samplewise-noise/exp_setting.sh ================================================ #!/bin/bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=samplewise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=20 export universal_stop_error=0.01 export universal_train_target='train_dataset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar10/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/cifar10/min-min-noise/samplewise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 50000 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ ================================================ FILE: scripts/cifar10/min-min-noise/samplewise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" "resnet50" "dense121" "resnet18_augmentation" "resnet18_add-uniform-noise" "resnet18_classpoison" "resnet18_add-uniform-noise-aug" "resnet18_cutout" "resnet18_cutmix" "resnet18_mixup" ) # Poison Rates declare -a poison_rate_arr=( 1.0 0.8 0.6 0.4 0.2 0.1 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done echo resnet18-madrys-1.0-${exp_args} sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-1.0 train.slurm resnet18_madrys 1.0 $scripts_path echo resnet18-madrys-0.0-${exp_args} sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-0.0 train.slurm resnet18_madrys 0.0 $scripts_path ================================================ FILE: scripts/cifar10/min-min-noise/samplewise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10/min-min-noise/samplewise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10/random-noise/classwise-noise/exp_setting.sh ================================================ #!/bin/bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=random export perturb_type=classwise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.9 export universal_train_target='train_subset' export exp_args=${dataset_type}-eps=${epsilon} export exp_path=experiments/cifar10/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/cifar10/random-noise/classwise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 10 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ ================================================ FILE: scripts/cifar10/random-noise/classwise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" # "resnet18_augmentation" # "resnet18_denoise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 0.8 0.6 0.4 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # echo ${attack_type}-${perturb_type}-resnet18-madrys-1.0 # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 \ # --job-name ${attack_type}-${perturb_type}-resnet18-madrys-1.0 \ # train.slurm resnet18_madrys 1.0 $scripts_path # # echo ${attack_type}-${perturb_type}-resnet18-madrys-0.0 # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 \ # --job-name ${attack_type}-${perturb_type}-resnet18-madrys-0.0 \ # train.slurm resnet18_madrys 0.0 $scripts_path ================================================ FILE: scripts/cifar10/random-noise/classwise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10/random-noise/classwise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10/random-noise/samplewise-noise/exp_setting.sh ================================================ #!/bin/bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=random export perturb_type=samplewise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=20 export universal_stop_error=0.9 export universal_train_target='train_dataset' export exp_args=${dataset_type}-eps=${epsilon} export exp_path=experiments/cifar10/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/cifar10/random-noise/samplewise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_path python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 50000 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ ================================================ FILE: scripts/cifar10/random-noise/samplewise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" # "resnet18_augmentation" # "resnet18_denoise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 0.8 0.6 0.4 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # # Submit Adv Training # echo resnet18-madrys-1.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-1.0 train.slurm resnet18_madrys 1.0 $scripts_path # echo resnet18-madrys-0.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-0.0 train.slurm resnet18_madrys 0.0 $scripts_path ================================================ FILE: scripts/cifar10/random-noise/samplewise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10/random-noise/samplewise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-2/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.1 export universal_train_target='train_subset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version}-2noise export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-2 ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-2/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 10 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-2/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" # "resnet18_add-uniform-noise-aug" # "resnet18_classpoison" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-2/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-2/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-eps=16/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=16 export step_size=1.6 export num_steps=1 export universal_stop_error=0.01 export universal_train_target='train_subset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-eps=16 ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-eps=16/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 10 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-eps=16/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" # "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # Submit Adv Training for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 8:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path done ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-eps=16/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-eps=16/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-eps=24/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=24 export step_size=2.4 export num_steps=1 export universal_stop_error=0.01 export universal_train_target='train_subset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-eps=24 ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-eps=24/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 10 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-eps=24/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" # "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # Submit Adv Training for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path done ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-eps=24/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-eps=24/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch16/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.1 export universal_train_target='train_subset' export patch_location='random' export patch_size=16 export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version}-${patch_location}${patch_size} export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-${patch_location}-patch${patch_size} ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch16/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 10 3 $patch_size $patch_size \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --patch_location $patch_location \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch16/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" # "resnet18_classpoison" # "resnet18_add-uniform-noise-aug" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 # 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch16/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch16/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch24/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.1 export universal_train_target='train_subset' export patch_location='random' export patch_size=24 export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version}-${patch_location}${patch_size} export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-${patch_location}-patch${patch_size} ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch24/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 10 3 $patch_size $patch_size \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --patch_location $patch_location \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch24/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" # "resnet18_classpoison" # "resnet18_add-uniform-noise-aug" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 # 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch24/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch24/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch8/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.1 export universal_train_target='train_subset' export patch_location='random' export patch_size=8 export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version}-${patch_location}${patch_size} export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-${patch_location}-patch${patch_size} ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch8/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 10 3 $patch_size $patch_size \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --patch_location $patch_location \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch8/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" # "resnet18_classpoison" # "resnet18_add-uniform-noise-aug" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 # 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch8/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-random-patch8/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-transfer-tiny-imagenet/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=16 export step_size=1.6 export num_steps=1 export universal_stop_error=0.1 export universal_train_target='train_subset' export exp_args=TinyImageNet-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-transfer-tiny-imagenet ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-transfer-tiny-imagenet/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" "resnet50" "dense121" "resnet18_augmentation" "resnet18_add-uniform-noise" "resnet18_classpoison" # "resnet18_classpoison_targeted" ) # Poison Rates declare -a poison_rate_arr=( 1.0 0.8 0.6 0.4 0.2 0.0 ) echo $scripts_path # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # Submit Adv Training for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path done ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-transfer-tiny-imagenet/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/classwise-noise-transfer-tiny-imagenet/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training pwd cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-eps=16/exp_setting.sh ================================================ #!/bin/bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=samplewise export base_version=resnet18 export epsilon=16 export step_size=1.6 export num_steps=20 export universal_stop_error=0.01 export universal_train_target='train_dataset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-eps=16 ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-eps=16/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 50000 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --random_start ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-eps=16/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" # "resnet18_augmentation" # "resnet18_denoise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # Submit Adv Training for poison_rate in "${poison_rate_arr[@]}" do job_name=$exp_args-resnet18_madrys-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path done # echo resnet18-madrys-1.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-1.0 train.slurm resnet18_madrys 1.0 $scripts_path # echo resnet18-madrys-0.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-0.0 train.slurm resnet18_madrys 0.0 $scripts_path ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-eps=16/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-eps=16/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-eps=24/exp_setting.sh ================================================ #!/bin/bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=samplewise export base_version=resnet18 export epsilon=24 export step_size=2.4 export num_steps=20 export universal_stop_error=0.01 export universal_train_target='train_dataset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-eps=24 ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-eps=24/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 50000 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --random_start ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-eps=24/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" # "resnet18_augmentation" # "resnet18_denoise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # Submit Adv Training for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path done # echo resnet18-madrys-1.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-1.0 train.slurm resnet18_madrys 1.0 $scripts_path # echo resnet18-madrys-0.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-0.0 train.slurm resnet18_madrys 0.0 $scripts_path ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-eps=24/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-eps=24/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch16/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=samplewise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.1 export universal_train_target='train_subset' export patch_location='random' export patch_size=16 export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version}-${patch_location}${patch_size} export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-${patch_location}-patch${patch_size} ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch16/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 50000 3 $patch_size $patch_size \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --patch_location $patch_location \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch16/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" # "resnet18_classpoison" # "resnet18_add-uniform-noise-aug" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 # 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch16/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch16/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch24/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=samplewise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.1 export universal_train_target='train_subset' export patch_location='random' export patch_size=24 export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version}-${patch_location}${patch_size} export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-${patch_location}-patch${patch_size} ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch24/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 50000 3 $patch_size $patch_size \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --patch_location $patch_location \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch24/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" # "resnet18_classpoison" # "resnet18_add-uniform-noise-aug" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 # 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch24/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch24/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch8/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=samplewise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.1 export universal_train_target='train_subset' export patch_location='random' export patch_size=8 export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version}-${patch_location}${patch_size} export exp_path=experiments/cifar10-extension/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar10-extension/${attack_type}-noise/${perturb_type}-noise-${patch_location}-patch${patch_size} ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch8/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --noise_shape 50000 3 $patch_size $patch_size \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --patch_location $patch_location \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch8/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" # "resnet50" # "dense121" "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" # "resnet18_classpoison" # "resnet18_add-uniform-noise-aug" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 # 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch8/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar10-extension/min-min-noise/samplewise-noise-random-patch8/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar100/min-min-noise/classwise-noise/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/cifar100 export dataset_type=CIFAR100 export poison_dataset_type=PoisonCIFAR100 export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.01 export universal_train_target='train_subset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar100/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar100/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/cifar100/min-min-noise/classwise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --test_data_type $dataset_type \ --noise_shape 100 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/cifar100/min-min-noise/classwise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" "resnet50" "dense121" # "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 8:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done ================================================ FILE: scripts/cifar100/min-min-noise/classwise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar100/min-min-noise/classwise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar100/min-min-noise/samplewise-noise/exp_setting.sh ================================================ #!/bin/bash # Exp Setting export config_path=configs/cifar100 export dataset_type=CIFAR100 export poison_dataset_type=PoisonCIFAR100 export attack_type=min-min export perturb_type=samplewise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=20 export train_step=20 export universal_stop_error=0.01 export universal_train_target='train_dataset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar100/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/cifar100/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/cifar100/min-min-noise/samplewise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --test_data_type $dataset_type \ --noise_shape 50000 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --train_step $train_step \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ ================================================ FILE: scripts/cifar100/min-min-noise/samplewise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" "resnet50" "dense121" # "resnet18_augmentation" # "resnet18_denoise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 8:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done # echo resnet18-madrys-1.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-1.0 train.slurm resnet18_madrys 1.0 $scripts_path # echo resnet18-madrys-0.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-0.0 train.slurm resnet18_madrys 0.0 $scripts_path ================================================ FILE: scripts/cifar100/min-min-noise/samplewise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar100/min-min-noise/samplewise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/cifar101/exp_setting.sh ================================================ #!/bin/bash # Exp Setting export config_path=configs/cifar10 export dataset_type=CIFAR10 export poison_dataset_type=PoisonCIFAR10 export attack_type=min-min export perturb_type=samplewise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=20 export universal_stop_error=0.01 export universal_train_target='train_dataset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/cifar10/${attack_type}_${perturb_type}/${exp_args} ================================================ FILE: scripts/cifar101/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=1.0 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name experiments/cifar101_transfer \ --config_path configs/cifar101 \ --train_data_type PoisonCIFAR101 \ --test_data_type PoisonCIFAR101 \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/face/min-min-noise/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/face export dataset_path=../datasets/casia-112x112-protected-train export test_dataset_path=../datasets/casia-112x112-protected-val export dataset_type=WebFace export poison_dataset_type=WebFace export base_version=InceptionResnet export attack_type=min-min export perturb_type=classwise export epsilon=16 export step_size=1.6 export num_steps=1 export train_step=30 export universal_stop_error=0.1 export universal_train_target='train_dataset' export exp_path=experiments/face export scripts_path=scripts/face ================================================ FILE: scripts/face/min-min-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files exp_name=${exp_path}/search_noise echo $exp_name # Search Universal Perturbation and build datasets cd ../../../ # rm -rf $exp_name pwd python3 perturbation.py --config_path $config_path \ --exp_name $exp_name \ --version $base_version \ --train_data_type WebFace \ --test_data_type WebFace \ --train_data_path /home/lemonbear/DriveN/data/face-search \ --test_data_path /home/lemonbear/DriveN/data/face-search \ --noise_shape 150 3 112 112 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --train_step $train_step \ --train_batch_size 32 \ --eval_batch_size 32 \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ ================================================ FILE: scripts/face/min-min-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path} echo $exp_name # Poison Training cd ../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_path $dataset_path \ --test_data_path $test_dataset_path \ --train_data_type $dataset_type \ --test_data_type $dataset_type \ --train_batch_size 64 \ --eval_batch_size 64 \ --train --data_parallel --train_face ================================================ FILE: scripts/face/min-min-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="WebFace" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=8 #SBATCH --mem=32G #SBATCH --time 72:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 scripts_path=$2 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path} echo $exp_name # Poison Training cd ../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_path $dataset_path \ --test_data_path $test_dataset_path \ --train_data_type $dataset_type \ --test_data_type $dataset_type \ --train_batch_size 64 \ --eval_batch_size 64 \ --train --data_parallel ================================================ FILE: scripts/face/min-min-noise/train_clean.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 exp_name=${exp_path}/clean_train echo $exp_name cd ../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_path $dataset_path \ --test_data_path $test_dataset_path \ --train_data_type $dataset_type \ --test_data_type $dataset_type \ --train_batch_size 512 \ --eval_batch_size 512 \ --train --train_face --data_parallel ================================================ FILE: scripts/face/min-min-noise/train_clean.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="WebFace-Clean" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=8 #SBATCH --mem=32G #SBATCH --time 168:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 scripts_path=$2 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 exp_name=${exp_path}/clean_train echo $exp_name cd ../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_path $dataset_path \ --test_data_path $test_dataset_path \ --train_data_type $dataset_type \ --test_data_type $dataset_type \ --train_batch_size 512 \ --eval_batch_size 512 \ --train --train_face --data_parallel ================================================ FILE: scripts/face/min-min-noise/train_protected.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 exp_name=${exp_path}/protected_train echo $exp_name cd ../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_path ../datasets/casia-112x112-protected \ --test_data_path $test_dataset_path \ --train_data_type $dataset_type \ --test_data_type $dataset_type \ --train_batch_size 512 \ --eval_batch_size 512 \ --train --train_face --data_parallel ================================================ FILE: scripts/face/min-min-noise/train_protected.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="WebFace-Protected" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=8 #SBATCH --mem=32G #SBATCH --time 168:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 scripts_path=$2 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 exp_name=${exp_path}/protected_train echo $exp_name cd ../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_path $dataset_path \ --test_data_path $test_dataset_path \ --train_data_type $dataset_type \ --test_data_type $dataset_type \ --train_batch_size 512 \ --eval_batch_size 512 \ --train --train_face --data_parallel ================================================ FILE: scripts/imagenet-mini/min-min-noise/classwise-noise/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/imagenet-mini export dataset_path=../datasets/ILSVRC2012 export dataset_type=ImageNetMini export poison_dataset_type=PoisonImageNetMini export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=16 export step_size=1.6 export num_steps=1 export train_step=100 export universal_stop_error=0.1 export universal_train_target='train_subset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/imagenet-mini/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/imagenet-mini/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/imagenet-mini/min-min-noise/classwise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_path $dataset_path \ --train_data_type $dataset_type \ --test_data_path $dataset_path \ --test_data_type $dataset_type \ --noise_shape 100 3 224 224 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --train_step $train_step \ --train_batch_size 32 \ --eval_batch_size 32 \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/imagenet-mini/min-min-noise/classwise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" "resnet50" "dense121" # "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 48:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done ================================================ FILE: scripts/imagenet-mini/min-min-noise/classwise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_path $dataset_path \ --train_data_type $poison_dataset_type \ --test_data_path $dataset_path \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/imagenet-mini/min-min-noise/classwise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=24 #SBATCH --mem=32G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise # Load EXP Setting cd $scripts_path source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_path $dataset_path \ --train_data_type $poison_dataset_type \ --test_data_path $dataset_path \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train_batch_size 64 --eval_batch_size 64 \ --num_of_workers 24 \ --train ================================================ FILE: scripts/imagenet-mini/min-min-noise/samplewise-noise/exp_setting.sh ================================================ #!/bin/bash # Exp Setting export config_path=configs/imagenet-mini export dataset_path=../datasets/ILSVRC2012 export dataset_type=ImageNetMini export poison_dataset_type=PoisonImageNetMini export attack_type=min-min export perturb_type=samplewise export base_version=resnet18 export epsilon=16 export step_size=1.6 export num_steps=20 export train_step=100 export universal_stop_error=0.1 export universal_train_target='train_dataset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/imagenet-mini/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/imagenet-mini/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/imagenet-mini/min-min-noise/samplewise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_path $dataset_path \ --train_data_type $dataset_type \ --test_data_path $dataset_path \ --test_data_type $dataset_type \ --noise_shape 25879 3 224 224 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --train_step $train_step \ --train_batch_size 32 \ --eval_batch_size 32 \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ ================================================ FILE: scripts/imagenet-mini/min-min-noise/samplewise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" "resnet50" "dense121" # "resnet18_augmentation" # "resnet18_denoise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 48:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done ================================================ FILE: scripts/imagenet-mini/min-min-noise/samplewise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_path $dataset_path \ --train_data_type $poison_dataset_type \ --test_data_path $dataset_path \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train --train_portion 0.2 ================================================ FILE: scripts/imagenet-mini/min-min-noise/samplewise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=24 #SBATCH --mem=64G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_path $dataset_path \ --train_data_type $poison_dataset_type \ --test_data_path $dataset_path \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train_batch_size 64 --eval_batch_size 64 \ --num_of_workers 24 \ --train --train_portion 0.2 ================================================ FILE: scripts/svhn/min-min-noise/classwise-noise/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/svhn export dataset_type=SVHN export poison_dataset_type=PoisonSVHN export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=1 export universal_stop_error=0.01 export universal_train_target='train_subset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/svhn/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/svhn/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/svhn/min-min-noise/classwise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --test_data_type $dataset_type \ --noise_shape 10 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: scripts/svhn/min-min-noise/classwise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" "resnet50" "dense121" # "resnet18_augmentation" # "resnet18_denoise" # "resnet18_add-uniform-noise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=${attack_type}-${perturb_type}-$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 4:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=${attack_type}-${perturb_type}-$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done ================================================ FILE: scripts/svhn/min-min-noise/classwise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/svhn/min-min-noise/classwise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/svhn/min-min-noise/samplewise-noise/exp_setting.sh ================================================ #!/bin/bash # Exp Setting export config_path=configs/svhn export dataset_type=SVHN export poison_dataset_type=PoisonSVHN export attack_type=min-min export perturb_type=samplewise export base_version=resnet18 export epsilon=8 export step_size=0.8 export num_steps=20 export universal_stop_error=0.01 export universal_train_target='train_dataset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/svhn/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/svhn/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/svhn/min-min-noise/samplewise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_type $dataset_type \ --test_data_type $dataset_type \ --noise_shape 73257 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ ================================================ FILE: scripts/svhn/min-min-noise/samplewise-noise/submit.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Target Models declare -a type_arr=( "resnet18" "resnet50" "dense121" # "resnet18_augmentation" # "resnet18_denoise" ) # Poison Rates declare -a poison_rate_arr=( 1.0 # 0.8 # 0.6 # 0.4 # 0.2 0.0 ) # Submit Jobs for model_name in "${type_arr[@]}" do for poison_rate in "${poison_rate_arr[@]}" do job_name=$exp_args-${model_name}-${poison_rate} echo $job_name sbatch --partition gpgpu --gres=gpu:1 --time 3:00:00 --job-name $job_name train.slurm $model_name $poison_rate $scripts_path done done # # Submit Adv Training # for poison_rate in "${poison_rate_arr[@]}" # do # job_name=$exp_args-resnet18_madrys-${poison_rate} # echo $job_name # sbatch --partition gpgpu --gres=gpu:1 --time 12:00:00 --job-name $job_name train.slurm resnet18_madrys $poison_rate $scripts_path # done # echo resnet18-madrys-1.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-1.0 train.slurm resnet18_madrys 1.0 $scripts_path # echo resnet18-madrys-0.0-${exp_args} # sbatch --partition gpgpu --gres=gpu:1 --time 24:00:00 --job-name ${exp_args}-resnet18-madrys-0.0 train.slurm resnet18_madrys 0.0 $scripts_path ================================================ FILE: scripts/svhn/min-min-noise/samplewise-noise/train.sh ================================================ #!/bin/bash # Load EXP Setting source exp_setting.sh # Training Setting model_name=$1 poison_rate=$2 exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/svhn/min-min-noise/samplewise-noise/train.slurm ================================================ #!/bin/bash #SBATCH --nodes 1 #SBATCH --job-name="c100-universal" #SBATCH --output=slurm-%A-%x.out #SBATCH --account="punim0784" #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=4G #SBATCH --time 4:00:00 #SBATCH --mail-type=ALL #SBATCH --mail-user=pineappleorcas@gmail.com # check that the script is launched with sbatch if [ "x$SLURM_JOB_ID" == "x" ]; then echo "You need to submit your job to the queuing system with sbatch" exit 1 fi # Training Setting model_name=$1 poison_rate=$2 scripts_path=$3 # Run the job from this directory: cd /data/gpfs/projects/punim0784/min-min-noise cd $scripts_path # Load EXP Setting source exp_setting.sh exp_name=${exp_path}/poison_train_${poison_rate} echo $exp_name # Poison Training cd ../../../../ rm -rf ${exp_name}/${model_name} python3 -u main.py --version $model_name \ --exp_name $exp_name \ --config_path $config_path \ --train_data_type $poison_dataset_type \ --test_data_type $dataset_type \ --poison_rate $poison_rate \ --perturb_type $perturb_type \ --perturb_tensor_filepath ${exp_path}/perturbation.pt \ --train ================================================ FILE: scripts/tiny-imagenet/min-min-noise/classwise-noise/exp_setting.sh ================================================ #!/usr/bin/env bash # Exp Setting export config_path=configs/tiny-imagenet export dataset_path=../datasets/ILSVRC2012 export dataset_type=TinyImageNet export poison_dataset_type=PoisonImageNetMini export attack_type=min-min export perturb_type=classwise export base_version=resnet18 export epsilon=16 export step_size=1.6 export num_steps=1 export train_step=250 export universal_stop_error=0.1 export universal_train_target='train_subset' export exp_args=${dataset_type}-eps=${epsilon}-se=${universal_stop_error}-base_version=${base_version} export exp_path=experiments/tiny-imagenet/${attack_type}_${perturb_type}/${exp_args} export scripts_path=scripts/tiny-imagenet/${attack_type}-noise/${perturb_type}-noise ================================================ FILE: scripts/tiny-imagenet/min-min-noise/classwise-noise/search_perturbation_noise.sh ================================================ #!/bin/bash # Load Exp Settings source exp_setting.sh # Remove previous files echo $exp_path # Search Universal Perturbation and build datasets cd ../../../../ pwd rm -rf $exp_name python3 perturbation.py --config_path $config_path \ --exp_name $exp_path \ --version $base_version \ --train_data_path $dataset_path \ --train_data_type $dataset_type \ --test_data_path $dataset_path \ --test_data_type $dataset_type \ --noise_shape 1000 3 32 32 \ --epsilon $epsilon \ --num_steps $num_steps \ --step_size $step_size \ --attack_type $attack_type \ --perturb_type $perturb_type \ --train_step $train_step \ --train_batch_size 32 \ --eval_batch_size 32 \ --universal_train_target $universal_train_target\ --universal_stop_error $universal_stop_error\ --use_subset ================================================ FILE: toolbox.py ================================================ import numpy as np import torch from torch.autograd import Variable if torch.cuda.is_available(): device = torch.device('cuda') else: device = torch.device('cpu') class PerturbationTool(): def __init__(self, seed=0, epsilon=0.03137254901, num_steps=20, step_size=0.00784313725): self.epsilon = epsilon self.num_steps = num_steps self.step_size = step_size self.seed = seed np.random.seed(seed) def random_noise(self, noise_shape=[10, 3, 32, 32]): random_noise = torch.FloatTensor(*noise_shape).uniform_(-self.epsilon, self.epsilon).to(device) return random_noise def min_min_attack(self, images, labels, model, optimizer, criterion, random_noise=None, sample_wise=False): if random_noise is None: random_noise = torch.FloatTensor(*images.shape).uniform_(-self.epsilon, self.epsilon).to(device) perturb_img = Variable(images.data + random_noise, requires_grad=True) perturb_img = Variable(torch.clamp(perturb_img, 0, 1), requires_grad=True) eta = random_noise for _ in range(self.num_steps): opt = torch.optim.SGD([perturb_img], lr=1e-3) opt.zero_grad() model.zero_grad() if isinstance(criterion, torch.nn.CrossEntropyLoss): if hasattr(model, 'classify'): model.classify = True logits = model(perturb_img) loss = criterion(logits, labels) else: logits, loss = criterion(model, perturb_img, labels, optimizer) perturb_img.retain_grad() loss.backward() eta = self.step_size * perturb_img.grad.data.sign() * (-1) perturb_img = Variable(perturb_img.data + eta, requires_grad=True) eta = torch.clamp(perturb_img.data - images.data, -self.epsilon, self.epsilon) perturb_img = Variable(images.data + eta, requires_grad=True) perturb_img = Variable(torch.clamp(perturb_img, 0, 1), requires_grad=True) return perturb_img, eta def min_max_attack(self, images, labels, model, optimizer, criterion, random_noise=None, sample_wise=False): if random_noise is None: random_noise = torch.FloatTensor(*images.shape).uniform_(-self.epsilon, self.epsilon).to(device) perturb_img = Variable(images.data + random_noise, requires_grad=True) perturb_img = Variable(torch.clamp(perturb_img, 0, 1), requires_grad=True) eta = random_noise for _ in range(self.num_steps): opt = torch.optim.SGD([perturb_img], lr=1e-3) opt.zero_grad() model.zero_grad() if isinstance(criterion, torch.nn.CrossEntropyLoss): logits = model(perturb_img) loss = criterion(logits, labels) else: logits, loss = criterion(model, perturb_img, labels, optimizer) loss.backward() eta = self.step_size * perturb_img.grad.data.sign() perturb_img = Variable(perturb_img.data + eta, requires_grad=True) eta = torch.clamp(perturb_img.data - images.data, -self.epsilon, self.epsilon) perturb_img = Variable(images.data + eta, requires_grad=True) perturb_img = Variable(torch.clamp(perturb_img, 0, 1), requires_grad=True) return perturb_img, eta def _patch_noise_extend_to_img(self, noise, image_size=[3, 32, 32], patch_location='center'): c, h, w = image_size[0], image_size[1], image_size[2] mask = np.zeros((c, h, w), np.float32) x_len, y_len = noise.shape[1], noise.shape[1] if patch_location == 'center' or (h == w == x_len == y_len): x = h // 2 y = w // 2 elif patch_location == 'random': x = np.random.randint(x_len // 2, w - x_len // 2) y = np.random.randint(y_len // 2, h - y_len // 2) else: raise('Invalid patch location') x1 = np.clip(x - x_len // 2, 0, h) x2 = np.clip(x + x_len // 2, 0, h) y1 = np.clip(y - y_len // 2, 0, w) y2 = np.clip(y + y_len // 2, 0, w) if type(noise) is np.ndarray: pass else: mask[:, x1: x2, y1: y2] = noise.cpu().numpy() return ((x1, x2, y1, y2), torch.from_numpy(mask).to(device)) ================================================ FILE: trainer.py ================================================ import time import models import torch import util if torch.cuda.is_available(): device = torch.device('cuda') else: device = torch.device('cpu') class Trainer(): def __init__(self, criterion, data_loader, logger, config, global_step=0, target='train_dataset'): self.criterion = criterion self.data_loader = data_loader self.logger = logger self.config = config self.log_frequency = config.log_frequency if config.log_frequency is not None else 100 self.loss_meters = util.AverageMeter() self.acc_meters = util.AverageMeter() self.acc5_meters = util.AverageMeter() self.global_step = global_step self.target = target print(self.target) def _reset_stats(self): self.loss_meters = util.AverageMeter() self.acc_meters = util.AverageMeter() self.acc5_meters = util.AverageMeter() def train(self, epoch, model, criterion, optimizer, random_noise=None): model.train() for i, (images, labels) in enumerate(self.data_loader[self.target]): images, labels = images.to(device, non_blocking=True), labels.to(device, non_blocking=True) if random_noise is not None: random_noise = random_noise.detach().to(device) for i in range(len(labels)): class_index = labels[i].item() images[i] += random_noise[class_index].clone() images[i] = torch.clamp(images[i], 0, 1) start = time.time() log_payload = self.train_batch(images, labels, model, optimizer) end = time.time() time_used = end - start if self.global_step % self.log_frequency == 0: display = util.log_display(epoch=epoch, global_step=self.global_step, time_elapse=time_used, **log_payload) self.logger.info(display) self.global_step += 1 return self.global_step def train_batch(self, images, labels, model, optimizer): model.zero_grad() optimizer.zero_grad() if isinstance(self.criterion, torch.nn.CrossEntropyLoss) or isinstance(self.criterion, models.CutMixCrossEntropyLoss): logits = model(images) loss = self.criterion(logits, labels) else: logits, loss = self.criterion(model, images, labels, optimizer) if isinstance(self.criterion, models.CutMixCrossEntropyLoss): _, labels = torch.max(labels.data, 1) loss.backward() grad_norm = torch.nn.utils.clip_grad_norm_(model.parameters(), self.config.grad_clip) optimizer.step() if logits.shape[1] >= 5: acc, acc5 = util.accuracy(logits, labels, topk=(1, 5)) acc, acc5 = acc.item(), acc5.item() else: acc, = util.accuracy(logits, labels, topk=(1,)) acc, acc5 = acc.item(), 1 self.loss_meters.update(loss.item(), labels.shape[0]) self.acc_meters.update(acc, labels.shape[0]) self.acc5_meters.update(acc5, labels.shape[0]) payload = {"acc": acc, "acc_avg": self.acc_meters.avg, "loss": loss, "loss_avg": self.loss_meters.avg, "lr": optimizer.param_groups[0]['lr'], "|gn|": grad_norm} return payload ================================================ FILE: util.py ================================================ import logging import os import numpy as np import torch if torch.cuda.is_available(): torch.backends.cudnn.enabled = True torch.backends.cudnn.benchmark = True torch.backends.cudnn.deterministic = True device = torch.device('cuda') else: device = torch.device('cpu') def _patch_noise_extend_to_img(noise, image_size=[3, 32, 32], patch_location='center'): c, h, w = image_size[0], image_size[1], image_size[2] mask = np.zeros((c, h, w), np.float32) x_len, y_len = noise.shape[1], noise.shape[2] if patch_location == 'center' or (h == w == x_len == y_len): x = h // 2 y = w // 2 elif patch_location == 'random': x = np.random.randint(x_len // 2, w - x_len // 2) y = np.random.randint(y_len // 2, h - y_len // 2) else: raise('Invalid patch location') x1 = np.clip(x - x_len // 2, 0, h) x2 = np.clip(x + x_len // 2, 0, h) y1 = np.clip(y - y_len // 2, 0, w) y2 = np.clip(y + y_len // 2, 0, w) mask[:, x1: x2, y1: y2] = noise return mask def setup_logger(name, log_file, level=logging.INFO): """To setup as many loggers as you want""" formatter = logging.Formatter('%(asctime)s %(message)s') console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) file_handler = logging.FileHandler(log_file) file_handler.setFormatter(formatter) logger = logging.getLogger(name) logger.setLevel(level) logger.addHandler(file_handler) logger.addHandler(console_handler) return logger def log_display(epoch, global_step, time_elapse, **kwargs): display = 'epoch=' + str(epoch) + \ '\tglobal_step=' + str(global_step) for key, value in kwargs.items(): if type(value) == str: display = '\t' + key + '=' + value else: display += '\t' + str(key) + '=%.4f' % value display += '\ttime=%.2fit/s' % (1. / time_elapse) return display def accuracy(output, target, topk=(1,)): maxk = max(topk) batch_size = target.size(0) _, pred = output.topk(maxk, 1, True, True) pred = pred.t() correct = pred.eq(target.view(1, -1).expand_as(pred)) res = [] for k in topk: correct_k = correct[:k].view(-1).float().sum(0) res.append(correct_k.mul_(1/batch_size)) return res def save_model(filename, epoch, model, optimizer, scheduler, save_best=False, **kwargs): # Torch Save State Dict state = { 'epoch': epoch+1, 'model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict(), 'scheduler_state_dict': scheduler.state_dict() if scheduler is not None else None } for key, value in kwargs.items(): state[key] = value torch.save(state, filename + '.pth') filename += '_best.pth' if save_best: torch.save(state, filename) return def load_model(filename, model, optimizer, scheduler, **kwargs): # Load Torch State Dict filename = filename + '.pth' checkpoints = torch.load(filename, map_location=device) model.load_state_dict(checkpoints['model_state_dict']) if optimizer is not None and checkpoints['optimizer_state_dict'] is not None: optimizer.load_state_dict(checkpoints['optimizer_state_dict']) if scheduler is not None and checkpoints['scheduler_state_dict'] is not None: scheduler.load_state_dict(checkpoints['scheduler_state_dict']) return checkpoints def count_parameters_in_MB(model): return sum(np.prod(v.size()) for name, v in model.named_parameters() if "auxiliary_head" not in name)/1e6 def build_dirs(path): if not os.path.exists(path): os.makedirs(path) return class AverageMeter(object): """Computes and stores the average and current value""" def __init__(self): self.reset() def reset(self): self.val = 0 self.avg = 0 self.sum = 0 self.count = 0 self.max = 0 def update(self, val, n=1): self.val = val self.sum += val * n self.count += n self.avg = self.sum / self.count self.max = max(self.max, val) def onehot(size, target): vec = torch.zeros(size, dtype=torch.float32) vec[target] = 1. return vec def rand_bbox(size, lam): if len(size) == 4: W = size[2] H = size[3] elif len(size) == 3: W = size[1] H = size[2] else: raise Exception cut_rat = np.sqrt(1. - lam) cut_w = np.int(W * cut_rat) cut_h = np.int(H * cut_rat) # uniform cx = np.random.randint(W) cy = np.random.randint(H) bbx1 = np.clip(cx - cut_w // 2, 0, W) bby1 = np.clip(cy - cut_h // 2, 0, H) bbx2 = np.clip(cx + cut_w // 2, 0, W) bby2 = np.clip(cy + cut_h // 2, 0, H) return bbx1, bby1, bbx2, bby2