{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","collapsed":true,"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":false},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.\n\nimport shutil\nimport os\nRESULTS_FILE_PATH = '../data/cats_dogs/test/'\n\n# move all files to labeled folders dog = 1 , cat= 2\nfilelist = [ f for f in os.listdir(RESULTS_FILE_PATH) if  f.endswith(\".jpg\") ]\nfor file in filelist:\n    print file\n    label = file.split('.')[0].replace('dog','1').replace('cat','2')\n    if not os.path.isdir(RESULTS_FILE_PATH+label):\n        print('new directry has been created')\n        os.system('mkdir ' + RESULTS_FILE_PATH+label)\n    shutil.move( RESULTS_FILE_PATH + file, RESULTS_FILE_PATH + label+'/'+file)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","collapsed":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":false},"cell_type":"code","source":"\nimport torch \nimport torch.nn as nn\nimport torchvision.datasets as dsets\nimport torchvision.transforms as transforms\nfrom torch.autograd import Variable\n\n# Hyper Parameters\nnum_epochs = 1000\nbatch_size = 100\nlearning_rate = 0.01\nhidden_size = 20\n\n\n# best model for saving\nbest_model = 0.1\n# Image Preprocessing \ntransform_train = transforms.Compose([\n    transforms.RandomHorizontalFlip(),\n    transforms.ToTensor(),\n    transforms.Normalize((0.4914, 0.4822, 0.4465),\n                            (0.247, 0.2434, 0.2615)),\n])\ntransform_test = transforms.Compose([\n    transforms.ToTensor(),\n    transforms.Normalize((0.4914, 0.4822, 0.4465),\n                         (0.247, 0.2434, 0.2615)),\n])\n\n# define a model:\nclass CNN(nn.Module):\n    def __init__(self):\n        super(CNN, self).__init__()\n        self.layer1 = nn.Sequential(\n            nn.Conv2d(3,16 , kernel_size=3, padding=1),\n            nn.ReLU(),\n            nn.MaxPool2d(2,stride = 2))\n        self.layer2 = nn.Sequential(\n            nn.Conv2d(16, 20, kernel_size=5, padding=2),\n            nn.ReLU(),\n            nn.MaxPool2d(2, stride = 2))\n        self.layer3 = nn.Sequential(\n            nn.Conv2d(20, 20, kernel_size=5, padding=2),\n            nn.ReLU(),\n            nn.MaxPool2d(2, stride = 2))\n        self.fc1 = nn.Linear(4*4*20, 3)\n        self.dropout = nn.Dropout(p=0.2)\n        self.relu = nn.ReLU()\n        self.logsoftmax = nn.LogSoftmax()\n        \n    def forward(self, x):\n        out = self.layer1(x)\n        out = self.layer2(out)\n        out = self.layer3(out)\n        out = out.view(out.size(0), -1)\n        out = self.fc1(out)\n        return self.logsoftmax(out)\n    \n\n\n\ndef to_var(x):\n    if torch.cuda.is_available():\n        x = x.cuda()\n    return Variable(x)\n\ncnn = CNN()\nif torch.cuda.is_available():\n    cnn = cnn.cuda()\n# Hyper Parameters\nnum_epochs = 1000\nbatch_size = 100\nlearning_rate = 0.01\nhidden_size = 28\n\ntransform_train = transforms.Compose([\n    transforms.RandomHorizontalFlip(),\n    transforms.Scale((32,32)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.4914, 0.4822, 0.4465),\n                            (0.247, 0.2434, 0.2615)),\n])\ntransform_test = transforms.Compose([\n    transforms.Scale((32,32)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.4914, 0.4822, 0.4465),\n                         (0.247, 0.2434, 0.2615)),\n])\n\nDATASET_DIR = './data/cats_dogs/'\ndataset_test = torchvision.datasets.ImageFolder(root=DATASET_DIR, transform=transform_test)\n\nDATASET_DIR = './data/cats_dogs/'\ndataset = torchvision.datasets.ImageFolder(root=DATASET_DIR, transform=transform_train)\n\n\ntrain_loader = torch.utils.data.DataLoader(dataset=dataset_test,\n                                           batch_size=batch_size, \n                                           shuffle=True)\n\ntest_loader = torch.utils.data.DataLoader(dataset=dataset,\n                                          batch_size=batch_size, \n                                          shuffle=False)\n\ntest_loader.dataset.classes\n\ncnn = CNN()\nif torch.cuda.is_available():\n    cnn = cnn.cuda()\n\n# convert all the weights tensors to cuda()\n# Loss and Optimizer\n\ncriterion = nn.NLLLoss()\noptimizer = torch.optim.SGD(cnn.parameters(), lr=learning_rate, momentum=0.9)\n\nprint ('number of parameters: ', sum(param.numel() for param in cnn.parameters()))\nreport_str = 'number of parameters: ', sum(param.numel() for param in cnn.parameters())\n# training the model\nfor epoch in range(num_epochs):\n    for i, (images, labels) in enumerate(train_loader):\n        images = to_var(images)\n        labels = to_var(labels)\n        \n        # Forward + Backward + Optimize\n        optimizer.zero_grad()\n        outputs = cnn(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        \n        if (i+1) % 1 == 10:\n            print ('Epoch [%d/%d], Iter [%d/%d] Loss: %.4f' \n                   %(epoch+1, num_epochs, i+1,\n                     len(train_dataset)//batch_size, loss.data[0]))\n\n\n# evaluating the model\n    cnn.eval()\n    correct = 0\n    total = 0\n    current_model = 0\n    for images, labels in test_loader:\n        images = to_var(images)\n        outputs = cnn(images)\n        _, predicted = torch.max(outputs.data, 1)\n        total += labels.size(0)\n        correct += (predicted.cpu() == labels).sum()\n        current_model = (1 - float(correct) / total)\n    print ('Test Error of the model on the 10000 test images: %.4f' % current_model)\n    print ('Best so far :%.4f' % best_model)\n    \n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.5","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}