From 234033b2b2c455403d090f536a388685de5e055f Mon Sep 17 00:00:00 2001 From: Lucas Tindall Date: Wed, 8 Aug 2018 22:55:53 +0000 Subject: [PATCH] Fix data_download script for TinyImageNet. Updated adversarial regularization(Shokri). --- .gitignore | 2 +- Defenses/Adversarial_Regularization.ipynb | 299 +++++++++++++--------- Utils/data_downloaders.py | 7 + Utils/train.py | 4 +- 4 files changed, 190 insertions(+), 122 deletions(-) diff --git a/.gitignore b/.gitignore index c15467b..a0e3de0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ *.ipynb_checkpoints *.pyc *.zip - +Datasets/* diff --git a/Defenses/Adversarial_Regularization.ipynb b/Defenses/Adversarial_Regularization.ipynb index f20daa2..85023ab 100644 --- a/Defenses/Adversarial_Regularization.ipynb +++ b/Defenses/Adversarial_Regularization.ipynb @@ -11,9 +11,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Python: 3.6.5 (default, Jun 21 2018, 23:07:39) \n", + "[GCC 5.4.0 20160609]\n", + "Pytorch: 0.4.0\n" + ] + } + ], "source": [ "import sys \n", "import os\n", @@ -54,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -74,9 +84,35 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Files already downloaded and verified\n", + "Files already downloaded and verified\n" + ] + }, + { + "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": [ "# define series of transforms to pre process images \n", "transform = torchvision.transforms.Compose([\n", @@ -143,7 +179,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -210,11 +246,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "vgg16 = torchvision.models.vgg16(num_classes=10)\n", + "vgg16 = torchvision.models.vgg16(num_classes=n_classes)\n", "# vgg16 fix for cifar10 image size \n", "vgg16.classifier = nn.Sequential(\n", " nn.Linear(512, 64),\n", @@ -249,7 +285,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -267,12 +303,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def adversarial_train(inference_net, classification_net, train_set, out_set, test_set, \n", - " infer_optim, infer_loss, class_optim, class_loss, n_epochs, k, privacy_theta):\n", + " infer_optim, infer_loss, class_optim, class_loss, n_epochs, k, privacy_theta, verbose=False):\n", " losses = []\n", "\n", " inference_net.train()\n", @@ -369,7 +405,7 @@ " print(\"[%d/%d][%d/%d] loss = %.2f, accuracy = %.2f\" % (epoch, n_epochs, i, len(shadow_train), loss.item(), 100 * correct / total))\n", " ''' \n", " \n", - " if epoch % 20 == 0 and epoch != 0: \n", + " if epoch % 20 == 0 and epoch != 0 and verbose: \n", "\n", " plt.figure()\n", " sns.distplot(train_p,label='maximum train posterior')\n", @@ -384,7 +420,7 @@ " print(\"[%d/%d] Inference accuracy = %.2f%%, Classification accuracy = %.2f%%\" % (epoch, n_epochs, inference_accuracy, classification_accuracy))\n", " \n", " \n", - "def train_attacker(attack_net, target_net, attack_train, attack_out, optimizer, criterion, n_epochs):\n", + "def train_attacker(attack_net, target_net, attack_train, attack_out, optimizer, criterion, n_epochs, verbose=False):\n", " losses = []\n", "\n", " target_net.eval()\n", @@ -435,8 +471,8 @@ " correct += (out_inference<0.5).sum().item()\n", " total += train_inference.size(0) + out_inference.size(0)\n", "\n", - "\n", - " print(\"[%d/%d][%d/%d] loss = %.2f, accuracy = %.2f\" % (epoch, n_epochs, i, len(attack_train), loss.item(), 100 * correct / total))\n" + " if verbose: \n", + " print(\"[%d/%d][%d/%d] loss = %.2f, accuracy = %.2f\" % (epoch, n_epochs, i, len(attack_train), loss.item(), 100 * correct / total))\n" ] }, { @@ -448,7 +484,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -486,106 +522,9 @@ " accuracy = 100 * correct / total \n", " precision = true_positives / (true_positives + false_positives) if true_positives + false_positives != 0 else 0\n", " recall = true_positives / (true_positives + false_negatives) if true_positives + false_negatives !=0 else 0\n", - " print(\"accuracy = %.2f, precision = %.2f, recall = %.2f\" % (accuracy, precision, recall))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Training with adversarial regularization " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "adversarial_train(adversarial_regularization_net, target_net, D_loader, D_prime_loader, eval_out_loader,\n", - " adversarial_regularization_optim, adversarial_regularization_loss, target_optim, \n", - " target_loss, n_epochs, 7, 1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Normal training" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "train(undefended_net, D_loader, eval_out_loader, undefended_optim, undefended_loss, n_epochs=100, classes=None, verbose=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train attack networks " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "train_attacker(attack_net, target_net, D_A_loader, D_prime_A_loader, attack_optim, attack_loss, 20)\n", - "train_attacker(attack_net2, undefended_net, D_A_loader, D_prime_A_loader, attack2_optim, attack2_loss, 20)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Attack Results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"\\nAttack performance on Adversarial Regularization Defense Network: \")\n", - "eval_attacker(attack_net, target_net, eval_train_loader, eval_out_loader)\n", - "\n", - "print(\"\\nAttack performance on normal network: \")\n", - "eval_attacker(attack_net2, undefended_net, eval_train_loader, eval_out_loader)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Classification results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"\\nAdversarial Regularization network classification accuracy on training set: \")\n", - "train_accuracy = eval_target_net(target_net, D_loader, classes=None)\n", - "\n", - "print(\"\\nAdversarial Regularization network classification accuracy on test set: \")\n", - "test_accuracy = eval_target_net(target_net, eval_out_loader, classes=None)\n", - "\n", - "print(\"\\nNormal network classification accuracy on training set: \")\n", - "train_accuracy = eval_target_net(undefended_net, D_loader, classes=None)\n", - "\n", - "print(\"\\nNormal network classification accuracy on test set: \")\n", - "test_accuracy = eval_target_net(undefended_net, eval_out_loader, classes=None)" + " print(\"accuracy = %.2f, precision = %.2f, recall = %.2f\" % (accuracy, precision, recall))\n", + " \n", + " return accuracy \n" ] }, { @@ -644,14 +583,18 @@ }, "outputs": [], "source": [ - "for lambd in [0, 1, 3, 5]: \n", + "# tuples of (lambda, attack_accuracy, classification_train_accuracy, classification_test_accuracy)\n", + "adv_reg_metrics = []\n", + "\n", + "\n", + "for lambd in [0, 1, 2, 3, 10]: \n", " adversarial_regularization_net = inference_attack(n_classes).to(device)\n", " adversarial_regularization_net.apply(models.weights_init)\n", "\n", " adversarial_regularization_loss = nn.BCELoss()\n", " adversarial_regularization_optim = optim.Adam(adversarial_regularization_net.parameters(), lr=lr_inference)\n", " \n", - " vgg16 = torchvision.models.vgg16(num_classes=10)\n", + " vgg16 = torchvision.models.vgg16(num_classes=n_classes)\n", " # vgg16 fix for cifar10 image size \n", " vgg16.classifier = nn.Sequential(\n", " nn.Linear(512, 64),\n", @@ -682,7 +625,7 @@ " train_attacker(attack_net, target_net, D_A_loader, D_prime_A_loader, attack_optim, attack_loss, 20)\n", " \n", " print(\"\\nAttack performance on Adversarial Regularization Defense Network: \")\n", - " eval_attacker(attack_net, target_net, eval_train_loader, eval_out_loader)\n", + " attack_accuracy = eval_attacker(attack_net, target_net, eval_train_loader, eval_out_loader)\n", " \n", " \n", " print(\"\\nAdversarial Regularization network classification accuracy on training set: \")\n", @@ -691,7 +634,123 @@ " print(\"\\nAdversarial Regularization network classification accuracy on test set: \")\n", " test_accuracy = eval_target_net(target_net, eval_out_loader, classes=None)\n", "\n", - " " + " adv_reg_metrics.append((lambd,attack_accuracy, train_accuracy, test_accuracy))\n", + " \n", + " torch.save(target_net.state_dict(), './adv_reg_net_%d.pth' % lambd)\n", + " \n", + "\n", + "print(adv_reg_metrics)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train with L2 regularization " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# tuples of (l2_factor, attack_accuracy, classification_train_accuracy, classification_test_accuracy)\n", + "l2_reg_metrics = []\n", + "\n", + "\n", + "for l2 in [0, 0.001, 0.005, 0.01]: \n", + " \n", + " vgg16 = torchvision.models.vgg16(num_classes=n_classes)\n", + " # vgg16 fix for cifar10 image size \n", + " vgg16.classifier = nn.Sequential(\n", + " nn.Linear(512, 64),\n", + " nn.ReLU(True),\n", + " nn.Dropout(),\n", + " nn.Linear(64, 64),\n", + " nn.ReLU(True),\n", + " nn.Dropout(),\n", + " nn.Linear(64, n_classes),\n", + " )\n", + "\n", + " target_net = vgg16.to(device)\n", + " target_net.apply(models.weights_init)\n", + " target_loss = nn.CrossEntropyLoss()\n", + " target_optim = optim.Adam(target_net.parameters(), lr=lr_classification, weight_decay=l2)\n", + " \n", + " \n", + " train(target_net, D_loader, eval_out_loader, target_optim, target_loss, \n", + " n_epochs=100, classes=None, verbose=False)\n", + " \n", + " attack_net = inference_attack(n_classes).to(device)\n", + " attack_net.apply(models.weights_init)\n", + "\n", + " attack_loss = nn.BCELoss()\n", + " attack_optim = optim.Adam(attack_net.parameters(), lr=lr_attack)\n", + " \n", + " train_attacker(attack_net, target_net, D_A_loader, D_prime_A_loader, attack_optim, attack_loss, 20)\n", + " \n", + " print(\"\\nAttack performance on L2 regularized Network: \")\n", + " attack_accuracy = eval_attacker(attack_net, target_net, eval_train_loader, eval_out_loader)\n", + " \n", + " \n", + " print(\"\\nL2 regularized network classification accuracy on training set: \")\n", + " train_accuracy = eval_target_net(target_net, D_loader, classes=None)\n", + "\n", + " print(\"\\nL2 regularized network classification accuracy on test set: \")\n", + " test_accuracy = eval_target_net(target_net, eval_out_loader, classes=None)\n", + "\n", + " l2_reg_metrics.append((l2,attack_accuracy, train_accuracy, test_accuracy))\n", + " \n", + " torch.save(target_net.state_dict(), './l2_reg_net_%.3f.pth' % l2)\n", + "print(l2_reg_metrics)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'''\n", + "# Base run \n", + "\n", + "\n", + "# Training with adversarial regularization \n", + "adversarial_train(adversarial_regularization_net, target_net, D_loader, D_prime_loader, eval_out_loader,\n", + " adversarial_regularization_optim, adversarial_regularization_loss, target_optim, \n", + " target_loss, n_epochs, 7, 1)\n", + "\n", + "# Normal training \n", + "train(undefended_net, D_loader, eval_out_loader, undefended_optim, undefended_loss, n_epochs=100, classes=None, verbose=True)\n", + "\n", + "# Train attack networks \n", + "train_attacker(attack_net, target_net, D_A_loader, D_prime_A_loader, attack_optim, attack_loss, 20)\n", + "train_attacker(attack_net2, undefended_net, D_A_loader, D_prime_A_loader, attack2_optim, attack2_loss, 20)\n", + "\n", + "# Attack results \n", + "\n", + "print(\"\\nAttack performance on Adversarial Regularization Defense Network: \")\n", + "eval_attacker(attack_net, target_net, eval_train_loader, eval_out_loader)\n", + "\n", + "print(\"\\nAttack performance on normal network: \")\n", + "eval_attacker(attack_net2, undefended_net, eval_train_loader, eval_out_loader)\n", + "\n", + "\n", + "# Classification results \n", + "\n", + "print(\"\\nAdversarial Regularization network classification accuracy on training set: \")\n", + "train_accuracy = eval_target_net(target_net, D_loader, classes=None)\n", + "\n", + "print(\"\\nAdversarial Regularization network classification accuracy on test set: \")\n", + "test_accuracy = eval_target_net(target_net, eval_out_loader, classes=None)\n", + "\n", + "print(\"\\nNormal network classification accuracy on training set: \")\n", + "train_accuracy = eval_target_net(undefended_net, D_loader, classes=None)\n", + "\n", + "print(\"\\nNormal network classification accuracy on test set: \")\n", + "test_accuracy = eval_target_net(undefended_net, eval_out_loader, classes=None)\n", + "'''" ] } ], diff --git a/Utils/data_downloaders.py b/Utils/data_downloaders.py index 8f57419..8ae5742 100644 --- a/Utils/data_downloaders.py +++ b/Utils/data_downloaders.py @@ -6,6 +6,10 @@ def get_tiny_imagenet(datasets_dir): + + if os.path.isdir(os.path.join(datasets_dir,'tiny-imagenet-200/val/images/')): + os.rmdir(os.path.join(datasets_dir,'tiny-imagenet-200/val/images/')) + if os.path.isdir(os.path.join(datasets_dir,'tiny-imagenet-200')): print('Tiny ImageNet already downloaded.') return @@ -49,6 +53,9 @@ def get_tiny_imagenet(datasets_dir): old_file_name = os.path.join(datasets_dir,'tiny-imagenet-200/val/images',line[0]) os.rename(old_file_name, new_file_name) + + + print('Tiny ImageNet successfully downloaded and preprocessed.') diff --git a/Utils/train.py b/Utils/train.py index f52174f..aeb0e65 100644 --- a/Utils/train.py +++ b/Utils/train.py @@ -33,8 +33,10 @@ def train(net, data_loader, test_loader, optimizer, criterion, n_epochs, classes # evaluate performance on testset at the end of each epoch print("[%d/%d]" %(epoch, n_epochs)) + print("Training:") + eval_target_net(net, data_loader, classes=classes) + print("Test:") eval_target_net(net, test_loader, classes=classes) - #plt.plot(losses) #plt.show()