{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import torch\nfrom torchvision import datasets,transforms","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"%matplotlib inline\n%config InlineBackend.figure_format = 'retina'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"bbbc7a1f9c6658428aa5ff26f0b2ab07c3b2a869"},"cell_type":"code","source":"import matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ea0fc396b1bd7e38e1dbebb77be16c5a0e235dd9"},"cell_type":"code","source":"import numpy as np","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"62ccfb1940facc8feb8f965f36914aef1b3b29b9"},"cell_type":"code","source":"DirTrain = \"../input/me-cat\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9f986d0a8e33253941679c5b57e5a9d528eb4a11"},"cell_type":"code","source":"DirTest = \"../input/udacitypytorchchallengecat-dog/cat_dog_data/Cat_Dog_data/test\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8e1c495de74547081e40707243e4ea45208d161b"},"cell_type":"code","source":"!ls ../input/udacitypytorchchallengecat-dog/cat_dog_data/Cat_Dog_data/test","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"da90c04cebf20e51282238fc3af48a725b549365"},"cell_type":"code","source":"!ls ../input/me-cat","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e735a5cb57f9d0ec61ff07006159b2e3df62243c"},"cell_type":"code","source":"from torchvision import models","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5036c3bc0b1dc9bdd748e6a7e75392a87d69a31a"},"cell_type":"code","source":"train_transform = transforms.Compose([transforms.RandomRotation(30),\n                                     transforms.RandomResizedCrop(224),\n                                     \n                                     transforms.RandomHorizontalFlip(),\n                                      transforms.ToTensor(),\n                                     transforms.Normalize([0.5,0.5,0.5],\n                                                         [0.5,0.5,0.5])])\ntest_transform = transforms.Compose([transforms.Resize(255),\n                                    transforms.CenterCrop(224),\n                                    transforms.ToTensor(),\n                                    transforms.Normalize([0.5,0.5,0.5],\n                                                         [0.5,0.5,0.5])\n                                    ])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8815bbb6c19a580764df7a879b896c2db463c538"},"cell_type":"code","source":"trainData  = datasets.ImageFolder(DirTrain,transform  = train_transform)\ntestData = datasets.ImageFolder(DirTest, transform = test_transform)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6e6966e2d478345a0aacf5b735465b1ea5b22168"},"cell_type":"code","source":"trainData = torch.utils.data.DataLoader(trainData,batch_size = 32)\ntestData = torch.utils.data.DataLoader(testData,batch_size = 32)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9fc3c37e3d51062cd8a828ff76379f728c91e89f"},"cell_type":"code","source":"\ndef imshow(image, ax=None, title=None, normalize=True):\n    \"\"\"Imshow for Tensor.\"\"\"\n    if ax is None:\n        fig, ax = plt.subplots()\n    image = image.numpy().transpose((1, 2, 0))\n\n    if normalize:\n        mean = np.array([0.485, 0.456, 0.406])\n        std = np.array([0.229, 0.224, 0.225])\n        image = std * image + mean\n        image = np.clip(image, 0, 1)\n\n    ax.imshow(image)\n    ax.spines['top'].set_visible(False)\n    ax.spines['right'].set_visible(False)\n    ax.spines['left'].set_visible(False)\n    ax.spines['bottom'].set_visible(False)\n    ax.tick_params(axis='both', length=0)\n    ax.set_xticklabels('')\n    ax.set_yticklabels('')\n\n    return ax","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c6dfc64e06caa424e1bd6fe1d5b6528c84d683c6"},"cell_type":"code","source":"images,labels = next(iter(trainData))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a196fc65c4cfd7826b3d0cafe197247eeb96f417"},"cell_type":"code","source":"imshow(images[0])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d7c4a5f588e254a78c1607e83a3853fc1167b617"},"cell_type":"code","source":"model = models.densenet121(pretrained = True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0daeffdc75c678c1c2da4fbdd238171d015d00d4"},"cell_type":"code","source":"model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3b7cd831291f2ce5c6d09784f5db46e5627321e8"},"cell_type":"code","source":"#time to freeze the gradients\nfor params in model.parameters():\n    params.require_gad = False","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a9ef2f0971273a3238b5415779a6eb6e0be9c910"},"cell_type":"code","source":"from collections import OrderedDict","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"40fd8727bf564d7d96d410d11a2d6054a3a6deb3"},"cell_type":"code","source":"from torch import nn\nimport torch.nn.functional as F  ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1a6210aac6383e84b7c44315b64013a0cdbae556"},"cell_type":"code","source":"classifier = nn.Sequential(OrderedDict([\n                        (\"fc1\",nn.Linear(1024,500)),\n                        (\"relu\",nn.ReLU()),\n                        (\"fc2\",nn.Linear(500,2)),\n                        (\"output\",nn.LogSoftmax(dim=1))\n]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"22c91991e3c2f08e8bda941c3666bc7f6b307342"},"cell_type":"code","source":"model.classifier = classifier","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"89362e17c6c01953abef5f3fb759ebb565ba97b2"},"cell_type":"code","source":"model.to('cuda')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"eaeb2a933ede7f4814cd441b02ff0cc52b342144"},"cell_type":"code","source":"train_loss = []\ntest_loss = []\nepoch = 10\nstep = 0\nprint_every = 5\ncriterion = nn.NLLLoss()\nfrom torch import optim\noptimizer = optim.Adam(classifier.parameters(),lr = 0.003)\nfor e in range(epoch):\n    runningLoss = 0\n    for images, labels in trainData:\n        step+=1\n        images = images.to(\"cuda\")\n        labels = labels.to(\"cuda\")\n        \n        optimizer.zero_grad()\n        \n        logps = model(images)\n        loss = criterion(logps,labels)\n        loss.backward()\n        optimizer.step()\n                         \n        runningLoss +=loss.item()\n                         \n        if step%print_every == 0:\n            loss = 0\n            accuracy=0\n            model.eval()\n            with torch.no_grad():\n                for images,labels in testData:\n                    images = images.to(\"cuda\")\n                    labels = labels.to(\"cuda\")\n                    logps = model.forward(images)\n                    batch_loss= criterion(logps,labels)\n                         \n                    loss+=batch_loss.item()\n                \n                    pred = torch.exp(logps)\n                    _,top_class = pred.topk(1,dim=1)\n                    equal= top_class == labels.view(*top_class.shape)\n                    accuracy += torch.mean(equal.type(torch.FloatTensor)).item()\n            train_loss.append(runningLoss/len(trainData))\n            test_loss.append(loss/len(testData))\n            print(\"the epoch {}/{}...\".format(e+1,epoch),\n                  \"the training loss {:.3f}\".format(runningLoss/len(trainData)),\n                  \"the test loss {:.3f}\".format(loss/len(testData)),\n                  \"the accuracy {:.3f}\".format(accuracy/len(testData))\n                 )\n            model.train()\n            runningLoss = 0\n    \n                \n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9935f8043bd97a0e9859bdce0229ab712a0fe391"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}