{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torchvision import datasets ,models , transforms\nimport json\nfrom torch.utils.data import Dataset, DataLoader ,random_split\nfrom PIL import Image\nfrom pathlib import Path\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom torchvision.transforms import ToTensor, Lambda\nimport torch.optim as optim\nfrom torch.optim import lr_scheduler\nimport matplotlib.pyplot as plt\n%matplotlib inline\nfrom torch.utils.data.sampler import SubsetRandomSampler\nprint(torch.__version__)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-05-27T16:41:31.553783Z","iopub.execute_input":"2021-05-27T16:41:31.554357Z","iopub.status.idle":"2021-05-27T16:41:32.799597Z","shell.execute_reply.started":"2021-05-27T16:41:31.554256Z","shell.execute_reply":"2021-05-27T16:41:32.798514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ConvAutoencoder(nn.Module):\n    def __init__(self):\n        super(ConvAutoencoder, self).__init__()\n       \n        #Encoder\n        self.conv1 = nn.Conv2d(1, 32, 1, padding=1)  \n        self.conv2 = nn.Conv2d(32, 1, 1, padding=1)\n        self.pool = nn.MaxPool2d(2, 2)\n       \n        #Decoder\n        self.t_conv1 = nn.ConvTranspose2d(1, 32, 1, stride=1)\n        self.t_conv2 = nn.ConvTranspose2d(32, 1, 1, stride=1)\n\n\n    def forward(self, x):\n        x = F.relu(self.conv1(x))\n        x = self.pool(x)\n        x = F.relu(self.conv2(x))\n        x = self.pool(x)\n        x = F.relu(self.t_conv1(x))\n        x = F.sigmoid(self.t_conv2(x))\n             \n        return x\n\n\n#Instantiate the model\nmodel = ConvAutoencoder()\nprint(model)","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:17:39.564746Z","iopub.execute_input":"2021-05-27T17:17:39.565175Z","iopub.status.idle":"2021-05-27T17:17:39.579302Z","shell.execute_reply.started":"2021-05-27T17:17:39.565139Z","shell.execute_reply":"2021-05-27T17:17:39.578369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_device():\n    if torch.cuda.is_available():\n        device = 'cuda:0'\n    else:\n        device = 'cpu'\n    return device\n\ndevice = get_device()\nprint(device)\nmodel.to(device)","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:17:54.058738Z","iopub.execute_input":"2021-05-27T17:17:54.059139Z","iopub.status.idle":"2021-05-27T17:17:54.068945Z","shell.execute_reply.started":"2021-05-27T17:17:54.059104Z","shell.execute_reply":"2021-05-27T17:17:54.067792Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.model_selection import train_test_split\nfrom torch.utils.data import DataLoader, TensorDataset, Dataset\n\ntrain = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\ntest = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')\ntrain.shape, test.shape\n\n#Labels(Targets) and Inputs\ntrain_labels = train['label'].values\ntrain_images = (train.iloc[:,1:].values).astype('float32')\ntest_images = (test.iloc[:,:].values).astype('float32')\n\n#Training and Validation Split\ntrain_images, val_images, train_labels, val_labels = train_test_split(train_images, train_labels,\n                                                                     stratify=train_labels, random_state=302,\n                                                                     test_size=0.2)\nlen_subset=500\n#train\ntrain_images_tensor = torch.tensor(train_images)/255.0 #you can specify how many image you wanna recupate\ntrain_images_tensor = train_images_tensor.reshape(-1,1,28,28)\ntrain_images_tensor = train_images_tensor.reshape(-1,1,8,8)\ntrain_labels_tensor = torch.tensor(train_labels)\ntrain_tensor = TensorDataset(train_images_tensor[:len_subset], train_labels_tensor[:len_subset])# create data set\n#val\nval_images_tensor = torch.tensor(val_images)/255.0\nval_images_tensor= val_images_tensor.reshape(-1,1,28,28)\nval_images_tensor= val_images_tensor.reshape(-1,1,8,8)\nval_labels_tensor = torch.tensor(val_labels)\nval_tensor = TensorDataset(val_images_tensor[:50], val_labels_tensor[:50])\n#test\ntest_images_tensor = torch.tensor(test_images[:50])/255.0\ntest_images_tensor= test_images_tensor.reshape(-1,1,28,28)\ntest_images_tensor= test_images_tensor.reshape(-1,1,8,8)\ntrain_loader = DataLoader(train_tensor)#, batch_size = 100, shuffle=False)#True)\nval_loader = DataLoader(val_tensor)#, batch_size = 100, shuffle=False)\ntest_loader = DataLoader(test_images_tensor)#, batch_size = 100, shuffle=False)\n","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:53:17.402676Z","iopub.execute_input":"2021-05-27T17:53:17.403037Z","iopub.status.idle":"2021-05-27T17:53:22.559902Z","shell.execute_reply.started":"2021-05-27T17:53:17.403006Z","shell.execute_reply":"2021-05-27T17:53:22.558669Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Utility functions to un-normalize and display an image\ndef imshow(img):\n    img = img / 2 + 0.5  \n    plt.imshow(np.transpose(img, (1, 2, 0))) \n\n '''\n#Define the image classes\nclasses = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\n\n#Obtain one batch of training images\ndataiter = iter(train_loader)\nimages, labels = dataiter.next()\nimages = images.numpy() # convert images to numpy for display\n\n#Plot the images\nfig = plt.figure(figsize=(8, 8))\n# display 20 images\nfor idx in np.arange(10):\n    ax = fig.add_subplot(3, 3, idx+1, xticks=[], yticks=[])\n    imshow(images[idx-1])\n    ax.set_title(classes[labels[idx]])\n    '''","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:38:51.613317Z","iopub.execute_input":"2021-05-27T17:38:51.61394Z","iopub.status.idle":"2021-05-27T17:38:51.621161Z","shell.execute_reply.started":"2021-05-27T17:38:51.613903Z","shell.execute_reply":"2021-05-27T17:38:51.619171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Loss function\ncriterion = nn.BCELoss()\n\n#Optimizer\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Epochs\nn_epochs = 10\n\nfor epoch in range(1, n_epochs+1):\n    # monitor training loss\n    train_loss = 0.0\n\n    #Training\n    for data in train_loader:\n        images, _ = data\n        images = images.to(device)\n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, images)\n        loss.backward()\n        optimizer.step()\n        train_loss += loss.item()*images.size(0)\n          \n    train_loss = train_loss/len(train_loader)\n    print('Epoch: {} \\tTraining Loss: {:.6f}'.format(epoch, train_loss))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class block(nn.Module):\n    def __init__(\n        self, in_channels, intermediate_channels, identity_downsample=None, stride=1\n    ):\n        super(block, self).__init__()\n        self.expansion = 4\n        self.conv1 = nn.Conv2d(\n            in_channels, intermediate_channels, kernel_size=1, stride=1, padding=0, bias=False\n        )\n        self.bn1 = nn.BatchNorm2d(intermediate_channels)\n        self.conv2 = nn.Conv2d(\n            intermediate_channels,\n            intermediate_channels,\n            kernel_size=3,\n            stride=stride,\n            padding=1,\n            bias=False\n        )\n        self.bn2 = nn.BatchNorm2d(intermediate_channels)\n        self.conv3 = nn.Conv2d(\n            intermediate_channels,\n            intermediate_channels * self.expansion,\n            kernel_size=1,\n            stride=1,\n            padding=0,\n            bias=False\n        )\n        self.bn3 = nn.BatchNorm2d(intermediate_channels * self.expansion)\n        self.relu = nn.ReLU()\n        self.identity_downsample = identity_downsample\n        self.stride = stride\n\n    def forward(self, x):\n        identity = x.clone()\n\n        x = self.conv1(x)\n        x = self.bn1(x)\n        x = self.relu(x)\n        x = self.conv2(x)\n        x = self.bn2(x)\n        x = self.relu(x)\n        x = self.conv3(x)\n        x = self.bn3(x)\n\n        if self.identity_downsample is not None:\n            identity = self.identity_downsample(identity)\n\n        x += identity\n        x = self.relu(x)\n        return x\n\n\nclass ResNet(nn.Module):\n    def __init__(self, block, layers, image_channels, num_classes):\n        super(ResNet, self).__init__()\n        self.in_channels = 64\n        self.conv1 = nn.Conv2d(image_channels, 64, kernel_size=7, stride=2, padding=3, bias=False)\n        self.bn1 = nn.BatchNorm2d(64)\n        self.relu = nn.ReLU()\n        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)\n\n        # Essentially the entire ResNet architecture are in these 4 lines below\n        self.layer1 = self._make_layer(\n            block, layers[0], intermediate_channels=64, stride=1\n        )\n        self.layer2 = self._make_layer(\n            block, layers[1], intermediate_channels=128, stride=2\n        )\n        self.layer3 = self._make_layer(\n            block, layers[2], intermediate_channels=256, stride=2\n        )\n        self.layer4 = self._make_layer(\n            block, layers[3], intermediate_channels=512, stride=2\n        )\n\n        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))\n        self.fc = nn.Linear(512 * 4, num_classes)\n\n    def forward(self, x):\n        x = self.conv1(x)\n        x = self.bn1(x)\n        x = self.relu(x)\n        x = self.maxpool(x)\n        x = self.layer1(x)\n        x = self.layer2(x)\n        x = self.layer3(x)\n        x = self.layer4(x)\n\n        x = self.avgpool(x)\n        x = x.reshape(x.shape[0], -1)\n        x = self.fc(x)\n\n        return x\n\n    def _make_layer(self, block, num_residual_blocks, intermediate_channels, stride):\n        identity_downsample = None\n        layers = []\n\n        # Either if we half the input space for ex, 56x56 -> 28x28 (stride=2), or channels changes\n        # we need to adapt the Identity (skip connection) so it will be able to be added\n        # to the layer that's ahead\n        if stride != 1 or self.in_channels != intermediate_channels * 4:\n            identity_downsample = nn.Sequential(\n                nn.Conv2d(\n                    self.in_channels,\n                    intermediate_channels * 4,\n                    kernel_size=1,\n                    stride=stride,\n                    bias=False\n                ),\n                nn.BatchNorm2d(intermediate_channels * 4),\n            )\n\n        layers.append(\n            block(self.in_channels, intermediate_channels, identity_downsample, stride)\n        )\n\n        # The expansion size is always 4 for ResNet 50,101,152\n        self.in_channels = intermediate_channels * 4\n\n        # For example for first resnet layer: 256 will be mapped to 64 as intermediate layer,\n        # then finally back to 256. Hence no identity downsample is needed, since stride = 1,\n        # and also same amount of channels.\n        for i in range(num_residual_blocks - 1):\n            layers.append(block(self.in_channels, intermediate_channels))\n\n        return nn.Sequential(*layers)\n\n\ndef ResNet50(img_channel=3, num_classes=374):\n    return ResNet(block, [3, 4, 6, 3], img_channel, num_classes)\n\n\nmodel = ResNet50(img_channel=3, num_classes=10)\nprint(model)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T22:39:34.948695Z","iopub.status.idle":"2021-05-26T22:39:34.94929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}