{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "fc59dc5a", "metadata": {}, "outputs": [], "source": [ "# demo using ResNet-18 model with cifar 10 dataset\n", "import os\n", "import numpy as np \n", "import matplotlib.pyplot as plt\n", "import torch \n", "import torch.nn as nn \n", "from torch.utils.data import DataLoader\n", "from torch.autograd import grad \n", "import torchvision \n", "import torchvision.models as models \n", "from torchvision import datasets, transforms \n", "from torchvision.utils import save_image \n", "import inversefed \n", "from models.cifar10_models.resnet import resnet18\n", "# trained cifar model can get from https://github.com/huyvnphan/PyTorch_CIFAR10\n", "from utils.stackeddata import StackedData\n", "\n", "# gpu \n", "device = 'cpu'\n", "if torch.cuda.is_available():\n", " device = 'cuda'" ] }, { "cell_type": "code", "execution_count": 2, "id": "c4411e0b", "metadata": {}, "outputs": [], "source": [ "data_root = 'data/cifar_data' # dir to store cifar data \n", "cifar_mean, cifar_std = inversefed.consts.cifar10_mean, inversefed.consts.cifar10_std\n", "dm = torch.as_tensor(cifar_mean)[:, None, None].to(device)\n", "ds = torch.as_tensor(cifar_std)[:, None, None].to(device)\n", "transform = transforms.Compose([transforms.ToTensor(),\n", " transforms.Normalize(cifar_mean, cifar_std)])\n", "test_dataset = datasets.CIFAR10(root=data_root, download=False, train=False, transform=transform)\n", "data_shape = (3, 32, 32)\n", "classes = test_dataset.classes\n", "model = resnet18(pretrained=True) # pretrained=True, load trained model \n", "model = model.to(device)\n", "model.eval()\n", "criterion = nn.CrossEntropyLoss() " ] }, { "cell_type": "code", "execution_count": 3, "id": "10146dd3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ground truth label: airplane Ground truth model prediction: ship\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "idx = 1001 # idx of test data with wrong pred\n", "gt_data, gt_label = test_dataset[idx]\n", "gt_data = gt_data.unsqueeze(dim=0).to(device)\n", "with torch.no_grad(): \n", " model.zero_grad() \n", " gt_prediction = model(gt_data)\n", "\n", "# original data \n", "plt.imshow((gt_data[0].cpu() * ds.cpu() + dm.cpu()).permute(1,2,0))\n", "print('Ground truth label: {} Ground truth model prediction: {}'.format(classes[gt_label], classes[torch.max(gt_prediction, axis=1)[1]]))" ] }, { "cell_type": "code", "execution_count": 4, "id": "a5ae2829", "metadata": {}, "outputs": [], "source": [ "# create stacked data\n", "stacked = StackedData(stack_size=4, model_name='resnet18', dataset_name='cifar10', dataset=test_dataset, save_output=True, device=device) \n", "stack_data = stacked.create_stacked_data([idx])\n", "\n", "for i in range(len(stack_data['gt_img'])): \n", " gt_img, gt_label = stack_data['gt_img'][i], stack_data['gt_label'][i]\n", " stack_pred = model(gt_img)\n", " target_loss = criterion(stack_pred, gt_label)\n", " input_grad = grad(target_loss, model.parameters())\n", " input_grad =[grad.detach() for grad in input_grad]\n", " config = dict(signed=True,\n", " boxed=False,\n", " cost_fn='sim',\n", " indices='def',\n", " norm='none',\n", " weights='equal',\n", " lr=0.1, \n", " optim='adam',\n", " restarts=1,\n", " max_iterations=1200,\n", " total_variation=0.1,\n", " init='randn',\n", " filter='none',\n", " lr_decay=True,\n", " scoring_choice='loss')\n", " \n", " # inverting gradients \n", " rec_machine = inversefed.GradientReconstructor(model, (dm, ds), config, num_images=gt_img.shape[0])\n", " results = rec_machine.reconstruct(input_grad, gt_label, gt_img ,img_shape=data_shape)\n", " output_img, stats = results" ] }, { "cell_type": "code", "execution_count": 5, "id": "b5ba1b63", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predictions for recontructed images: ['airplane', 'ship', 'airplane', 'airplane']\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "with torch.no_grad(): \n", " rec_pred = model(output_img)\n", " print('Predictions for recontructed images: ', [classes[l] for l in torch.max(rec_pred, axis=1)[1]])\n", " stacked.grid_plot(idx, output_img, rec_pred, dm, ds)" ] }, { "cell_type": "code", "execution_count": null, "id": "d1171efd", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "env1", "language": "python", "name": "env1" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 5 }