{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"#import 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 all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n# Any results you write to the current directory are saved as output.\nimport pandas as pd\nimport torch\nimport torchvision\nfrom torchvision import transforms, datasets\nimport torch.nn.functional as F\nimport torch.nn as nn\nimport torch.optim as optim\nimport math\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\n\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nprint(device)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"","_uuid":"","trusted":true},"cell_type":"code","source":"# train / test 데이터 만들기\n\ntest = pd.read_csv(\"../input/Kannada-MNIST/Dig-MNIST.csv\")\ntrain = pd.read_csv(\"../input/Kannada-MNIST/train.csv\")\nsubmission_set = pd.read_csv(\"../input/Kannada-MNIST/test.csv\").iloc[:,1:]\n\ntrain_data = train.drop('label', axis=1)\ntrain_targets = train['label']\n\n\ntest_images= test.drop('label',axis=1)\ntest_labels= test['label']\n\n# Train Test 분할\ntrain_images, val_images, train_labels, val_labels = train_test_split(train_data, train_targets,\n                                                                     test_size=0.2)\n\n#인덱스 초기화\ntrain_images.reset_index(drop=True, inplace=True)\ntrain_labels.reset_index(drop=True, inplace=True)\n\nval_images.reset_index(drop=True, inplace=True)\nval_labels.reset_index(drop=True, inplace=True)\n\ntest_images.reset_index(drop=True, inplace=True)\ntest_labels.reset_index(drop=True, inplace=True)\n\nprint('Train Set')\nprint(train_images.shape)\nprint(train_labels.shape)\n\nprint('Validation Set')\nprint(val_images.shape)\nprint(val_labels.shape)\n\nprint('Validation 2')\nprint(test_images.shape)\nprint(test_labels.shape)\n\nprint('Submission')\nprint(submission_set.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Look at image means')\nprint(train_images.mean(axis=1).mean())\nprint(val_images.mean(axis=1).mean())\nprint(test_images.mean(axis=1).mean())\nprint(submission_set.mean(axis=1).mean())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Train Distribution')\n# 상대빈도수를 나타냄 (균일하게 나타나는 것을 알 수 있음)\nprint(train_labels.value_counts(normalize= True))\nprint('\\nSubmission Distribution')\nprint(test_labels.value_counts(normalize=True))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"IMGSIZE = 28\n\n# Transformations for train\ntrain_trans = transforms.Compose(([\n    transforms.ToPILImage(), # 이미지 형태로 변환\n    transforms.RandomCrop(IMGSIZE), #random location에서 plt이미지를 잘라냄\n    transforms.RandomAffine(degrees=5, translate=(0.1,0.1)), \n    #이미지의 중간은 변하지 않게 하고 Random affine // affine은 순전파에서 수행하는 행렬의 곱 (X*W+b)\n    #degree : 선택할 범위 (min,max) / translate :랜덤 표본의 가로, 세로 absolute fraction의 최댓값\n    # ex) (a,b) =>  range -img_width * a < dx < img_width * a\n    \n    transforms.ToTensor(), # plt image나 ndarry를 tensor로 변환 \n    #transforms.Normalize((0.5,),(0.5,)) # (평균,분산) 으로 정규화 input[channel] = (input[channel] - mean[channel]) / std[channel]\n]))\n\n# validation과 teset 셋을 위한 변환 // 검사하는 set이기때문에 랜덤추출은 없음\nval_trans= transforms.Compose(([\n    transforms.ToPILImage(),\n    transforms.ToTensor(),\n    #transforms.Normalize((0.1307,),(0.3081,))\n]))\nclass KannadaDataSet(torch.utils.data.Dataset): # datasat을 변형시켜주는 함수\n    def __init__(self, images, labels,transforms = None):\n        self.X = images\n        self.y = labels\n        self.transforms = transforms\n         \n    def __len__(self):\n        return (len(self.X))\n    \n    def __getitem__(self, i):\n        data = self.X.iloc[i,:] #image의 i행의 데이터를 받음\n        data = np.array(data).astype(np.uint8).reshape(IMGSIZE,IMGSIZE,1) #unit8타입의 (28,28,1)의 형태로 (신경망처리위해)\n        \n        if self.transforms: #transform에 값이 있으면 data를 변형시킴\n            data = self.transforms(data)\n            \n        if self.y is not None: # 라벨이 있으면 i번째 데이터(변형됨), i번쨰 라벨을 튜플형태로 출력\n            return (data, self.y[i])\n        else:\n            return data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_size =128\n#데이터 변환\ntrain_data = KannadaDataSet(train_images, train_labels, train_trans)\nval_data = KannadaDataSet(val_images, val_labels, val_trans)\ntest_data = KannadaDataSet(test_images, test_labels, val_trans)\nsubmission_data = KannadaDataSet(submission_set, None, val_trans)\n\ntrain_loader = torch.utils.data.DataLoader(train_data, #데이터셋\n                                          batch_size = batch_size, # batch_size지정\n                                          shuffle=True) #섞을 것인지\n\nval_loader = torch.utils.data.DataLoader(val_data,\n                                          batch_size = batch_size,\n                                          shuffle=True)\n\n\ntest_loader = torch.utils.data.DataLoader(test_data,\n                                          batch_size = batch_size,\n                                          shuffle=True)\n\nsubmission_loader = torch.utils.data.DataLoader(submission_data,\n                                          batch_size = batch_size,\n                                          shuffle=True)\n\n\nclasses = {'0','1','2','3','4','5','6','7','8','9'} # class의 라벨들\n\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Batch Normalization\n### Gradient Vanishing/ Gradient Exploding일어나지 않도록 함\n과거에는 Activation 함수, Initialization설정, 적은 학습률로 해결\n#### 발생하는 이유는 Internal Covariance Shift때문\nNetwork의 각 층이나 Activation마다 input의 분산이 달라지는 현상.  \n이를 막기 위해 N(0,1)인 input으로 normalization => whitening방법 사용  \n(but 공분산, 역행렬 계산량 ^ / 일부 parameter영향   \nhttps://shuuki4.wordpress.com/2016/01/13/batch-normalization-%EC%84%A4%EB%AA%85-%EB%B0%8F-%EA%B5%AC%ED%98%84/"},{"metadata":{},"cell_type":"markdown","source":"1. ## nn.MaxPool2d(kernel_size=(a,b))\n\n![image.png](attachment:image.png)","attachments":{"image.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAA7EAAAETCAYAAADgaIGVAAAgAElEQVR4Aey9TWsbyRv2+3ya3gm8EAS8CIxX1sqNFxFZjGBgBIERWYyZRcxAEIEgDA/2JiKcYAYGEQjKgUFZBP0hoIBBWRhlYZQDQYaAAlkIAloYeiG4DlXd1a/VrZbcevUVCJZa3fXyq1Kprrrvuuv/gP9IgARIgARIgARIgARIgARIgARIYEMI/J8NKSeLSQIkQAIkQAIkQAIkQAIkQAIkQAKgiGUnIAESIAESIAESIAESIAESIAES2BgCFLEb01QsKAmQAAmQAAmQAAmQAAmQAAmQAEUs+wAJkAAJkAAJkAAJkAAJkAAJkMDGEKCI3ZimYkFJgARIgARIgARIgARIgARIgAQoYtkHSIAESIAESIAESIAESIAESIAENoYARezGNBULSgIkQAIkQAIkQAIkQAIkQAIkQBHLPkACJEACJEACJEACJEACJEACJLAxBChiN6apWFASIAESIAESIAESIAESIAESIAGKWPYBEiABEiABEiABEiABEiABEiCBjSFAEbsxTcWCkgAJkAAJkAAJkAAJkAAJkAAJUMSyD5AACZAACZAACZAACZAACZAACWwMAYrYjWkqFpQESIAESIAESIAESIAESIAESIAiln2ABEiABEiABEiABEiABEiABEhgYwhQxG5MU7GgJEACJEACJEACJEACJEACJEACFLHsAyRAAiRAAiRAAiRAAiRAAiRAAhtDgCJ2Y5qKBSUBEiABEiABEiABEiABEiABEqCIZR8gARIgARIgARIgARIgARIgARLYGAIUsRvTVCwoCZAACZAACZAACZAACZAACZAARSz7wOYRmAzR/V8f480rOUu8oQRGH5vojja08Cw2CZAACZAACZAACWwZAYrYLWvQra/OZIjmIxO1S2uzqjqxMLruoXvRQedDF93LAcYTXxVuBuhdb1idfMXf+pfjLmoPKmh93/qasoIkQAIkQAIkQAIksPYEKGLXvolYQI+Ahd5JAYWzHuLlXh/nD02YhyYK9wwYhvhfQeunl4p6ZV2e+u5x7r1XQOXtUN1y+7/jPlonZezu5LD7qIrztx10L7rovK2htF/C+ZUF3PRRf5hD9WN8rVIV5OocxUMT5v2cU2+7Tvl9E+ZvDQxkIopPAXnJxqu3eVhC42uqnLK96bqJymGoPIYBUe7zz3ZWo/9VYe7nA/UyjDwKh6fouthGaP8VumdnF+WM2tO6rKGwX0PvJtvqMzUSIAESIAESIAESIIHZCFDEzsaLd6+QgPWxitwvNfRc0ZJUmCGavzoCzTBQeNmPvXn8v2MYv9TQ0Qjd2IdSfDB8dwxzx0D+tzq6PzQP3PRQOyii9FCIzjKauns0j0299L2JkhSoJhrXcXcP0Di0+Zj/2vI27s6lXb+sOSL1CO0YX/H+yz37nl+biF1q+HoO0yig+iFr/18Lnac55J52EhZRlkaLGZEACZAACZAACZDAnSVAEXtnm37DKj7po75voPg6VroEKzRu42inhsa/RVv07FR9FrvgraP/ythLELnBu9O8s9A7M5Ezcii+7CcKnvG7il2+X+qIl9lp8vTuEWJfWqB3TtHzLgdfWR1UpdDN4dSxdgZvWMG7L3XsyTLFC/rR27Jdt9+biJOo4/dHMDNtTx+Lbw0UjT3Ur3zX+JIESIAESIAESIAESGCpBChil4qbmc1LwBZ7erdgbZqXNeT+bGP8s4WK4zZbeacz7wnrmnF7V163ELbLsxCRhZMkt2fngR9NlEX5nnfdFG77onfmuBOL+scl5grGKjqpLNtxCWV4XbGItUrbllDbRbymF+hiseOgis7CXH7HaD02YDxuxbPNEAmTIgESIAESIAESIAESiBKgiI0y2ewrjktm7XKzqxEs/ezCYfCvidIbYbW1RaoUPg8aGhfUPuq/lNGKM+sFCzL1nfWpZlsTf6mhm0pI9VAzDBy9j5WbU/MM3uC5USe5CQvrs2SSYNEMpruEd66IjbEOf6mj4CxIGIZexApLbfltRo0ZU2XbGjzDgkpMOrxMAiRAAiRAAiRAAiQwHwGK2Pm4re9T2yhihWuwYSBJlAUbZIz2n54Qsi6qyEnxo3EDvW7APFRBj4KpzPzO6qH2i73PNL2QEiK2hGZWUW8dVkKg1j7F1cAT9tm6Ucfll/a6Lehl2cOLMCIq9e8GCvsFW3wbGguy4P+wjr4/6nParGe5T/SZTBceZsmc95IACZAACZAACZAACVDEblsf2EYR+8kO+BMvykKNOOmi5hc5wsXUEZfSxdh3u9g/mTuJ3Tnqu3P6y+FrZ/+tP+9pj407OP2rpbEQT3sw5vPPp45gjw+OBHg8UjONyS7by56IDUdqlu0kgnp9VMGfovtmB/+WMnQLT6iZ7F8GjIz6TUJO/IgESIAESIAESIAESEBDgCJWA2WZl968eYNCwbYuib/i/a3+3UbETiwMr7oYiCi91hD9iy66Fz37/dyFGkkL2m0m/Lb75gzWSmEpC7nJegKziMY3VRnbIpmNK68nDI0VRq8VbtTSTTjJujxq2ftwjSShqxgt86/HMGDJlhZu5wgiN/JySMT+bOPo1wYGi7bCShyOy3aojy2TFPMiARIgARIgARIggbtMgCJ2ha0vBKsUHO4+P9sV9VZCViNiR++PYd4/RW8yRv9tFUV5fmoexadNDPz7Np09iZVnNXk0jFe2PCqvB74ou44wjUziQ9cnI3RflILnkRrGzHsWeyeCS/p9q9pow74AT3svVBxgIZpmEMdJfcVxMRXMyv8tdk9mfDGEG7Xdh7y2S3ifJHTjM1ngJ07/MQxnP7Od1UBEmFZ9zd03a8Db9y2CaRVRu1xWhCpVTv2+3AUCYtIkQAIkQAIkQAIkQAIAKGJX2A2UBTYsOMT1uf/pRKw8luQYtRO1n9ATNrlnXU+cOgIh9/AU3W9jWBPAGvXReCSi3e75REJIrLqFDV53gweFRLptZRvg/CCH/JOECLpOuraITSsYbOtq1E3WQveZE7VXHbcjhGdWR9s4Ls+CU/2LC2S5L5Sba+J+WKD73G7/JDdq63Md5r0Smq7VehlVUeLQ56orLKw7BY+pf8+v2jf7rYFSUiRm4ViQcX1m65PLYMc8SIAESIAESIAESODuEKCIXWFbh8Wr//3cxYoVsXmUXnQxVJbXnx0nCJFPHDoi1rNwOaW46aC6Y8BwhUJQrHpl1V239zkG3EPlA2lFrBCfQnT5yullqHklrKsxVtsrdQ6pAXHcjhTZGbn+uueXxh4PoykqLAyvM7TausfmJLkJey67SW7U4w9VmH+co78s46aDxxaHSsSKBYkccoE2Cu+bFfeU0LjW8fWuZV0filiPLV+RAAmQAAmQAAmQwLIJUMQum7gvv+VaYqMiMDIRjxOx7jE1Kg2dWBUV012PE7E+EFNeRsqZdL/YMxnrJjtE44FjhX5QR/1pdq6/IvCQvQgR2quZVFZhCXYXBpJuTPeZK6Rj6w/Adcc1pwq/dLlme5crYh+1MBJH6uwcoS32aLv/PBErF0a+1GH6vQnc+xb7YqY+udiiMHUSIAESIAESIAESuHMEKGJX2ORL2xMr3YmVAPUqHJmIx4pYIHivTqyKdHXXsxOx3RRBe6yP1cRow16AJyFmMxRyrhU0vYjtvyigepGVqdN2oxZCOtFN+GPVFts7p8gmJrPXn7J41X+5Z5fv9xpqvxso/jsIJeudg1t+20Pz9/S8Qwnd4q3aexz9Tt0iUT5KAiRAAiRAAiRAAiSQkgBFbEpQi7pNCFllkRV/bxXUSRQy1p04OuEOClPPShdxJ4YzaXf3jzpi9ddm6GgYjYh19mlG3YnTE7WFTTqx0jvLIclNFr4AT8ZODb0UwjhVSd1jfHK+gEMJT35voiysjQm3zPZRD6fC5XvK+aWCj7QYB1x0fTl9b6P6m4nd+xW03LNrLfRelGDuF3D03xAYdVH/q4TiwS52fztHX7mo+5KZ96VrTRb7qMWROhGN7/QxIdbv5WG+VEG6YnJcSH2cMiRZvGOKw8skQAIkQAIkQAIkQAK3J0ARe3uG65XCIkSsEFyGAS+qr7JEFVH/PLbrb43Qf3tsRzVWkWTFJ45113zliI2JJQNGzQLNDhCVJmDSAI3DadZVX4CnNK681w2U7hnIP25hOEXwyrNMhbialu5ND7XfaugliL/xRxEhOgfzrOcF3kqC5kZHToq2LPjYQrf0ZqhJbYjGE3FMjW3VLb527rmq4/jdGLiowvilgNJZF2PJwraKxi5QzMBOFcYTsXGLEZ7F2dipopPAEMi4PqqQcBYMprWzez9fkAAJkAAJkAAJkAAJZEmAIjZLmuuQVgYiNv9bHZ3rEcY/xxheNnC8b8DYD4qu8buKbdHzRx7eL6MsRJJfxKoJv+8+21KaNrATAMdVN9HCCmD8qYaCCKzkWhBjGsQJ8KQXcsFnei/ybj2rHyNmweDNEEe9iAjQORRf9hyhF7rlWwvHj2roJJpgR2g9dvbupnR5dsWfay0P5SveuvthYxYEvp6j9n4MWF1Ud/ZQv7LTGPxTQ3sMyDNoH/jPYk0WsbOxc8qrojz/3oxdNLA9CHSuxqE6Z1wfN3XnnF0z4urs3sEXJEACJEACJEACJEACCyRAEbtAuCtJOgMRawcoUiLKgBC13bDokmfAlrErXFh3dp0zZ0doPtqF+Xc74CZrXZ2jfN92Y83dL+L0QlhvZxCxkx5qO3F7PUdo/WXa5fAJ5dz9KjqOkTjaDiLAU4yQC9/sWBNzO7l059vKs3hti3TufhnV1y10L7rovmug+oeJyosuRlMsuqIItiXWgMg36t7tFPJHC0eHhcg5vMa9AszDmlN/m09Bng3stalh5FE4NFH7GIUkg1QJMRwo5witRwb2/O678ribBI6zshPVkv3Xd6ROuD0ASPdyraux5mbBUgTdyqI+KnkptBPqre7jXxIgARIgARIgARIggYUQoIhdCNYNTVQFdvo4llZYYYkdj6dZH5dT195JzhYiy8kumsunWjoRq56cWBheddH90EFHiNir4cxu1CKp4ZtSvIhVeWX6dyytwAGxKtK3OqiGzp91xeG0/Gdh97OPzsUw0YXauu6i+y1tv8y+Pv0Xe6vti9N483MSIAESIAESIAES2HICFLFb3sAzVU+J2MuZnlrOzdcNFA3PxXU5mXq59F8WUf/ivV/OK7H3OOnM1wWUQga+cvYVX9VxqqInS5duf1n84nCIxos2ojZdu3yrYeewybo+TgCv2H3AC2gSJkkCJEACJEACJEACJBAkQBEb5HG3362ziJVn1eamB01aRAvedFA9CLvXLiKjUJrCHXfZwYOEO6+Mumuhc1Z3owMLi7ARiEZtH50kXJ3FsUax+4VXxU6hzLg+MnjXDK7Mqhj8SwIkQAIkQAIkQAIkkB0BitjsWG5+SmstYgH8bONop4DTz2ldSTNokskInWdF1D4tMU9R7JsBGo9SBKnKoIqBJH52UHsg9tRWcH7l1bl3lkcwEJaF3pmJ3X0TlVd9vfvvqtj5K5RlfaweTvf3lt8X/PXhaxIgARIgARIgARIgAVDEshN4BMY9NM5O0f7mXVq3V9ZlDYVQpOSFltHqo/1BdxzNQnMFfnTQUscXLTirhSW/KnYLqZCIPG2mP/JoIWVgoiRAAiRAAiRAAiRAAoIARSz7wcYRsC5PUXzcCkRA3rhKsMAbRWD0XwWllzEW542qCQtLAiRAAiRAAiRAAptPgCJ289uQNSABEiABEiABEiABEiABEiCBO0OAIvbONDUrSgIkQAIkQAIkQAIkQAIkQAKbT4AidvPbkDUgARIgARIgARIgARIgARIggTtDgCL2zjQ1K0oCJEACJEACJEACJEACJEACm0+AInbz25A1IAESIAESIAESIAESIAESIIE7Q4Ai9s40NStKAiRAAiRAAiRAAiRAAiRAAptPgCJ289uQNSABEiABEiABEiABEiABEiCBO0OAIvbONDUrSgIkQAIkQAIkQAIkQAIkQAKbT4AidvPbkDUgARIgARIgARIgARIgARIggTtDgCL2zjQ1K0oCJEACJEACJEACJEACJEACm0+AInbz25A1mIPA8FMb/fEcD/IRElgFgR8dND+NVpEz8yQBEiABEiABEiCBtSNAEbt2TcICLZrA8G0Z5kkP1qIzyjL9iYXxtz66Fx10PnTRvehj6K/AZITeFUVOlsjXKq3JGN2TIir/DdeqWCwMCZAACZAACZAACayCAEXsKqgzz5URsC5rKOyfoucXgIHSjNB+asI8NGHez8EwDBjGHupXgZvsN99bqLj3iPsMGDu7MP9vNzuBPBmh++oIxXsG8g+OUHvdQveii+67cxw9KOL4/RCYDNF+UoD570BTyFku9XH+0IR5sIucrLdTp3sFmIclNL7aafX/KUo+hXvO5/LePAqHJkq3LsMs5U177wDNP0wEy2vAEPV61bMTGbVRPSwg76+3YSC/b+L0k9dZRv87Ct2Tw+6jJpYiLW96qO0XULv0ypOWAO8jARIgARIgARIggW0iQBG7Ta3JuiQTuOmgurOXWgR0n3siLfdnG7Hex1/OYRplNK6zFRfjz+co3TOQOzhG84sm98kQzUcmSr8VYBg51C6Tq5/+0yGav9p1TxLGg39NW7gfNnBb+Zy+bLe5s4eaI1KP/qfhKZL+UseevKeE5veYvCYDnB8aKDzrYDSJuWdBl62PVeR2qujcLCgDJksCJEACJEACJEACG0CAInYDGolFzIZA/2UBxoNGSqtZH/Vfymi8rjpWySIa32LK8fkUiSI35rGky8P/KtLiV3jSxjBJKF0p0XWEdowuS8pH+5nVQVUKuRxOP2vvAGCh89QWurkzx5oZd+vaXBdtape5/DbG9fpHE2VZ9zKaP2IK/rONo4M6+kntEvPo7S8P0XhgYO9F//ZJMQUSIAESIAESIAES2FACFLEb2nAs9owEfrZQMQxU3qVUekLM/CKEiid84oSDsEgmWSxnLCnEnl3hzpsTbqpThZJjXfw1Q5dWIcqlkEsSxh6X6sdsLdCz8kp//wjN35NFrLR0yrobsZbt/ksTq6zz+F0FhlFB62f6mvNOEiABEiABEiABEtgmAhSx29Sa/rpMLAwvznH0m7fPL3ffROWkiV6chcn//Ja9nnXiL8SM8bwrKbhusztVdCN6bYz2n0kWyxlBfvdZAuPcWQNJ2sJs72V2lrnhm9J0N+FRa7rFMlDOdXjjiVit9VgsWOzbIlfsb9a6Z4vFjd+biLHjLqeSjrU49YLMgko1/lCFeXiOTbHDLwgDkyUBEiABEiABElgBAYrYFUBfeJY3AzQe552gRN6k3A5SJN4X7IBACy/IumQghKYBY4a9m/2Xeyj/50iVbw0UHetcRDhI19sqOhFxO0/dPZG1lzp6sv1M7dM8+emecViJ+joiXneXFPniHmGt1t2wptd6J8734SQqvYZvyjD2Cyg4bR21tlronRRR/7Lqyg3QODRgJO3TXkIRR2/LMIwaRewSWDMLEiABEiABEiCBIAGK2CCPzX8ng/3YUXXzv9XR/TaGpVxSb4bovT6GuWML2TsT5XTStQP6JIiyYMOLwEYmGtfq6hitx4742Q/thRSBgDKyzFkXav+tP29Vhri/AzT+qqOX0ks6LhXveg+nsn8YOHofn6gQ+XJRJDVTL4dVvnJF7NNOMIK02Ocqg3513OBPkX2z1w2Uws+tqDJ20LHVCkiK2BU1PrMlARIgARIgARIAReyKO8GbN29QKIjosob8K97f5p/a01dIsuR9a6IshEpYkKXN+LIGw9AHvhlf99D7bgGTMQaX4jzTLvri/S3+SeFxG6HouF+W3qQ8CEVYV3dq6CnxL8IYuQIzh+qFVx/hapyNK6/PAjqDxfgWWPWPXjdgSktkkpAeofXIFvVJQlefwWqvuuI70J+EhXUPOSlQvcjMQREr2qfkW9hYbT1sl2/9d3BZJaOIXRZp5kMCJEACJEACJBAmQBEbJrLE90Kwei6+jqXPMDC/kHWEkHbvZrBig3/E8Sh7nmukI/SCE3cAoevjL00cH6jzU1WZlUXIDjJkPq2hEjhDNAfzefA4Etsipp7zyha4Phmj/1ZZjlVeBgyNK6iXguaVFN2G5x6suSVwSRdt2BfgyXjcco7bsXln4srrRgQ2oN2vGSjg4t6M3x9p+6SunxpGktBdXBlvk7ItvAwY/kBY18JdXAlCz6Xb38/E+cLFpIWh2xRqjmdVPbT7dmdJz3GVDwYms9B9Jr7joeBR4zaORMAx5/vnitjJGL3X9lnGhpFH8WkTg8gRQBYG72qo7DvbHHZ2I/eN3h/DvH+Knjj3+GlRRufO3S+j6YsKPvp0jqOH6hzjPAp/1NFd6QblWWDzXhIgARIgARIggawIUMRmRXKOdJQFNiwQxPX5/jmRatO4PDrnYbr7PkNi1c0/cN1zNQ2WWYlRJ//9YzSvRrYb880QnWe2pdkvkANi1c0MCFx3o+T6BKywEjqTaCHEc/eO0Z4WpdURsWkn/MK6qrPaDl8XHYHnHLcjhWdSBF9fxaa9/N5EydmLuUrrpns2bpKb8CdhiTdghKzV06o41+ejHjqfs1MpSvx5eznFQkQOBTcwlrMQ5OtnwBCNX4+m97O5Khh66GaI7sUg6OocukW+nbFP65Kwrzn7a/2W6UkPNcelPLAH3Gl3tVfYZlnG8RP7++0fE3LPur46CEt39B5xf+5Ryw2SpURxXRyF5XwXhMdHy2l+FbXb+8wZF/ZP0fOcI+Kryk9IgARIgARIgAS2hgBF7AqbMjIZcyduxpylckRkGktlQJxGLa5uAcL3AVCTzWhoHDt/v1iV6UwG8mxLfxCggFh1MwuJWHndsYxp6pRWxApXYME6nYi1RY32fFTnmB6RljxuR4jsrFx/HVGSvpw2tNH10CcWfCDneukdm5MkpF2X3CUEFpKiOklQz1pPl7O98CLd73eq6Pgsh3bfNGA4i0HintK/g1lzmut+6SbstxLHpZKZiAXs9vQtxlzWkDMqOPozB8Mnbu37vCBm9jiQR+lFF0PF72cHNXkWr1rYUq74RdQuht7+/MkY3TPhDaIs4GpcEdscjtG6dlTpz7Hdv6XFeA9Hb/oYKcEqIrD/J44bSvvdjoPJ6yRAAiRAAiRAAptGgCJ2hS22eZZYG9bMIhaAfUyNN2HNQsSmbrpZJvwyCJQ3UQ/modwshRWyivoLMzvXX8cyPtOEXFiCs4wO7CxYJLsJe+62QRfUIKls3tmi2vUWyCJRV8SW0fohjtTJRQJYuSJWCDjhRn6gO1opi8KE07CtwKncyWfp0+Fswu+dvqcWLvov9iBc5kdSzDpeB4hGRI4bB4LfbQudpyFPCt9iXVTEltHUHC3lHnMVeNZLN90CVbjifE8CJEACJEACJLCpBChiV9hy2e+JdQLuhCxLuirae2J9exo1Flf5nOZ63OQViLHEutbbFYvYNMfQiMBGPutTmJ0X4MmeQCvXyvB9M7939hvOImLF2bfF1ymDVaUokHtsTpKbsLt3N8OzcePKJl2sfX007r5ZrruLBWXUTsowHjQw8AXwEkm55+T+3kTvbRkRz4JZ8pvlXieKdpo+pfYuZyLelPuwtDzbCwfSjdi5LvuY0z+V0BXVihsHgiLWW/QQfTv631swiktP5OUuLGjTyLiPzNJmvJcESIAESIAESGAlBChiV4Ldy1QIWWWRFX/nD+pkpymEjZgopopO/KABVwI5YjWyF1QjYu1Jvucu6NUmXsSGXRbVRLcbEhDquueq7ESL1bgTe/lOeaX2/76dvrdy9F85OdqwP8CTzxVySglSfOwd45NKNN10UXuY7V7A3pkTsCvJTdjdp+yJD13lxl9aqP1hwjw0Udgvovpe9TQL/VcVmPu7MM96niu01UXtXsm2wl2do3howryfg7GzK9Mw/2x5fVWXYdprTn+2xdQedMdM2WJKWNvzyB+EjlSKyedW9R21URX1lUGP8iiI14fJbWuXMTvx1jsRrGvoXdWx5wvoJK2yhw30PwqXfG8RSmCIE53B77CzsHZ4HlksCKOMS0/cZ/fN44Dbd/h5vicBEiABEiABErg7BChit62thcjaty0e4pzYzrUTYEnUM3RObP2Lr/LKEvjAO3PUGvXR/NtEzjAC1ih7knqMtnOMqHWjNqnFiFghuMQ+OTeqr9qHl8PRO0dYiv1tF3WUZFRjv0C20zSetDEWgndiwVLZ+Yqf+HLUQlnsY3WD98Tdbbs+TrOEuQGe0rjyiv3Av+Vh3KugpXGTDJTkSx0FYWmadvSROAv4cUXrdummJ840vWcg/7iFYWihwL0n8MJxFzUMbVArdavr1pmwb1PsU8zvV9FRawY3HRwbBRkJ27qoQfKVCws+ISxdV337MgHI/bBJQcpmYasq4BOxuRix7lqkjZxdVvVszN+s6isXh1LusbZFXZCXrnjW5SnMnRzMv9uJ/cD2MNhD+Xcz8D2FFLV7KOwH98eKvOJEZ1DEAur7UnjSRN/d0ApY4yH6X72ziOPSE3kpD4jcw1N0v/kGgJsRBl+y3Beuo8hrJEACJEACJEAC60aAInbdWiSL8oy7OI0cg+Nz5dsxUfuoFIbK0LME+l3+Co/K8txQv3VQWCv993gBm2zBmTs4RuNyiPHPMUbXHZw+FFae0F43OTn2lUmIt50yyr+La34R651JqvJUYjRtYCfACVgUI1oUAcjzc/dQ++SbJLsf+l6oAE9pAg59rsujQmTZkwSZk7yKwFp4EiM+xz3UHx2h8TW5jL0XzlEmhpFKiKmjlALHLvmqbL/0XENVG0Ru+d5EWYg/31m6Irpv81chjv8/tJ/X0Vd7pH2LGlIcB4SxLaoT98POyFaW1XHZlVbFuEUFtW9W42q8uPraCyip9sNCWTcbmBZuyvraxLFc1Jri/u26iQcXrODzPAjvgY4TnWERC7Ho8ih8LJfz3UogCKEAACAASURBVPd9J+PSs5nHRzj2xp9I6/ACCZAACZAACZDAlhKgiN3ShsVkjMGHcxz9VnBFVH6/hKOzFvqe8SNY+1EX9Uf2GYy5+0VU3w5gCcvVfRPH732i13eOozgXsvBH03H1dKymoX1rQtQ2I6LLwuBtFUVpefXOe+ydCHfKc3juxAC+t1F94IiyewVU3tquqelFrNhT57hLaqySvZcmCoFzbQ0Y94poXAfxeO/sAE/+/YHeZ6FXylq4k0MuYa+t/6mRskjfK+LorInORRfdD02c/lVC6Wkzvv38iTiW2NxOLmBF998CIYb+0tRdtOmhWOiwO8ro3ZHj6hpcdMjvm/L8X393kpyFhdrP2RGOngjy7buUBbJFWUAYS+u57xzjYMHtd3OwVfu2vSN1NAlLK7He1Th8d2b1hX18Vbo+1UUtlWeBU1opyqeIWKijhYIuwyIFeytA1HU5TnRGRKxIZDJC73UVJd85seYfdXR8VtW49DzmFoYf6qgc+M6J/a2KRoZHMHl58RUJkAAJkAAJkMA6E6CIXefW2biyOe7ErwfSCissseOfyRbDpVVRuqtOEUWLLIwQcilFrCzGxMLouofuRQedD110Lwfe0SKzlPNTLUHEzpJQmnud/cthi7MUhTnviCMRPMu/v9KxAvrduG2X3hrCe6a1pZiJ7Rj9D74jYXQJWgN0xXEwus8C17KrLyQTZ09wIA/NG8fFN7AdQHObujT4tzjdRV3dzL8kQAIkQAIkQAIksAEEKGI3oJE2p4iOiE0RQGnpdRJWuwfO+a5LzxzAlzqKU/fkZl+w/sui3Iuafcq6FJXbsAriZN8jgwP5XHPtc3t9LuNS5NoWwOHrGlojx/r3qAVp/xdBn55340Xlith6btK3r6+MNrxz6nggDNF44gu6FkIteaZcEBl/qqEQduUPpce3JEACJEACJEACJLBpBChiN63F1rq8ayxiRXCYj1Xkdo7Q/rlsiGK/o7lEMenU76aDasroulkRkUF8nnRcwSlFVDiolYxw7FhZJ2N0n+85+6A98SZdUmVEagu9s+OEIFYrYusAy6q+0pXWEabDt8c4vYyxA/9s42gnnaszLLF/+hjtuL2/WTU60yEBEiABEiABEiCBJROgiF0y8O3Obr1FLOS+vxwK/qNdltAgo49VFJMsiYsow2SEzrPi9CBVWect8j0pwjww5f/yiWYPtrOnurBvovh7Fe1vQ7Qe72J3v4j6Z0e8fW+hcn8X5sMKzq9iBJ2IkLsKtn5mWdX3pofTg10UHpZ9xxH5MxKvhaAvYG/ZfSlcDL4nARIgARIgARIggRUToIhdcQNsV/ZDtM9O0bj0h/pZsxre9FDbL2jPB11MSS3033cSjzdZSL5WH+0PQTfXheSz0kRXxHZFdbYuazAPTtG7WVEBmC0JkAAJkAAJkAAJrAkBitg1aQgWY4kEhNXrQQWtH0vMk1mRwG0I/Gih8lsdfQrY21DksyRAAiRAAiRAAltCgCJ2SxqS1SABEiABEiABEiABEiABEiCBu0CAIvYutDLrSAIkQAIkQAIkQAIkQAIkQAJbQoAidksaktUgARIgARIgARIgARIgARIggbtAgCL2LrQy60gCJEACJEACJEACJEACJEACW0KAInZLGpLVIAESIAESIAESIAESIAESIIG7QIAi9i60MutIAiRAAiRAAiRAAiRAAiRAAltCgCJ2SxqS1SABEiABEiABEiABEiABEiCBu0CAIvYutDLrSAIkQAIkQAIkQAIkQAIkQAJbQoAidksaktUgARIgARIgARIgARIgARIggbtAgCL2LrQy60gCJEACJEACJEACJEACJEACW0KAInZLGpLVIAESIAESIAESIAESIAESIIG7QIAi9i60MutIAiRAAiRAAiRAAiRAAiRAAltCgCJ2SxqS1SABEiABEiABEiABEiABEiCBu0CAIvYutDLrSAIkQAIkQAIkQAIkQAIkQAJbQoAidksaktUgARIgARIgARIgARIgARIggbtAgCL2LrQy60gCJEACJEACJEACJEACJEACW0KAInZLGpLVIAESIAESIAESIAESIAESIIG7QIAi9i60MutIAiRAAiRAAiRAAiRAAiRAAltCgCJ2SxqS1SABEiABEiABEiABEiABEiCBu0CAIvYutDLrSAIkQAIkQAIkQAIkQAIkQAJbQoAidksaktUgARIgARIgARIgARIg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9C866HzoonvlWXZ1+U1NS/cQr5EACZDAFhJYlzkrRewWdi5WafMIrMuAsHnkWGISIAES0BPIUnhmmZa+tLxKAiRAAptBYF3mrBSxm9FfWMotJ7AuA8KWY2b1SIAE7hCBLIVnlmndoSZgVUmABLaQwLrMWSlit7BzsUqbR2BdBoTNI8cSkwAJkICeQJbCM8u09KXlVRIgARLYDALrMmeliN2M/sJSbjmBdRkQthwzq0cCJHCHCGQpPLNM6w41AatKAiSwhQTWZc5KEbuFnYtV2jwCckAQ0UIPTc3/Y7RHm1cnlpgESIAEVklAjqsqinIgenLaUtnn6Mroy1PPxE2bJu8jARIggU0gMEL7b92c1LQj1//exKqnphSxm9CPWMatJ9B7pR8obFFLEbv1HYAVJAESIAESIAESIIG1IRAvYuXc9O82RezatBULQgIkQAIkQAIkQAIkQAIkQAIksPYEaIld+yZiAUmABEiABEiABEiABEiABEiABBQBilhFgn9JgARIgARIgARIgARIgARIgATWngBF7No3EQtIAiRAAiRAAiRAAiRAAiRAAiSgCFDEKhL8SwIkQAIkQAIkQAIkQAIkQAIksPYEKGLXvolYQBIgARIgARIgARIgARIgARIgAUWAIlaR4F8SIAESIAESIAESIAESIAESIIG1J0ARu/ZNxAKSAAmQAAmQAAmQAAmQAAmQAAkoAhSxigT/kgAJkAAJkAAJkAAJkAAJkAAJrD0Biti1byIWkARIgARIgARIgARIgARIgARIQBGgiFUk+JcESIAESIAESIAESIAESIAESGDtCVDErn0TsYAkQAIkQAIkQAIkQAIkQAIkQAKKAEWsIsG/JEACJEACJEACJEACJEACJEACa0+AInbtm4gFJAESIAESIAESIAESIAESIAESUAQoYhUJ/iUBEiABEiABEiABEiABEiABElh7AhSxa99ELCAJkAAJkAAJkAAJkAAJkAAJkIAiQBGrSPAvCZAACZAACZAACZAACZAACZDA2hOgiF37JmIBSYAESIAESIAESIAESIAESIAEFAGKWEWCf0mABEiABEiABEiABEiABEiABNaeAEXs2jcRC0gCJEACJEACJEACJEACJEACJKAIUMQqEvxLAiRAAiRAAiRAAiRAAiRAAiSw9gQoYte+iVhAEiABEiABEiABEiABEiABEiAB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"}}},{"metadata":{"trusted":true},"cell_type":"code","source":"class Net(nn.Module):\n    def __init__(self, dropout = 0.40) :\n        super(Net, self).__init__() # 자식클래스에서 부모클래스의 내용 사용\n        self.dropout = dropout\n        \n        #x의 배치모양은 (1,28,28) #(배치, 채널의수, 높이, 너비)\n        # 인풋 채널 =1, 아웃풋 채널 =18\n        self.conv1 = nn.Conv2d(in_channels=1, out_channels=64, kernel_size=5, stride=1, padding=2)\n        #in_ch , out_ch, kernel_s 는 필수요소 / kernel_size = filter와 동일\n        self.conv1_bn = nn.BatchNorm2d(num_features=64)\n        # 4D의 배치 정규화에 사용 (N,C,H,W)\n        # cf) BatchNorm1d = 2D(N,C) or 3D(N,C,L) input / BatchNorm3d 5D(N,C,D,H,W)\n        self.conv1_1 = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=5, stride=1, padding=2)\n        self.conv1_1_bn = nn.BatchNorm2d(num_features=64)\n        self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)\n        self.d2_1 = nn.Dropout2d(p=self.dropout)\n        \n        self.conv2 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1)\n        self.conv2_bn = nn.BatchNorm2d(num_features=128)\n        self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)\n        self.d2_2 = nn.Dropout2d(p=self.dropout)\n        \n        self.conv3 = nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1)\n        self.conv3_bn = nn.BatchNorm2d(num_features=256)\n        self.pool3 = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)\n        self.d2_3 = nn.Dropout2d(p=self.dropout)\n\n        #4608 input 피쳐들, 256개의 output feature(sizing flow를 봐라)\n        self.fc1 = nn.Linear(256 *3 *3,512) # Linear 1\n        # 선형변환을 실시\n        self.d1_1 = nn.Dropout(p=self.dropout)\n        # 64개의 input feature, 10개의의 정의된 클래스를 위한 10개의 아웃풋 피쳐\n        self.fc2 = nn.Linear(in_features=512, out_features=256) # linear 2\n        self.d1_2 = nn.Dropout(p=self.dropout)\n        self.fc3 = nn.Linear(in_features=256, out_features=128) # linear 3\n        self.d1_3 = nn.Dropout(p=self.dropout)\n        self.out = nn.Linear(in_features=128, out_features=10) # linear 3\n        \n        \n    def forward(self,x):\n        #첫번쨰 convolution의 activation을 계산\n        #Size 를 (1,28,28)에서 (18,28,28)로 변경\n        x = self.conv1(x)\n        x = self.conv1_bn(x)\n        x = F.relu(x)\n        x = self.conv1_1(x)\n        x = self.conv1_1_bn(x)\n        x = F.relu(x)     \n        \n        x = self.d2_1(x)\n        x = self.pool1(x) # Size를 (18,28,28) 에서 (18,14,14)로\n        \n        # 두번째 변환\n        x = self.conv2(x)\n        x = self.conv2_bn(x)\n        x = F.relu(x)\n        x = self.d2_2(x)\n        x = self.pool2(x)  # Size를 (18,14,14)에서 (18,7,7)로\n        \n        # 세번째 변환\n        x = self.conv3(x)\n        x = self.conv3_bn(x)\n        x = F.relu(x)\n        x = self.d2_3(x)\n        x = self.pool3(x) # Size를 (18,7,7)에서 (18,3,3)로\n        \n        #데이터를 신경망의 레이어의 input에 넣기 위해 Reshape\n        #Size가 (18,14,14)에서 (1,3528)로\n        # -1를 부르는 것은 현재 차원에서 주어진 다른 차원으로 바꾸는 것\n        x = x.view(-1, 256 * 3 * 3)\n        \n        #첫번째 완전히 연결된 layer를 계산\n        #Size가 (1,4608)에서 (1,64)로\n        #첫번째 완전히 연결된 layer를 계산(activation은 나중에 적용됨)\n        #Size가 (1,64)에서 (1,10)\n        x = F.relu(self.fc1(x))\n        x = self.d1_1(x)\n        \n        x = F.relu(self.fc2(x))\n        x = self.d1_2(x)\n        \n        x = F.relu(self.fc3(x))\n        x = self.d1_3(x)\n        \n        x = self.out(x)\n        return F.log_softmax(x, dim=-1)\n\nnet = Net().to(device)\nnet","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 출력값\n### 입력크기: (H,W), 필터크기: (FH,FW), 출력크기: (OH,OW), 패딩: P,스트라이드: S\nOH = (H + 2P - FH)/S + 1    \nOW = (W + 2P - FW)/S + 1"},{"metadata":{},"cell_type":"markdown","source":"## 풀링\n특징 :  \n학습해야 할 매개변수가 없음  \n채널 수가 변하지 않음(w,h 는 변함)  \n입력의 변화에 영향 적음  \n이미지에서는 보통 최대폴링 사용"},{"metadata":{"trusted":true},"cell_type":"code","source":"#밑바닥 딥러닝에 나온 공식\ndef outputSize(in_size, kernel_size, stride, padding):\n    output = int((in_size - kernel_size + 2 * (padding)) / stride) + 1\n    return(output)\n#outputSize(64,5,1,2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Learning Rate Finder https://sgugger.github.io/how-do-you-find-a-good-learning-rate.html\n\ndef find_lr(trn_loader, init_value = 1e-8, final_value=10., beta = 0.98):\n    num = len(trn_loader)-1\n    mult = (final_value / init_value) ** (1/num)\n    lr = init_value\n    optimizer.param_groups[0]['lr'] = lr\n    avg_loss = 0.\n    best_loss = 0.\n    batch_num = 0\n    losses = []\n    log_lrs = []\n    for data in trn_loader:\n        batch_num += 1\n        # 이전처럼 mini batch의 input/output을 위해 loss를 얻음\n        inputs = data[0].to(device)\n        labels = data[1].to(device)\n        optimizer.zero_grad()\n        outputs = net(inputs)\n        loss = criterion(outputs, labels)\n        # smooth loss를 계산\n        avg_loss = beta * avg_loss + (1-beta)*loss.item()\n        smoothed_loss = avg_loss / (1 - beta**batch_num)\n        #loss가 exploding이면 멈춤\n        if batch_num > 1 and smoothed_loss > 4 * best_loss:\n            return log_lrs, losses\n        #best loss를 기록\n        if smoothed_loss < best_loss or batch_num==1:\n            best_loss = smoothed_loss\n        # 값을 저장\n        losses.append(smoothed_loss)\n        log_lrs.append(math.log10(lr))\n        # SGD 단계 실시\n        loss.backward()\n        optimizer.step()\n        # lr를 다음 단계를 위해 업데이트\n        lr *= mult\n        optimizer.param_groups[0]['lr'] = lr\n    return log_lrs, losses","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"CrossEntropyLoss(\n![image.png](attachment:image.png)","attachments":{"image.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAArkAAABpCAYAAAA+/zuyAAAgAElEQVR4Ae2dv2sbyfvHv3/NdgIXgoCLQFxZlUWKiBQfw8EJAmdSnLnizEEQgSDcOE1EIJiDIAKHXBxKcfggoIOAUhilCEpxKBBQ4ApBQIVBheH58szOszv7S9rVruTV6h0IWu+P+fGaZ2aemXnmmf8j/AMBEAABEAABEAABEACBghH4v4LlB9kBARAAARAAARAAARAAAYKSCyEAARAAARAAARAAARAoHAEouYUrUmQIBEAABEAABEAABEAASi5kAARAAARAAARAAARAoHAEoOQWrkiRIRAAARAAARAAARAAASi5kAEQAAEQAAEQAAEQAIHCEYCSW7giRYZAAARAAARAAARAAASg5EIGQAAEQAAEQAAEQAAECkcASm7hihQZAgEQAAEQAAEQAAEQgJILGQABEAABEAABEAABECgcASi5hStSZAgEQAAEQAAEQAAEQABKLmQABEAABEAABEAABECgcASg5BauSJEhEAABEAABEAABEAABKLmQARAAARAAARAAARAAgcIRgJJbuCJFhkAABEAABEAABEAABKDkQgZAAARAAARAAARAAAQKRwBKbuGKFBkCARAAARAAARAAARCAkgsZAAEQAAEQAAEQAAEQKBwBKLmFK1JkCARAAARAAARAAARAAEouZAAEQAAEliQw+9Si2sEZDWZLBoDPQCDHBCDfOS6c3CRtRoPnVaq9HFIWzeDkzzpVf72k8U02GYSSmw1HhAICILBtBL51qL5TobOPWTTt2wYP+c09Ach37osoNwm8GVJrv0T1i3EGSZrS5c8lqpwOMlGaoeRmUCQIAgRAYMsIXA+ouW9R/Y8sGvUtY4fs5p8A5Dv/ZZS3FOpBUfMqg0G/kr9slGYouXkTFKQHBEAg5wRm1H+2R9aPncyW1HKeYSRvqwhAvrequDPM7PiPOln7TRpcpw909qFJezt16nxLFxaU3HT88DUIgMCWEZj+dUwlq0btL1uWcWR3KwhAvreimFeTyZsRtR9YVPr5kqapY5hR70mJrP0WDVPY50LJTV0QCAAEQGBrCHy/pOMdi/YyshfbGm7I6GYQgHxvRjnlOZWfW1SxStT4JwOzBS2PtdejpXMMJXdpdPgQBEBguwjoZdydY7r8vl05R263gQDkextKefV5tDeO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"}}},{"metadata":{"trusted":true},"cell_type":"code","source":"net = Net().to(device)\n\n#Loss Function(손실함수)\ncriterion = nn.CrossEntropyLoss()\n# criterion = F.nll_loss\n\n#Gradient Descent\n#optimizer = optim.SGD(net.parameters(),lr=1e-1)\noptimizer = optim.Adam(net.parameters(),lr=1e-1)\n\nlogs ,losses = find_lr(trn_loader = train_loader)\n#plt.plot(logs[10:-5],losses[10:-5])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## tensor.item()의 의미\n![image.png](attachment:image.png)","attachments":{"image.png":{"image/png":"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"}}},{"metadata":{"trusted":true},"cell_type":"code","source":"net = Net().to(device)\n\nEPOCHS = 1\nnn_output = []\n\n#optimizer = optim.SGD(net.parameters(),lr=1e-2)\noptimizer = optim.Adam(net.parameters(),lr = 4e-3)\ncriterion = nn.CrossEntropyLoss()\n#criterion = F.nll_loss\n\ndef get_num_correct(preds, labels):\n    return preds.argmax(dim=1).eq(labels).sum().item()\n    # y축의 최댓값의 인덱스 값을 얻고 label의 값과 같으면 합한후 int값으로 \n\nfor epoch in range(EPOCHS):\n    epoch_loss = 0\n    epoch_correct = 0\n    net.train()\n    \n    for data in train_loader:\n        # 데이터는 데이터의 하나의 batch\n        # 변환을 사용하기전에 빈 숫자 채널 배열(B 배치, C 채널수, H 높이, W 너비)\n        #을 넣기위해 .unsqeeze(1)을 사용\n        X = data[0].to(device) # X는 feature들의 batch\n        # unsqueeze는 색상채널을 위한 placeholder dimension을 추가함 \n        # -(8, 28, 28) to (8,1,28,28)\n        y = data[1].to(device) # y는 타겟의 batch\n        \n        net.zero_grad() # loss 계산 전에 gradients를 설정. 너는 모든 단계에서 사용할것임\n        output = net(X) # repashed batch를 통과시킴 (28x28 atm임을 떠올려라)\n        tloss = criterion(output,y) # loss값을 계산하고 저장\n        tloss.backward() # 네트워크의 파라미더에 loss backwards를 적용\n        optimizer.step() # loss/gradients를 계산하기 위해 weight를 최적화\n        \n        epoch_loss += tloss.item() # epoch_loss에 tloss 값들을 계속 더함\n        epoch_correct += get_num_correct(output,y)\n        \n    # validation set으로 평가\n    net.eval() # self.train(False)와 같음, Sets the module in evaluation mode.??\n    val_loss = 0\n    val_correct = 0\n    test_loss = 0\n    test_correct = 0\n    \n    with torch.no_grad():\n        # 첫번째 validation set\n        for data in val_loader:\n            X = data[0].to(device)\n            y = data[1].to(device)\n            \n            preds= net(X) # predctions를 얻음\n            vloss = criterion(preds, y) # loss를 계산\n            \n            val_correct += get_num_correct(preds, y)\n            val_loss += vloss.item()\n            \n        #두번째 validation Set\n        for data in test_loader:\n            X = data[0].to(device)\n            y = data[1].to(device)\n            \n            preds= net(X) # predctions를 얻음\n            tloss = criterion(preds, y) # loss를 계산\n            \n            test_correct += get_num_correct(preds, y)\n            test_loss += vloss.item()\n            \n    tmp_nn_output = [epoch + 1,EPOCHS,\n                     epoch_loss/len(train_loader.dataset), epoch_correct/len(train_loader.dataset)*100,\n                     val_loss/len(val_loader.dataset), val_correct/len(val_loader.dataset)*100,\n                     test_loss/len(test_loader.dataset), test_correct/len(test_loader.dataset)*100\n                    ]\n    nn_output.append(tmp_nn_output)\n    \n    # validation set의 loss와 accuracy 인쇄\n    print('Epoch [ {}/{} train loss:{:.6f} acc: {:.3f}  \\\n          valid loss: {:.6f} acc: {:.3f} \\\n          Test loss : {:.6f} acc: {:.3f}]'.format(*tmp_nn_output))\n         ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"vloss.type()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pd_results = pd.DataFrame(nn_output,\n    columns = ['epoch','total_epochs','train_loss','train_acc','valid_loss','valid_acc','test_loss','test_acc']\n                         )\ndisplay(pd_results)\n\nprint(\"Best Epoch: {}\".format(pd_results.loc[pd_results.valid_acc.idxmax()]['epoch']))\n# pd_result의 valid_acc 컬럼에서 max값을 가지는 인덱스를 loc[]안에 입력, pd_result에서 epoch 컬럼 선택","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12,4))\naxes[0].plot(pd_results['epoch'],pd_results['valid_loss'], label='validation_loss')\naxes[0].plot(pd_results['epoch'],pd_results['train_loss'], label='train_loss')\n#axes[0].plot(pd_results['epoch'],pd_results['test_loss'], label='test_loss')\naxes[0].legend()\n\naxes[1].plot(pd_results['epoch'],pd_results['valid_loss'], label='validation_loss')\naxes[1].plot(pd_results['epoch'],pd_results['train_loss'], label='train_loss')\n#axes[1].plot(pd_results['epoch'],pd_results['test_loss'], label='test_loss')\naxes[1].legend()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# torch.cat()\na = torch.ones(3,3)\nb = torch.zeros(3,3)\nc = torch.ones(3,3)+2\nprint(torch.cat([a,b,c],dim=0)) # 행결합\nprint(torch.cat([a,b,c],dim=1)) # 열결합","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"num_classes = len(classes)\n\n# Validation set을 confusion matrix를 만들 때 사용\nnet.eval() # 좋은 습관\npredictions = torch.LongTensor().to(device) # 모든 예측을 위한 tensor\n\n# val set을 goes through\nfor images, _ in val_loader:\n    images = images.to(device)\n    preds = net(images)\n    predictions = torch.cat((predictions, preds.argmax(dim=1)), dim=0)\n    # 주어진 차원의 tensor들의 sequnce를 합침. 모든 tensor는 같은 형태나 empty\n    \n# confusion matrix 만들기\ncmt = torch.zeros(num_classes, num_classes, dtype=torch.int32)\nfor i in range(len(val_labels)):\n    cmt[val_labels[i], predictions[i]] += 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cmt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# test set에 신경망의 예측값을 얻을시간!\n# test set을 DataLoader에 넣어라\nnet.eval() # safety first\npredictions = torch.LongTensor().to(device) # 모든 예측을 위한 Tensor\n\n# test set을 거침, \nfor images in submission_loader:\n    images = images.to(device)\n    preds= net(images)\n    predictions= torch.cat((predictions, preds.argmax(dim=1)),dim=0)","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":{"trusted":true},"cell_type":"code","source":"","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":{"trusted":true},"cell_type":"code","source":"","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":{"trusted":true},"cell_type":"code","source":"","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":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}