{"cells":[{"metadata":{},"cell_type":"markdown","source":"# basic cnn from scratch using pytorch lightning\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install torchsummary","execution_count":null,"outputs":[]},{"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.nn.functional as F\nimport torchvision\nfrom torchvision import transforms,datasets\nimport matplotlib.pyplot as plt\nimport torch.optim as optim\nfrom tqdm import tqdm_notebook as tqdm\nimport os\nimport numpy as np\nimport pandas as pd\nimport cv2\nimport zipfile\nreprocess_data = True\nfrom PIL import Image\nfrom torchsummary import summary\nimport time\nfrom torch.utils.tensorboard import SummaryWriter\nimport wandb\nfrom kaggle_secrets import UserSecretsClient\nuser_secrets = UserSecretsClient()\nsecret_value_0 = user_secrets.get_secret(\"wandb_key\")\nimport seaborn as sns\nimport pytorch_lightning as pl\nfrom sklearn.preprocessing import LabelEncoder\nfrom pytorch_lightning import Trainer\nfrom pytorch_lightning.loggers import WandbLogger","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"wandb.login(key=secret_value_0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"gpu available: \",torch.cuda.is_available())\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"device: \",device)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"label_df  =pd.read_csv(\"../input/dog-breed-identification/labels.csv\")\nlabel_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"label_df.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"num_labels = len(list(label_df[\"breed\"].value_counts()))\nprint(\"num of labels is : \",num_labels)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_filelist = label_df[\"id\"]+\".jpg\"\ntrain_filepath  = \"../input/dog-breed-identification/train\"\ntest_filepath = \"../input/dog-breed-identification/test\"\ntest_filelist = os.listdir(test_filepath)\nle = LabelEncoder()\ntrain_lables = le.fit_transform(label_df[\"breed\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Dataset():\n    def __init__(self,dataset_type,filelist,filepath,labels = None,transform = None):\n        self.dataset_type = dataset_type\n        self.filelist = filelist\n        self.filepath = filepath\n        self.transform = transform\n        self.labels = labels\n    def __len__(self):\n        return int(len(self.filelist))\n    def __getitem__(self,index):\n        imgpath = os.path.join(self.filepath,self.filelist[index])\n        img = Image.open(imgpath)\n        label = self.labels[index]\n        if self.transform is not None:\n            img = self.transform(img)\n        if self.dataset_type == \"train\":    \n            return img,label\n        else:\n            return img ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"transformations = transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor()])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = Dataset(\"train\",train_filelist,train_filepath,train_lables,transformations)\ntest =  Dataset(\"test\",test_filelist,test_filepath,transformations)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_set,val_set = torch.utils.data.random_split(train,[round(len(train)*0.8),round(len(train)*0.2)]) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_loader = torch.utils.data.DataLoader(dataset = train_set,batch_size = 64,num_workers = 2)\nval_loader = torch.utils.data.DataLoader(dataset = val_set,batch_size = 64,num_workers = 2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class doggy_vgg_16(pl.LightningModule):\n    def __init__(self):\n        super().__init__()\n        self.train_accuracy = pl.metrics.Accuracy()\n        self.val_accuracy = pl.metrics.Accuracy()\n        self.conv1 = nn.Sequential(\n            nn.Conv2d(3,64,3,padding= 1),\n            nn.ReLU(),\n#             nn.MaxPool2d(2,2),\n#             nn.Dropout(0.1),\n            nn.Conv2d(64,64,3,padding= 1),\n            nn.ReLU(),\n            nn.MaxPool2d((2,2))            \n            ) \n            \n        self.conv2 =   nn.Sequential(\n            nn.Conv2d(64,128,3,padding= 1),\n            nn.ReLU(),\n#             nn.MaxPool2d(2,2),\n#             nn.Dropout(0.1),\n            nn.Conv2d(128,128,3,padding= 1),\n            nn.ReLU(),\n            nn.MaxPool2d((2,2))\n        ) \n        self.conv3 =   nn.Sequential(\n            nn.Conv2d(128,256,3,padding= 1),\n            nn.ReLU(),\n            nn.Conv2d(256,256,3,padding= 1),\n            nn.ReLU(),\n            nn.Conv2d(256,256,3,padding= 1),\n            nn.ReLU(),\n            nn.MaxPool2d((2,2))\n            )\n        self.conv4 =   nn.Sequential(\n            nn.Conv2d(256,512,3,padding= 1),\n            nn.ReLU(),\n            nn.Conv2d(512,512,3,padding= 1),\n            nn.ReLU(),\n            nn.Conv2d(512,512,3,padding= 1),\n            nn.ReLU(),\n            nn.MaxPool2d((2,2))\n            )\n        self.conv5 =   nn.Sequential(\n            nn.Conv2d(512,512,3,padding= 1),\n            nn.ReLU(),\n            nn.Conv2d(512,512,3,padding= 1),\n            nn.ReLU(),\n            nn.Conv2d(512,512,3,padding= 1),\n            nn.ReLU(),\n            nn.MaxPool2d((2,2))\n            )\n        self.fc1 = nn.Sequential(\n        nn.Flatten(),\n        nn.Linear(512*7*7,4096),\n        nn.ReLU(),\n        nn.Dropout(0.5),\n        nn.Linear(4096,4096),\n        nn.ReLU(),\n        nn.Dropout(0.5),\n        nn.Linear(4096,1000)\n        )\n            \n        self.fc2 = nn.Sequential(\n        nn.Linear(1000,120),\n        )\n\n    def forward(self,x):\n        x= self.conv1(x)\n        x= self.conv2(x)\n        x= self.conv3(x)\n        x = self.conv4(x)\n        x = self.conv5(x)\n        x = self.fc1(x)\n        x = self.fc2(x)\n        return F.softmax(x,dim = 1) \n    \n    #pytorch lighning functions\n    def configure_optimizers(self):\n        optimiser = torch.optim.Adam(self.parameters(),lr=0.00001)\n        return optimiser\n    def training_step(self, batch, batch_idx):\n        x, y = batch\n        pred = self(x)\n        loss = F.cross_entropy(pred, y)\n        self.train_accuracy(pred,y)\n        self.log('train_acc_epoch', self.train_accuracy,on_step=False, on_epoch=True,prog_bar=True)\n        return loss \n#     def training_epoch_end(self,output):\n#         self.log('train_acc_epoch', self.train_accuracy(),on_step=True, on_epoch=True)\n    def validation_step(self, batch, batch_idx):\n        x, y = batch\n        pred = self(x)\n        val_loss = F.cross_entropy(pred, y)\n        self.val_accuracy(pred,y)\n        self.log('val_acc_epoch', self.val_accuracy,on_step=False, on_epoch=True,prog_bar=True)\n        return val_loss\n#     def validation_epoch_end(self,outputs):\n#         self.log('train_acc_epoch', self.train_accuracy(),on_step=True, on_epoch=True)\n        \n    \n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"wandb.init(project=\"cnn_pytorch_lightning_dog_breeds\",reinit=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = doggy_vgg_16()\nmodel.to(device)\nsummary(model,(3,224,224))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"wandb_logger = WandbLogger()\nwandb_logger.watch(model, log='gradients', log_freq=100)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"trainer = Trainer(gpus=1,max_epochs = 20,logger=wandb_logger)\ntrainer.fit(model,train_loader,val_loader)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"wandb.finish()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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}