{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport matplotlib.pyplot as plt\nimport torch\nfrom torch.utils.data import Dataset, DataLoader\n\nfrom torch.nn import Conv2d as conv\nfrom torch.nn import MaxPool2d as maxpool\nfrom torch.nn import MaxUnpool2d as unpool\nfrom torch.nn import ReLU as relu\nfrom torch.nn import Softmax as softmax\nfrom torch.nn import BatchNorm2d as bn\nfrom torch.nn import Dropout as drop\nfrom torch.nn import Dropout2d as drop2d\nfrom torch.nn import Linear as fc\nfrom torch.nn import ConvTranspose2d as convT\nfrom torch.nn import Identity\nfrom torch.nn import MSELoss  as MSE\nfrom torch.nn import Sequential\nimport albumentations as albu\nimport torch.optim as optim\nfrom torch.optim import lr_scheduler, Adam\nfrom PIL import Image\nfrom tqdm import tqdm\nfrom albumentations import (HorizontalFlip,VerticalFlip, ShiftScaleRotate, Normalize, Resize, Compose, GaussNoise,RandomRotate90,Transpose,RandomBrightnessContrast,RandomCrop)\nfrom albumentations.pytorch import ToTensor\nfrom sklearn.preprocessing import LabelEncoder","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dir = '/kaggle/input/dog-breed-identification/train/'\ntest_dir = '/kaggle/input/dog-breed-identification/test/'\ndata = pd.read_csv('/kaggle/input/dog-breed-identification/labels.csv' )\n# LE = LabelEncoder()\n# train_df['breed'] = LE.fit_transform(train_df['breed'])\ndata.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\ntrain_df, val_df = train_test_split(data, test_size = 0.2, shuffle = True, random_state = 0)\ntrain_df.head(), val_df.head()\ntrain_encod = pd.get_dummies(train_df['breed'])\nval_encod = pd.get_dummies(val_df['breed'])\ntrain_df = pd.concat([train_df, train_encod], axis = 1).drop('breed', axis =1)\nval_df = pd.concat([val_df, val_encod], axis = 1).drop('breed', axis =1)\ntest_df = pd.read_csv('../input/dog-breed-identification/sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head(), val_df.head(), test_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Data(Dataset):\n    def __init__(self, csv:pd.DataFrame, root_dir,  mode='train' ):\n        \"\"\"\n        -csv: pd dataframe\n        -root_dir: root_dir for images\n        \"\"\"\n        super(Data, self).__init__()\n        self.data = csv\n        self.root_dir = root_dir\n        if mode== 'train':\n            self.trans = albu.Compose([\n                                        albu.SmallestMaxSize(256),\n                                        albu.RandomCrop(256,256),\n                                        albu.HorizontalFlip(p=0.5),\n                                        albu.Cutout(),\n                                        albu.RGBShift(),\n                                        albu.HueSaturationValue(),\n                                        albu.RandomContrast(),\n                                        albu.GaussNoise(),\n                                        albu.GaussianBlur(),\n                                        albu.RandomBrightnessContrast(),\n                                        albu.Rotate(limit=(-90,90)),\n                                        albu.Normalize((0.485, 0.456, 0.406),(0.229, 0.224, 0.225))\n            ])\n        else:\n            self.trans = albu.Compose([\n                                        albu.Resize(256,256),\n                                        albu.Normalize((0.485, 0.456, 0.406),(0.229, 0.224, 0.225))\n        ])\n            \n    def __len__(self):\n        return len(self.data)\n    \n    def __getitem__(self, idx):\n        \"\"\"\n        -idx: index of data example\n\n        Returns a dictionary containing\n        'rgb' : color image(output)\n        'gray' : grayscale image(input)\n        \"\"\"\n        \n        if torch.is_tensor(idx):\n            idx = idx.tolist()\n        img_name = self.root_dir+self.data.iloc[idx, 0] +  '.jpg'\n        img = Image.open(img_name)\n        label = None\n        img = self.trans(image=np.array(img))['image']\n        img = np.transpose(img,(2,0,1)).astype(np.float32)\n        img = torch.tensor(img, dtype = torch.float)\n        label =int( np.argmax(self.data.iloc[idx,  1:].to_numpy(), axis = -1))\n        out = { 'img' : img, 'label': label}\n        \n        return out","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data = Data(train_df, train_dir , mode= 'train')\ntrain_loader = DataLoader(train_data, batch_size = 128)\nval_data = Data(val_df, train_dir, mode = 'val') \nval_loader = DataLoader(val_data, batch_size = 128)\ntest_data = Data(test_df, test_dir, mode = 'test')\ntest_loader =  DataLoader(test_data, batch_size = 128, shuffle = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def grad(model):\n    for param in model.parameters():\n        param.requires_grad =False","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import torch\nmodel = torch.hub.load('pytorch/vision:v0.6.0', 'resnet152', pretrained=True)\nmodel = model.apply(grad)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fc = Sequential(fc(2048, 1024), \n                      relu(), \n                      fc(1024, 512), \n                      relu(), \n                      fc(512, 120)) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"params = [ p for p in  model.parameters() if p.requires_grad]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nmodel = model.to(device)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"criterion = torch.nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.fc.parameters(), lr=0.001, weight_decay = 0.001)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"infnum_epoch = 15\nrunning_loss = 0\ntrain_loss_list = []\nval_loss_list = []\nprev_loss = float('inf')\nnum_train = len(train_df)\nnum_val = len(val_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#######################################################################################TRAINING###################################################################################################\nfor i in tqdm(range(num_epoch)):\n    os.system('clear')\n    print('*'*75, 'TRAIN PHASE', '*'*75)\n    train_acc = 0\n    val_acc = 0\n    running_train_loss = 0\n    val_running_loss = 0\n    for j, batch in enumerate(train_loader):\n        inputs = batch['img'].to(device)\n        output = batch['label'].to(device)\n        optimizer.zero_grad()\n        y_hat = model(inputs)\n        train_loss = criterion(y_hat, output)\n        train_loss.backward()\n        optimizer.step()\n        train_loss_list.append(train_loss.item())\n        running_train_loss += train_loss\n        label_ = torch.argmax(y_hat, dim = 1)\n        train_acc += torch.mean((label_ == output).type('torch.FloatTensor')*1)/num_train\n        if j%10 == 9:\n            print('[ Epoch: %3d, Mini_batch: %5d  ------------>>>>>>>>>>>>>>    train_loss: %.5f]'%(i+1, (j+1)//10, train_loss))\n    print('*'*72, 'VALIDATION PHASE', '*'*72)\n    for j, batch in enumerate(val_loader):\n        inputs = batch['img'].to(device)\n        output = batch['label'].to(device)\n        y_hat = model(inputs)\n        val_loss = criterion(y_hat, output)\n        \n        val_running_loss += val_loss.item()\n        label_ = torch.argmax(y_hat, dim = 1)\n        val_acc += torch.mean((label_ == output).type('torch.FloatTensor')*1)/num_train\n        val_loss_list.append(val_loss)\n        if j%10 == 9:\n            print('[ Epoch: %3d, Mini_batch: %5d------------>>>>>>>>>>>>>>    val_loss: %.5f]'%(i+1, (j+1)//10, val_loss))\n    print(' Train Accuracy: {%.3f}, Val Accuracy: {%.3f}'%(train_acc, val_acc))\n    if val_running_loss<prev_loss:\n        prev_loss = val_running_loss\n        torch.save(model.state_dict(), 'model.pth')\n    fig,a =  plt.subplots(1,2)\n    a[0].set_title('Train Loss')\n    a[1].set_title('VAL Loss')\n    a[0].plot( 1 + np.arange(len(train_loss_list)), train_loss_list)\n    a[1].plot( 1 + np.arange(len(val_loss_list)), val_loss_list)\n    plt.show()\n    #after calculating error per epoch","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"    fig,a =  plt.subplots(1,2)\n    a[0].set_title('Train Loss')\n    a[0].set_title('VAL Loss')\n    a[0].plot( 1 + np.arange(len(train_loss_list)), train_loss_list)\n    a[0].plot( 1 + np.arange(len(val_loss_list)), val_loss_list)\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"torch.save(model.state_dict(), 'model.pth')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ans= []\nfrom torch.nn.functional import softmax\nfor i in test_loader:\n    out = model(i['img'].to(device))\n    out = softmax(out, dim = -1)\n    out = out.view(-1, 120).cpu().detach().numpy()\n    ans.append(out)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(ans)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ans = np.array(ans)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"np.argmax(submission.iloc[0, 1:])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.load_state_dict(torch.load('/kaggle/working/model.pth'))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from scipy.ndimage.filters import gaussian_filter1d\n\nloss_smoothed = gaussian_filter1d(loss_list, sigma=2)\nplt.plot(np.arange(len(loss_list))+1, loss_smoothed)\n\nplt.show()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_df = pd.read_csv('/kaggle/input/dog-breed-identification/sample_submission.csv')\ntest_data = Data(test_df, test_dir, train_ds,  mode='test' )\ntest_loader = DataLoader(test_data, shuffle = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample = pd.read_csv('/kaggle/input/dog-breed-identification/labels.csv')\nsample['breed'].unique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.read_csv('/kaggle/input/dog-breed-identification/sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from torch.nn.functional import  *\nfor i, slic in enumerate(test_loader):\n    out_squeeze = np.zeros((1, 120))\n    for j in range(num_crops):\n        img = test_data[i]['img'][j].to(device)\n        out_squeeze += softmax(model(img)).cpu().detach().numpy()\n    submission.iloc[i*128 : i*128 + sic.shape[0], 1:] = out_squeeze/num_crops","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"num_crops =5","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.to_csv('submission.csv', float_format = '%.6f' , header = submission.columns,  index = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import torchvision\ndataset = torchvision.datasets.ImageFolder('/kaggle/input/dog-breed-identification/')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_loader = DataLoader()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels = pd.read_csv('/kaggle/input/dog-breed-identification/labels.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}