{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torch.nn.functional as F\nfrom torch.utils.data import DataLoader\nimport torchvision.datasets as datasets\nimport torchvision.transforms as transforms\nfrom torch.utils.data import Dataset, DataLoader\nimport numpy as np\nimport pandas as pd\nimport os\nimport numpy\nimport glob\nimport cv2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#https://stackoverflow.com/questions/49537604/how-to-read-multiple-images-from-multiple-folders-in-python\nfolders = glob.glob('../input/flowers-recognition/flowers/flowers/*')\nimagenames_list = []\nfor folder in folders:\n    for f in glob.glob(folder+'/*.jpg'):\n        imagenames_list.append(f)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def label_img(image):\n    word_label = image.split('/')[4]\n    if word_label == 'daisy':\n        return [1,0,0,0,0]\n    elif word_label == 'dandelion':\n        return [0,1,0,0,0]\n    elif word_label == 'rose':\n        return [0,0,1,0,0]\n    elif word_label == 'tulip':\n        return [0,0,0,1,0]\n    else:\n        return [0,0,0,0,1]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = []        \n\nfor image in imagenames_list:\n    label = label_img(image)\n    train.append([np.array(cv2.resize(cv2.imread(image),(224,224))), np.array(label)])\n    np.random.shuffle(train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_numpy = np.array([i[0] for i in train])\nY_numpy = np.array([i[1] for i in train])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#select first couple of samples just for easy training\nX_numpy = X_numpy[:64]\nY_numpy = Y_numpy[:64]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_torch = torch.from_numpy(X_numpy)\nY_torch = torch.from_numpy(Y_numpy)\n\nX_torch_flt = X_torch.float()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class VGGDataset(Dataset):\n    \n    def __init__(self):\n        #data loading\n        self.X = X_torch_flt\n        self.Y = Y_torch\n        self.n_samples = X_numpy.shape[0]\n        \n    def __getitem__(self, index):\n        return self.X[index], self.Y[index]\n    \n    def __len__(self):\n        return self.n_samples","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dataset = VGGDataset()\ndataloader = DataLoader(dataset = dataset, shuffle = True, batch_size = 32)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"VGG16 = [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"21e88ad3bce3f9ba111b2308b7a4bf0eb1ed44ae"},"cell_type":"code","source":"class VGG(nn.Module):\n    def __init__(self, in_channels=3, num_classes=5):\n        super(VGG,self).__init__()\n        self.in_channels = in_channels\n        self.conv_layers = self.create_conv_layers(VGG16)\n        self.fcs = nn.Sequential(\n            nn.Linear(512*7*7, 4096),\n            nn.ReLU(),\n            nn.Dropout(p=0.5),\n            nn.Linear(4096,4096),\n            nn.ReLU(),\n            nn.Dropout(p=0.5),\n            nn.Linear(4096, num_classes)\n        )\n        \n    def forward(self, x):\n        x = self.conv_layers(x)\n        x = x.reshape(x.shape[0], -1)\n        x = self.fcs(x)\n        return F.log_softmax(x, dim=1)\n    \n    def create_conv_layers(self, architecture):\n        layers = []\n        in_channels = self.in_channels\n        \n        for x in architecture:\n            if type(x)  == int:\n                out_channels = x\n                \n                layers += [nn.Conv2d(in_channels=in_channels, out_channels=out_channels,\n                                    kernel_size=(3,3), stride=(1,1), padding=(1,1)),\n                          nn.BatchNorm2d(x),\n                          nn.ReLU()]\n                in_channels = x\n            elif x == 'M':\n                layers += [nn.MaxPool2d(kernel_size=(2,2), stride=(2,2))]\n                    \n        return nn.Sequential(*layers)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = VGG()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"optimizer = torch.optim.SGD(model.parameters(), lr=0.01)\ncriterion = nn.CrossEntropyLoss()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for epoch in range(1):\n    for i, (X, Y) in enumerate(dataloader):\n    \n        #Forward Pass: Compute predicted Y by passing X through the model\n        #reshaping from (224,224,3) to (3,224,224): https://stackoverflow.com/questions/56789038/runtimeerror-given-groups-1-weight-of-size-64-3-3-3-expected-input4-50\n        y_pred = model(X.permute(0, 3, 1, 2))\n    \n        #Compute and print loss\n        #multi-class output not support: https://discuss.pytorch.org/t/runtimeerror-multi-target-not-supported-newbie/10216/4\n        loss = criterion(y_pred, torch.max(Y, 1)[1])\n        print(epoch, loss.item())\n    \n        #Zero Gradients, Backwards Pass, and Update Weights\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Resources: https://www.youtube.com/watch?v=113b7O3mabY\n\nVGG Code:  https://www.youtube.com/watch?v=ACmuBbuXn20 \n\nVGG Paper: https://arxiv.org/pdf/1409.1556.pdf"}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}