diff --git "a/assignments/Charmull/03-\354\265\234\354\247\200\353\257\274.ipynb" "b/assignments/Charmull/03-\354\265\234\354\247\200\353\257\274.ipynb"
new file mode 100644
index 0000000..fbeb807
--- /dev/null
+++ "b/assignments/Charmull/03-\354\265\234\354\247\200\353\257\274.ipynb"
@@ -0,0 +1,578 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "08d6feba",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Country name | \n",
+ " Regional indicator | \n",
+ " Ladder score | \n",
+ " Standard error of ladder score | \n",
+ " upperwhisker | \n",
+ " lowerwhisker | \n",
+ " Logged GDP per capita | \n",
+ " Social support | \n",
+ " Healthy life expectancy | \n",
+ " Freedom to make life choices | \n",
+ " Generosity | \n",
+ " Perceptions of corruption | \n",
+ " Ladder score in Dystopia | \n",
+ " Explained by: Log GDP per capita | \n",
+ " Explained by: Social support | \n",
+ " Explained by: Healthy life expectancy | \n",
+ " Explained by: Freedom to make life choices | \n",
+ " Explained by: Generosity | \n",
+ " Explained by: Perceptions of corruption | \n",
+ " Dystopia + residual | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " Finland | \n",
+ " Western Europe | \n",
+ " 7.842 | \n",
+ " 0.032 | \n",
+ " 7.904 | \n",
+ " 7.780 | \n",
+ " 10.775 | \n",
+ " 0.954 | \n",
+ " 72.000 | \n",
+ " 0.949 | \n",
+ " -0.098 | \n",
+ " 0.186 | \n",
+ " 2.43 | \n",
+ " 1.446 | \n",
+ " 1.106 | \n",
+ " 0.741 | \n",
+ " 0.691 | \n",
+ " 0.124 | \n",
+ " 0.481 | \n",
+ " 3.253 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " Denmark | \n",
+ " Western Europe | \n",
+ " 7.620 | \n",
+ " 0.035 | \n",
+ " 7.687 | \n",
+ " 7.552 | \n",
+ " 10.933 | \n",
+ " 0.954 | \n",
+ " 72.700 | \n",
+ " 0.946 | \n",
+ " 0.030 | \n",
+ " 0.179 | \n",
+ " 2.43 | \n",
+ " 1.502 | \n",
+ " 1.108 | \n",
+ " 0.763 | \n",
+ " 0.686 | \n",
+ " 0.208 | \n",
+ " 0.485 | \n",
+ " 2.868 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " Switzerland | \n",
+ " Western Europe | \n",
+ " 7.571 | \n",
+ " 0.036 | \n",
+ " 7.643 | \n",
+ " 7.500 | \n",
+ " 11.117 | \n",
+ " 0.942 | \n",
+ " 74.400 | \n",
+ " 0.919 | \n",
+ " 0.025 | \n",
+ " 0.292 | \n",
+ " 2.43 | \n",
+ " 1.566 | \n",
+ " 1.079 | \n",
+ " 0.816 | \n",
+ " 0.653 | \n",
+ " 0.204 | \n",
+ " 0.413 | \n",
+ " 2.839 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " Iceland | \n",
+ " Western Europe | \n",
+ " 7.554 | \n",
+ " 0.059 | \n",
+ " 7.670 | \n",
+ " 7.438 | \n",
+ " 10.878 | \n",
+ " 0.983 | \n",
+ " 73.000 | \n",
+ " 0.955 | \n",
+ " 0.160 | \n",
+ " 0.673 | \n",
+ " 2.43 | \n",
+ " 1.482 | \n",
+ " 1.172 | \n",
+ " 0.772 | \n",
+ " 0.698 | \n",
+ " 0.293 | \n",
+ " 0.170 | \n",
+ " 2.967 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Netherlands | \n",
+ " Western Europe | \n",
+ " 7.464 | \n",
+ " 0.027 | \n",
+ " 7.518 | \n",
+ " 7.410 | \n",
+ " 10.932 | \n",
+ " 0.942 | \n",
+ " 72.400 | \n",
+ " 0.913 | \n",
+ " 0.175 | \n",
+ " 0.338 | \n",
+ " 2.43 | \n",
+ " 1.501 | \n",
+ " 1.079 | \n",
+ " 0.753 | \n",
+ " 0.647 | \n",
+ " 0.302 | \n",
+ " 0.384 | \n",
+ " 2.798 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 144 | \n",
+ " Lesotho | \n",
+ " Sub-Saharan Africa | \n",
+ " 3.512 | \n",
+ " 0.120 | \n",
+ " 3.748 | \n",
+ " 3.276 | \n",
+ " 7.926 | \n",
+ " 0.787 | \n",
+ " 48.700 | \n",
+ " 0.715 | \n",
+ " -0.131 | \n",
+ " 0.915 | \n",
+ " 2.43 | \n",
+ " 0.451 | \n",
+ " 0.731 | \n",
+ " 0.007 | \n",
+ " 0.405 | \n",
+ " 0.103 | \n",
+ " 0.015 | \n",
+ " 1.800 | \n",
+ "
\n",
+ " \n",
+ " | 145 | \n",
+ " Botswana | \n",
+ " Sub-Saharan Africa | \n",
+ " 3.467 | \n",
+ " 0.074 | \n",
+ " 3.611 | \n",
+ " 3.322 | \n",
+ " 9.782 | \n",
+ " 0.784 | \n",
+ " 59.269 | \n",
+ " 0.824 | \n",
+ " -0.246 | \n",
+ " 0.801 | \n",
+ " 2.43 | \n",
+ " 1.099 | \n",
+ " 0.724 | \n",
+ " 0.340 | \n",
+ " 0.539 | \n",
+ " 0.027 | \n",
+ " 0.088 | \n",
+ " 0.648 | \n",
+ "
\n",
+ " \n",
+ " | 146 | \n",
+ " Rwanda | \n",
+ " Sub-Saharan Africa | \n",
+ " 3.415 | \n",
+ " 0.068 | \n",
+ " 3.548 | \n",
+ " 3.282 | \n",
+ " 7.676 | \n",
+ " 0.552 | \n",
+ " 61.400 | \n",
+ " 0.897 | \n",
+ " 0.061 | \n",
+ " 0.167 | \n",
+ " 2.43 | \n",
+ " 0.364 | \n",
+ " 0.202 | \n",
+ " 0.407 | \n",
+ " 0.627 | \n",
+ " 0.227 | \n",
+ " 0.493 | \n",
+ " 1.095 | \n",
+ "
\n",
+ " \n",
+ " | 147 | \n",
+ " Zimbabwe | \n",
+ " Sub-Saharan Africa | \n",
+ " 3.145 | \n",
+ " 0.058 | \n",
+ " 3.259 | \n",
+ " 3.030 | \n",
+ " 7.943 | \n",
+ " 0.750 | \n",
+ " 56.201 | \n",
+ " 0.677 | \n",
+ " -0.047 | \n",
+ " 0.821 | \n",
+ " 2.43 | \n",
+ " 0.457 | \n",
+ " 0.649 | \n",
+ " 0.243 | \n",
+ " 0.359 | \n",
+ " 0.157 | \n",
+ " 0.075 | \n",
+ " 1.205 | \n",
+ "
\n",
+ " \n",
+ " | 148 | \n",
+ " Afghanistan | \n",
+ " South Asia | \n",
+ " 2.523 | \n",
+ " 0.038 | \n",
+ " 2.596 | \n",
+ " 2.449 | \n",
+ " 7.695 | \n",
+ " 0.463 | \n",
+ " 52.493 | \n",
+ " 0.382 | \n",
+ " -0.102 | \n",
+ " 0.924 | \n",
+ " 2.43 | \n",
+ " 0.370 | \n",
+ " 0.000 | \n",
+ " 0.126 | \n",
+ " 0.000 | \n",
+ " 0.122 | \n",
+ " 0.010 | \n",
+ " 1.895 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
149 rows × 20 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Country name Regional indicator Ladder score \\\n",
+ "0 Finland Western Europe 7.842 \n",
+ "1 Denmark Western Europe 7.620 \n",
+ "2 Switzerland Western Europe 7.571 \n",
+ "3 Iceland Western Europe 7.554 \n",
+ "4 Netherlands Western Europe 7.464 \n",
+ ".. ... ... ... \n",
+ "144 Lesotho Sub-Saharan Africa 3.512 \n",
+ "145 Botswana Sub-Saharan Africa 3.467 \n",
+ "146 Rwanda Sub-Saharan Africa 3.415 \n",
+ "147 Zimbabwe Sub-Saharan Africa 3.145 \n",
+ "148 Afghanistan South Asia 2.523 \n",
+ "\n",
+ " Standard error of ladder score upperwhisker lowerwhisker \\\n",
+ "0 0.032 7.904 7.780 \n",
+ "1 0.035 7.687 7.552 \n",
+ "2 0.036 7.643 7.500 \n",
+ "3 0.059 7.670 7.438 \n",
+ "4 0.027 7.518 7.410 \n",
+ ".. ... ... ... \n",
+ "144 0.120 3.748 3.276 \n",
+ "145 0.074 3.611 3.322 \n",
+ "146 0.068 3.548 3.282 \n",
+ "147 0.058 3.259 3.030 \n",
+ "148 0.038 2.596 2.449 \n",
+ "\n",
+ " Logged GDP per capita Social support Healthy life expectancy \\\n",
+ "0 10.775 0.954 72.000 \n",
+ "1 10.933 0.954 72.700 \n",
+ "2 11.117 0.942 74.400 \n",
+ "3 10.878 0.983 73.000 \n",
+ "4 10.932 0.942 72.400 \n",
+ ".. ... ... ... \n",
+ "144 7.926 0.787 48.700 \n",
+ "145 9.782 0.784 59.269 \n",
+ "146 7.676 0.552 61.400 \n",
+ "147 7.943 0.750 56.201 \n",
+ "148 7.695 0.463 52.493 \n",
+ "\n",
+ " Freedom to make life choices Generosity Perceptions of corruption \\\n",
+ "0 0.949 -0.098 0.186 \n",
+ "1 0.946 0.030 0.179 \n",
+ "2 0.919 0.025 0.292 \n",
+ "3 0.955 0.160 0.673 \n",
+ "4 0.913 0.175 0.338 \n",
+ ".. ... ... ... \n",
+ "144 0.715 -0.131 0.915 \n",
+ "145 0.824 -0.246 0.801 \n",
+ "146 0.897 0.061 0.167 \n",
+ "147 0.677 -0.047 0.821 \n",
+ "148 0.382 -0.102 0.924 \n",
+ "\n",
+ " Ladder score in Dystopia Explained by: Log GDP per capita \\\n",
+ "0 2.43 1.446 \n",
+ "1 2.43 1.502 \n",
+ "2 2.43 1.566 \n",
+ "3 2.43 1.482 \n",
+ "4 2.43 1.501 \n",
+ ".. ... ... \n",
+ "144 2.43 0.451 \n",
+ "145 2.43 1.099 \n",
+ "146 2.43 0.364 \n",
+ "147 2.43 0.457 \n",
+ "148 2.43 0.370 \n",
+ "\n",
+ " Explained by: Social support Explained by: Healthy life expectancy \\\n",
+ "0 1.106 0.741 \n",
+ "1 1.108 0.763 \n",
+ "2 1.079 0.816 \n",
+ "3 1.172 0.772 \n",
+ "4 1.079 0.753 \n",
+ ".. ... ... \n",
+ "144 0.731 0.007 \n",
+ "145 0.724 0.340 \n",
+ "146 0.202 0.407 \n",
+ "147 0.649 0.243 \n",
+ "148 0.000 0.126 \n",
+ "\n",
+ " Explained by: Freedom to make life choices Explained by: Generosity \\\n",
+ "0 0.691 0.124 \n",
+ "1 0.686 0.208 \n",
+ "2 0.653 0.204 \n",
+ "3 0.698 0.293 \n",
+ "4 0.647 0.302 \n",
+ ".. ... ... \n",
+ "144 0.405 0.103 \n",
+ "145 0.539 0.027 \n",
+ "146 0.627 0.227 \n",
+ "147 0.359 0.157 \n",
+ "148 0.000 0.122 \n",
+ "\n",
+ " Explained by: Perceptions of corruption Dystopia + residual \n",
+ "0 0.481 3.253 \n",
+ "1 0.485 2.868 \n",
+ "2 0.413 2.839 \n",
+ "3 0.170 2.967 \n",
+ "4 0.384 2.798 \n",
+ ".. ... ... \n",
+ "144 0.015 1.800 \n",
+ "145 0.088 0.648 \n",
+ "146 0.493 1.095 \n",
+ "147 0.075 1.205 \n",
+ "148 0.010 1.895 \n",
+ "\n",
+ "[149 rows x 20 columns]"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "df = pd.read_csv('./world-happiness-report-2021.csv')\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0954c309",
+ "metadata": {},
+ "source": [
+ "## Assignment 1\n",
+ "행복 지수를 1점 간격으로 두고 다음과 같은 Histogram을 작성 해 주세요. 행복 지수의 키 값은 \"Ladder score\" 입니다."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 98,
+ "id": "332b8e2c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEWCAYAAABhffzLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAVQ0lEQVR4nO3de9RddX3n8fcHgnIRCkhgwkXTadHKaItOpCrWtgKWihjqFC+rdILS4nSsxU5nnNRZs9Y4rra4qi47LJ1ZFMVUrBVFCxVHzcRia1EgXBQQLF4iKJEEELlolct3/ti/6CHJEx5C9nOeJ7/3a62zzr6dvb/7Wcnn/M7v7P07qSokSf3YZdoFSJLmlsEvSZ0x+CWpMwa/JHXG4Jekzhj8ktQZg19dSvKkJPcm2XXatUhzzeDX1CRZl+TYzZadmuRzYx+7qm6uqidU1YNjH2s2kpyW5MYk9yS5LcnFSfaedl3aOS2adgFS75L8MvCnwPFVdXWS/YETd/AxFlXVAztyn1q4bPFrXkuyMsnXWkv4y0l+Y2LdqUn+KclZSb7XWszHTKy/JMmfJbm8rb+whSpJliapJIsmtn1L2989ST6d5ICJfT0nyaVJ7kryxSS/slkdX2+v+0aS32rLfzbJZ9uxb0/yoRlO89nA56vqaoCqurOqVlXVPW0/eyR5e5Jvtn19Lskebd1Lk1zf6rokydMm6lqX5L8m+RJwX5JF2zoPdaSqfPiYygNYBxy72bJTgc9NzJ8MHMzQSHkFcB+wZGLbB4A/BHZr678H7N/WXwJ8G3g6sBdwAXBeW7cUKGDRxLZfA54C7NHmz2zrDgHuAF7c6jiuzS9u+70beGrbdgnwb9r0B4H/1l6zO/D8Gf4OvwT8AHgzcDTw+M3Wv6vVcwiwK/A84PGt1vtaPbsBbwS+Cjxu4u97DXBYO6cZz2Pa/xZ8zO3DFr+m7W9b6/OuJHcB755cWVUfrqpbq+qhqvoQcBNw1MQmG4B3VtX9bf1XgBMm1r+/qq6rqvuA/w68fBtf6J5bVf9cVT8AzgeObMtPAT5RVZ9odawG1jIEKMBDwNOT7FFV66vq+rb8fuDJwMFV9S9VtdXvLqrqH4GXAc8CLgbuSPKOJLsm2QV4DXBGVX27qh6sqkur6ocMb3QXV9XqqrofeBtDwD9vYvf/q6puaef0SOehThj8mraTqmrfTQ/gP06uTPLvk1wz8cbwdOCAiU2+XVWTIw1+k+ETwia3bLZut81eP+k7E9PfB57Qpp8MnLzZG9TzGT553McQwP8BWN++lP259ro3AgEub90xr5npj1BV/7eqTgT2B5YzfJr5nVbr7gyfRjZ3cDunTft4qJ3vITOc/4znMVNd2jkZ/Jq3kjwZ+Evg94EntjeG6xjCdJNDkkzOPwm4dWL+sM3W3Q/c/ihLuYXhk8O+E4+9qupMgKr6VFUdxxCgN7aaqarvVNXvVtXBwGuBdyf52W0dqLXE1wCfYXiTux34F+BntrL5rQxhDkD7OxzG0L31413O9jzUD4Nf89leDMG1ESDJqxnCcNKBwB8k2S3JycDTgE9MrD8lyRFJ9gT+J/CRevSXcJ4HnJjk11r3y+5JfiXJoUkOal+w7gX8ELgXeLDVe3KSQ9s+vtvOZYtjJ1me5JVJ9svgKOCXgS+0Vvx7gXckObgd/7lJHs/QHXVCkmOS7Ab8Uavh0kd7Ho/y76EFzuDXvFVVXwbeDnweuA14BvBPm212GXA4Q8v4T4DfrKo7Jta/H3gfQzfO7sAfbEcdtzB0v7yJ4U3oFuC/MPz/2YUhcG8F7mQI7E3dVc8GLktyL3ARQz/9N7ZyiO8Cv8vw/cXdDAH951X1gbb+PwPXAle0Y7wV2KWqvsLQb39WO/8TgROr6kfbcR7qSB7ePSotHElOBX6nqp4/w/pLGK7iOWcu65LmO9/pJakzBr8kdcauHknqjC1+SerMghik7YADDqilS5dOuwxJWlCuvPLK26tq8ebLF0TwL126lLVr1067DElaUJJ8c2vL7eqRpM6M2uJPsg64h+FuxQeqalkbFvdDDKMjrgNeXlXfHbMOSdJPzEWL/1er6siqWtbmVwJrqupwYE2blyTNkWl09SwHVrXpVcBJU6hBkro1dvAX8OkkVyY5vS07qKrWA7TnA7f2wiSnJ1mbZO3GjRtHLlOS+jH2VT1HV9WtSQ4EVie5cbYvrKqzgbMBli1b5l1mkrSDjNrir6pb2/MG4GMMv5x0W5IlAO15w5g1SJIebrTgT7JXkr03TQMvYvgRjYuAFW2zFcCFY9UgSdrSmF09BwEfaz+OtAj466r6ZJIrgPOTnAbczPBj2pKkOTJa8FfV14Ff2MryO4BjxjquNJOlKy+edgmztu7MEx55I2k7eeeuJHXG4Jekzhj8ktQZg1+SOmPwS1JnDH5J6ozBL0mdMfglqTMGvyR1xuCXpM4Y/JLUGYNfkjpj8EtSZwx+SeqMwS9JnTH4JakzBr8kdcbgl6TOGPyS1BmDX5I6Y/BLUmcMfknqjMEvSZ0x+CWpMwa/JHXG4Jekzhj8ktQZg1+SOmPwS1JnDH5J6ozBL0mdMfglqTMGvyR1xuCXpM6MHvxJdk1ydZKPt/n9k6xOclN73m/sGiRJPzEXLf4zgBsm5lcCa6rqcGBNm5ckzZFRgz/JocAJwDkTi5cDq9r0KuCkMWuQJD3c2C3+dwJvBB6aWHZQVa0HaM8Hbu2FSU5PsjbJ2o0bN45cpiT1Y7TgT/ISYENVXbk9r6+qs6tqWVUtW7x48Q6uTpL6tWjEfR8NvDTJi4HdgX2SnAfclmRJVa1PsgTYMGINkqTNjNbir6o/rqpDq2op8ErgM1V1CnARsKJttgK4cKwaJElbmsZ1/GcCxyW5CTiuzUuS5siYXT0/VlWXAJe06TuAY+biuJKkLXnnriR1xuCXpM4Y/JLUGYNfkjpj8EtSZwx+SeqMwS9JnTH4JakzBr8kdcbgl6TOGPyS1Jk5GatHO6elKy+edgmStoMtfknqjMEvSZ0x+CWpM/bxS/PQQvv+ZN2ZJ0y7BD0KtvglqTMGvyR1xuCXpM4Y/JLUGYNfkjpj8EtSZwx+SeqMwS9JnTH4JakzBr8kdcbgl6TOGPyS1BmDX5I6Y/BLUmcMfknqjMEvSZ0x+CWpM6MFf5Ldk1ye5ItJrk/y5rZ8/ySrk9zUnvcbqwZJ0pbGbPH/EHhhVf0CcCRwfJLnACuBNVV1OLCmzUuS5showV+De9vsbu1RwHJgVVu+CjhprBokSVsatY8/ya5JrgE2AKur6jLgoKpaD9CeD5zhtacnWZtk7caNG8csU5K6MmrwV9WDVXUkcChwVJKnP4rXnl1Vy6pq2eLFi0erUZJ6MydX9VTVXcAlwPHAbUmWALTnDXNRgyRpMOZVPYuT7Num9wCOBW4ELgJWtM1WABeOVYMkaUuLRtz3EmBVkl0Z3mDOr6qPJ/k8cH6S04CbgZNHrEGStJnRgr+qvgQ8cyvL7wCOGeu4kqRt885dSerMrII/yZrZLJMkzX/b7OpJsjuwJ3BAG1ohbdU+wMEj1yZJGsEj9fG/FngDQ8hfyU+C/27gXeOVJUkayzaDv6r+AviLJK+vqrPmqCZJ0ohmdVVPVZ2V5HnA0snXVNVfjVSXJGkkswr+JO8Hfga4BniwLS7A4JekBWa21/EvA46oqhqzGEnS+GZ7Hf91wL8asxBJ0tyYbYv/AODLSS5n+IEVAKrqpaNUJUkazWyD/3+MWYQkae7M9qqez45diCRpbsz2qp57GK7iAXgcw88o3ldV+4xVmCRpHLNt8e89OZ/kJOCoMQqSJI1ru0bnrKq/BV64Y0uRJM2F2Xb1vGxidheG6/q9pl+SFqDZXtVz4sT0A8A6YPkOr0aSNLrZ9vG/euxCJElzY7Y/xHJoko8l2ZDktiQXJDl07OIkSTvebL/cPRe4iGFc/kOAv2vLJEkLzGyDf3FVnVtVD7TH+4DFI9YlSRrJbIP/9iSnJNm1PU4B7hizMEnSOGYb/K8BXg58B1gP/CbgF76StADN9nLOtwArquq7AEn2B97G8IYgSVpAZtvi//lNoQ9QVXcCzxynJEnSmGYb/Lsk2W/TTGvxz/bTgiRpHplteL8duDTJRxiGang58CejVSVJGs1s79z9qyRrGQZmC/CyqvryqJVJkkYx6+6aFvSGvSQtcNs1LLMkaeEy+CWpMwa/JHXG4JekzowW/EkOS/L3SW5Icn2SM9ry/ZOsTnJTe97vkfYlSdpxxmzxPwD8UVU9DXgO8LokRwArgTVVdTiwps1LkubIaMFfVeur6qo2fQ9wA8NY/suBVW2zVcBJY9UgSdrSnPTxJ1nKMLbPZcBBVbUehjcH4MAZXnN6krVJ1m7cuHEuypSkLowe/EmeAFwAvKGq7p7t66rq7KpaVlXLFi/2N18kaUcZNfiT7MYQ+h+oqo+2xbclWdLWLwE2jFmDJOnhxryqJ8B7gBuq6h0Tqy4CVrTpFcCFY9UgSdrSmEMrHw38NnBtkmvasjcBZwLnJzkNuBk4ecQaJEmbGS34q+pzDCN5bs0xYx1XkrRt3rkrSZ0x+CWpMwa/JHXG4Jekzhj8ktQZg1+SOmPwS1JnxryBS1Inlq68eNolzNq6M0+YdglTZ4tfkjpj8EtSZwx+SeqMwS9JnTH4JakzBr8kdcbgl6TOGPyS1BmDX5I6Y/BLUmcMfknqjMEvSZ0x+CWpMwa/JHXG4Jekzhj8ktQZg1+SOmPwS1JnDH5J6ozBL0mdMfglqTMGvyR1xuCXpM4Y/JLUmUXTLkAPt3TlxdMuQdJObrQWf5L3JtmQ5LqJZfsnWZ3kpva831jHlyRt3ZhdPe8Djt9s2UpgTVUdDqxp85KkOTRa8FfVPwB3brZ4ObCqTa8CThrr+JKkrZvrL3cPqqr1AO35wDk+viR1b95e1ZPk9CRrk6zduHHjtMuRpJ3GXAf/bUmWALTnDTNtWFVnV9Wyqlq2ePHiOStQknZ2cx38FwEr2vQK4MI5Pr4kdW/Myzk/CHweeGqSbyU5DTgTOC7JTcBxbV6SNIdGu4Grql41w6pjxjqmJOmRzdsvdyVJ4zD4JakzBr8kdcbgl6TOGPyS1BmDX5I6Y/BLUmcMfknqjMEvSZ0x+CWpMwa/JHXG4Jekzhj8ktQZg1+SOmPwS1JnDH5J6ozBL0mdMfglqTMGvyR1xuCXpM4Y/JLUGYNfkjpj8EtSZwx+SeqMwS9JnTH4JakzBr8kdcbgl6TOGPyS1BmDX5I6Y/BLUmcMfknqjMEvSZ1ZNO0CxrZ05cXTLkGS5pWptPiTHJ/kK0m+mmTlNGqQpF7NefAn2RV4F/DrwBHAq5IcMdd1SFKvptHiPwr4alV9vap+BPwNsHwKdUhSl6bRx38IcMvE/LeAX9x8oySnA6e32XuTfGU7j3cAcPt2vnYaFlK9C6lWWFj1LqRaYQHVm7cunFqbx1Lvk7e2cBrBn60sqy0WVJ0NnP2YD5asraplj3U/c2Uh1buQaoWFVe9CqhUWVr0LqVYYp95pdPV8CzhsYv5Q4NYp1CFJXZpG8F8BHJ7kp5M8DnglcNEU6pCkLs15V09VPZDk94FPAbsC762q60c85GPuLppjC6nehVQrLKx6F1KtsLDqXUi1wgj1pmqL7nVJ0k7MIRskqTMGvyR1ZqcN/iSHJfn7JDckuT7JGdOuaSZJdk9yeZIvtlrfPO2aHkmSXZNcneTj067lkSRZl+TaJNckWTvteh5Jkn2TfCTJje3f73OnXdPWJHlq+5tuetyd5A3TrmsmSf6w/f+6LskHk+w+7Zq2JckZrdbrd/Tfdaft40+yBFhSVVcl2Ru4Ejipqr485dK2kCTAXlV1b5LdgM8BZ1TVF6Zc2oyS/CdgGbBPVb1k2vVsS5J1wLKqWhA37SRZBfxjVZ3Trnzbs6rumnJZ29SGYvk28ItV9c1p17O5JIcw/L86oqp+kOR84BNV9b7pVrZ1SZ7OMKrBUcCPgE8Cv1dVN+2I/e+0Lf6qWl9VV7Xpe4AbGO4anndqcG+b3a095u07cpJDgROAc6Zdy84myT7AC4D3AFTVj+Z76DfHAF+bj6E/YRGwR5JFwJ7M7/uHngZ8oaq+X1UPAJ8FfmNH7XynDf5JSZYCzwQum3IpM2pdJ9cAG4DVVTVvawXeCbwReGjKdcxWAZ9OcmUbCmQ++9fARuDc1pV2TpK9pl3ULLwS+OC0i5hJVX0beBtwM7Ae+F5VfXq6VW3TdcALkjwxyZ7Ai3n4ja+PyU4f/EmeAFwAvKGq7p52PTOpqger6kiGO5mPah/15p0kLwE2VNWV067lUTi6qp7FMCLs65K8YNoFbcMi4FnA/66qZwL3AfN66PLWHfVS4MPTrmUmSfZjGAzyp4GDgb2SnDLdqmZWVTcAbwVWM3TzfBF4YEftf6cO/tZffgHwgar66LTrmY32sf4S4PjpVjKjo4GXtn7zvwFemOS86Za0bVV1a3veAHyMod90vvoW8K2JT3wfYXgjmM9+Hbiqqm6bdiHbcCzwjaraWFX3Ax8Fnjflmrapqt5TVc+qqhcAdwI7pH8fduLgb1+Yvge4oareMe16tiXJ4iT7tuk9GP6R3jjVomZQVX9cVYdW1VKGj/efqap523JKslf7cp/WZfIiho/R81JVfQe4JclT26JjgHl3QcJmXsU87uZpbgaek2TPlg3HMHzvN28lObA9Pwl4GTvwb7wz//Ti0cBvA9e2vnOAN1XVJ6ZX0oyWAKvalRG7AOdX1by/THKBOAj42PB/nUXAX1fVJ6db0iN6PfCB1oXydeDVU65nRq3/+TjgtdOuZVuq6rIkHwGuYugyuZr5P3TDBUmeCNwPvK6qvrujdrzTXs4pSdq6nbarR5K0dQa/JHXG4Jekzhj8ktQZg1+SOmPwS1JnDH5pJG0wMGneMfilCe1O34vbbyNcl+QVSZ6d5NK27PIke7ffUDi3jfN/dZJfba8/NcmHk/wdw8BweyV5b5Ir2nbLp3yK0k595660PY4Hbq2qEwCS/BTDXZ6vqKor2rDJPwDOAKiqZyT5OYaQf0rbx3OBn6+qO5P8KcOwFq9pw3JcnuT/VdV9c3xe0o/Z4pce7lrg2CRvTfJLwJOA9VV1BUBV3d3GR38+8P627Ebgm8Cm4F9dVXe26RcBK9uwIZcAu7d9SlNji1+aUFX/nOTfMox//mfAp9n6j+JkG7uZbM0H+HdV9ZUdV6X02NjilyYkORj4flWdx/DDHc8BDk7y7LZ+7/al7T8Av9WWPYWhFb+1cP8U8Po2IiRJnjn+WUjbZotferhnAH+e5CGGURF/j6HVflYbMvsHDMNmvxv4P0muZRjt8dSq+mHL90lvYfjFsi+18F8HzOvfKNbOz9E5JakzdvVIUmcMfknqjMEvSZ0x+CWpMwa/JHXG4Jekzhj8ktSZ/w/7HJiff+6ymAAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "s = df.loc[:, 'Ladder score'].values # df['Ladder score']\n",
+ "plt.hist(s, [i for i in range(2,10)])\n",
+ "plt.xlabel('score')\n",
+ "plt.ylabel('count')\n",
+ "plt.title('Happiness Score')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3fd7689c",
+ "metadata": {},
+ "source": [
+ "## Assignment 2\n",
+ "행복 지수를 y축으로, GDP를 x축으로 하여, scatter 한 값을 한 번 입력 해 보세요."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 99,
+ "id": "6bc575d4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "x = df.loc[:, 'Logged GDP per capita'].values\n",
+ "y = df.loc[:, 'Ladder score'].values\n",
+ "plt.scatter(x, y)\n",
+ "plt.xlabel('GDP')\n",
+ "plt.ylabel('score')\n",
+ "plt.title('Happiness Score per GDP')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cc80485f",
+ "metadata": {},
+ "source": [
+ "## Assignment 3\n",
+ "행복지수 상위 10개, 하위 10개를 선택 후, 각각의 Social support, Logged GDP per capita, Freedom to make life choices 의 평균을 구해서 막대 그래프로 나타내세요."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "id": "65b8f46c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "x = ['Social', 'GDP', 'Freedom']\n",
+ "x_axis = np.arange(len(x))\n",
+ "plt.xticks(x_axis, x)\n",
+ "\n",
+ "y1_head10 = df.sort_values(by='Ladder score', ascending=False).head(10)\n",
+ "y2_tail10 = df.sort_values(by='Ladder score', ascending=False).tail(10)\n",
+ "y1 = [y1_head10['Social support'].mean()*10, y1_head10['Logged GDP per capita'].mean(), y1_head10['Freedom to make life choices'].mean()*10]\n",
+ "y2 = [y2_tail10['Social support'].mean()*10, y2_tail10['Logged GDP per capita'].mean(), y2_tail10['Freedom to make life choices'].mean()*10]\n",
+ "\n",
+ "plt.bar(x_axis-0.2, y1, width=0.3, color='green', label='Happy')\n",
+ "plt.bar(x_axis+0.2, y2, width=0.3, color='blue', label='Unhappy')\n",
+ "\n",
+ "plt.xlabel('Attribute')\n",
+ "plt.ylabel('Score')\n",
+ "plt.title('Happy Country and Unhappy Country')\n",
+ "plt.legend(loc=1)\n",
+ "plt.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git "a/assignments/Charmull/04~09-\354\265\234\354\247\200\353\257\274.ipynb" "b/assignments/Charmull/04~09-\354\265\234\354\247\200\353\257\274.ipynb"
new file mode 100644
index 0000000..fa57266
--- /dev/null
+++ "b/assignments/Charmull/04~09-\354\265\234\354\247\200\353\257\274.ipynb"
@@ -0,0 +1,1206 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "fb78f666",
+ "metadata": {},
+ "source": [
+ "## Module Import"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "570828be",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import sklearn"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5353befe",
+ "metadata": {},
+ "source": [
+ "## Assignment 1.\n",
+ "우리는 붓꽃의 **꽃받침의 길이, 꽃받침의 너비, 꽃잎의 길이, 꽃잎의 너비**를 통해서, **꽃의 종류**를 구분 해 볼 것입니다. **Input**으로 주어 지는 데이터는 다음과 같습니다.\n",
+ "\n",
+ "- Sepal Length: 꽃받침의 길이 정보이다.\n",
+ "- Sepal Width: 꽃받침의 너비 정보이다.\n",
+ "- Petal Length: 꽃잎의 길이 정보이다.\n",
+ "- Petal Width: 꽃잎의 너비 정보이다.\n",
+ "- Species: 꽃의 종류 정보이다. **setosa / versicolor / virginica** 의 3종류로 구분된다."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "a3b18df3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "X_train의 shape: (100, 4)\n",
+ "X_test의 shape: (50, 4)\n",
+ "y_train의 shape: (100,)\n",
+ "y_test의 shape: (50,)\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.datasets import load_iris\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "data = load_iris()\n",
+ "X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.33, random_state=42, shuffle=True)\n",
+ "\n",
+ "print(\"X_train의 shape:\", X_train.shape)\n",
+ "print(\"X_test의 shape:\", X_test.shape)\n",
+ "print(\"y_train의 shape:\", y_train.shape)\n",
+ "print(\"y_test의 shape:\", y_test.shape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9b53defd",
+ "metadata": {},
+ "source": [
+ "### 1-1. Data Normalization\n",
+ "첫 번째로, 데이터를 정규화 하는 것이 중요 할 것 같습니다. 데이터를 정규화 해 보세요.\n",
+ "\n",
+ "(Min - Max 정규화를 이용하면 될 것 같죠? hint: ndarray.min(), ndarray.max())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "25ebc396",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[[0.73684211 0.36842105 0.53947368 0.15789474]\n",
+ " [0.98684211 0.38157895 0.85526316 0.26315789]\n",
+ " [0.72368421 0.38157895 0.57894737 0.18421053]\n",
+ " [0.65789474 0.44736842 0.17105263 0.01315789]\n",
+ " [1. 0.35526316 0.86842105 0.25 ]\n",
+ " [0.75 0.34210526 0.52631579 0.11842105]\n",
+ " [0.67105263 0.43421053 0.17105263 0.01315789]\n",
+ " [0.64473684 0.44736842 0.15789474 0.02631579]\n",
+ " [0.65789474 0.48684211 0.23684211 0.03947368]\n",
+ " [0.64473684 0.25 0.44736842 0.11842105]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "X_train = (X_train - X_train.min()) / (X_train.max() - X_train.min())\n",
+ "X_test = (X_test - X_test.min()) / (X_test.max() - X_test.min())\n",
+ "print(X_train[:10])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fd97af39",
+ "metadata": {},
+ "source": [
+ "## 1-2. Data Training\n",
+ "그 다음으로는 이제 데이터를 학습 시킬 시간입니다! SVM 모듈을 import 한 후, 학습을 시켜 보도록 하겠습니다."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "9c989b42",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "정확도 (accuracy): 100.0%\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.svm import SVC\n",
+ "\n",
+ "svm = SVC(C=2)\n",
+ "svm.fit(X_train, y_train)\n",
+ "\n",
+ "accuracy = (sum(svm.predict(X_test) == y_test) / 50) * 100\n",
+ "print(f'정확도 (accuracy): {accuracy}%')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "162aa7df",
+ "metadata": {},
+ "source": [
+ "## Assignment 2.\n",
+ "다음은 **MNIST 데이터**에 대해 분류를 해보는 연습을 해 보겠습니다. **MNIST**는 손글씨 데이터로, **Input Data**는 [28 x 28]의 데이터로 이루어져 있습니다. 일단, 우리가 이를 학습 시키기 전에 한번 데이터를 확인 해 볼까요?\n",
+ "\n",
+ "이 예제는 DNN을 이용하기 때문에, **Pytorch**로 진행 하겠습니다. 실습은 **Hyperparameter**만 고치면 됩니다.\n",
+ "\n",
+ "**학습률 95%에 도전 해 보세요!**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "09585b1f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import time\n",
+ "import random\n",
+ "import torch\n",
+ "import torch.nn as nn\n",
+ "from torchvision.datasets import MNIST\n",
+ "from torchvision import transforms\n",
+ "from torch.utils.data import DataLoader\n",
+ "import torch.nn.functional as F"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "52693fc8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# 이 부분은 절대 변경하지 마세요.\n",
+ "\n",
+ "RANDOM_SEED = 123\n",
+ "DEVICE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')\n",
+ "\n",
+ "random.seed(RANDOM_SEED)\n",
+ "torch.manual_seed(RANDOM_SEED)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c795ae90",
+ "metadata": {},
+ "source": [
+ "## 2-0. Data Load\n",
+ "데이터를 불러와 보겠습니다. `transforms.Compose`를 이용하여, 데이터를 pytorch에서 사용하는 **Tensor**형으로 바꾸고, 이를 **Gaussian Distribution**으로 정규화합니다."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "6b9bbb9f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 수정 가능한 셀입니다.\n",
+ "BATCH_SIZE = 64 # 60000을 사용하면, Full-Batch 학습을 진행 합니다."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "d1eb9987",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Don't Touch!\n",
+ "custom_train_transform = transforms.Compose([ \n",
+ " transforms.ToTensor(),\n",
+ " transforms.Normalize(mean=(0.5,), std=(0.5,))\n",
+ "])\n",
+ "\n",
+ "custom_test_transform = transforms.Compose([\n",
+ " transforms.ToTensor(),\n",
+ " transforms.Normalize(mean=(0.5,), std=(0.5,))\n",
+ "])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "946bb0ec",
+ "metadata": {},
+ "source": [
+ "`MNIST`를 이용하여 **MNIST** 데이터를 불러 오고, 이를 transform 해 줍니다. 또한, `DataLoader`를 이용하여, 셔플을 해준 후, 미니 배치를 생성 합니다."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "c0b80568",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train_dataset = MNIST(\".\", train=True, download=True, transform=custom_train_transform)\n",
+ "\n",
+ "train_loader = DataLoader(dataset=train_dataset,\n",
+ " batch_size=BATCH_SIZE,\n",
+ " shuffle=True,\n",
+ " drop_last=True,\n",
+ " num_workers=2)\n",
+ "\n",
+ "\n",
+ "test_dataset = MNIST(\".\", train=False, download=True, transform=custom_test_transform)\n",
+ "\n",
+ "test_loader = DataLoader(dataset=test_dataset,\n",
+ " batch_size=BATCH_SIZE,\n",
+ " shuffle=False,\n",
+ " num_workers=2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0908c769",
+ "metadata": {},
+ "source": [
+ "데이터가 잘 들어 왔는지 확인 합니다."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "da2ccbc2",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " | Batch index: 0 | Batch size: 64\n",
+ "input batch의 모양: (64, 1, 28, 28)\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "break minibatch for-loop\n"
+ ]
+ }
+ ],
+ "source": [
+ "for batch_idx, (x, y) in enumerate(train_loader):\n",
+ " print(' | Batch index:', batch_idx, end='')\n",
+ " print(' | Batch size:', y.size()[0])\n",
+ "\n",
+ " x = x.to(DEVICE)\n",
+ " y = y.to(DEVICE)\n",
+ "\n",
+ " x_numpy = x.numpy()\n",
+ " y_numpy = y.numpy()\n",
+ " print('input batch의 모양:', x_numpy.shape)\n",
+ " plt.imshow(x_numpy[0].reshape(28, 28))\n",
+ " plt.title(f'Label {y_numpy[0]}')\n",
+ " plt.show()\n",
+ "\n",
+ " print('break minibatch for-loop')\n",
+ " break"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "78dbdd43",
+ "metadata": {},
+ "source": [
+ "## 2-1. Deep Neural Network\n",
+ "아래 셀은 Deep Neural Network를 정의 합니다."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "aed9144c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 변경 가능 합니다.\n",
+ "class DNN(nn.Module):\n",
+ " def __init__(self, num_features, num_hidden_1, num_hidden_2, num_hidden_3, num_classes):\n",
+ " \"\"\"\n",
+ " num_features: input feature 갯수\n",
+ " num_hidden_1: 첫 번째 레이어의 노드 갯수\n",
+ " num_hidden_2: 두 번째 레이어의 노드 갯수\n",
+ " num_hidden_3: 세 번째 레이어의 노드 갯수\n",
+ " num_classes: 분류하고자 하는 class 갯수\n",
+ " \"\"\"\n",
+ " super(DNN, self).__init__()\n",
+ " \n",
+ " self.num_classes = num_classes\n",
+ " \n",
+ " # 수정 가능!: 레이어를 쌓는 법을 아신다면, 여기서 레이어를 쌓으셔도, 혹은 지우셔도 무방 합니다. (단, nn.Linear만)\n",
+ " self.linear_1 = nn.Linear(num_features, num_hidden_1)\n",
+ " self.linear_2 = nn.Linear(num_hidden_1, num_hidden_2)\n",
+ " self.linear_3 = nn.Linear(num_hidden_2, num_hidden_3)\n",
+ " self.linear_out = nn.Linear(num_hidden_3, num_classes)\n",
+ " \n",
+ " def forward(self, x):\n",
+ " out = self.linear_1(x)\n",
+ " out = torch.relu(out)\n",
+ " out = self.linear_2(out)\n",
+ " out = torch.relu(out)\n",
+ " out = self.linear_3(out)\n",
+ " out = torch.relu(out)\n",
+ " logits = self.linear_out(out)\n",
+ " probas = torch.sigmoid(logits)\n",
+ " return logits, probas\n",
+ "\n",
+ "# 수정 가능!\n",
+ "model = DNN(num_features=28*28,\n",
+ " num_hidden_1=100,\n",
+ " num_hidden_2=50,\n",
+ " num_hidden_3=20,\n",
+ " num_classes=10)\n",
+ "\n",
+ "model = model.to(DEVICE)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "956117f2",
+ "metadata": {},
+ "source": [
+ "## 2-2. Training\n",
+ "여기서는 **Optimizer**와, **Epoch**를 설정 합니다. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "5925349f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 수정 가능!\n",
+ "LEARNING_LATE = 0.01\n",
+ "NUM_EPOCHS = 20"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "eaee3612",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "optimizer = torch.optim.SGD(model.parameters(), lr=LEARNING_LATE)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "e7d2292a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch: 001/020 | Batch 000/937 | Cost: 0.0737\n",
+ "Epoch: 001/020 | Batch 040/937 | Cost: 0.3470\n",
+ "Epoch: 001/020 | Batch 080/937 | Cost: 0.2875\n",
+ "Epoch: 001/020 | Batch 120/937 | Cost: 0.1576\n",
+ "Epoch: 001/020 | Batch 160/937 | Cost: 0.2785\n",
+ "Epoch: 001/020 | Batch 200/937 | Cost: 0.3248\n",
+ "Epoch: 001/020 | Batch 240/937 | Cost: 0.3727\n",
+ "Epoch: 001/020 | Batch 280/937 | Cost: 0.1340\n",
+ "Epoch: 001/020 | Batch 320/937 | Cost: 0.2222\n",
+ "Epoch: 001/020 | Batch 360/937 | Cost: 0.4003\n",
+ "Epoch: 001/020 | Batch 400/937 | Cost: 0.1258\n",
+ "Epoch: 001/020 | Batch 440/937 | Cost: 0.2260\n",
+ "Epoch: 001/020 | Batch 480/937 | Cost: 0.2162\n",
+ "Epoch: 001/020 | Batch 520/937 | Cost: 0.1750\n",
+ "Epoch: 001/020 | Batch 560/937 | Cost: 0.1224\n",
+ "Epoch: 001/020 | Batch 600/937 | Cost: 0.1676\n",
+ "Epoch: 001/020 | Batch 640/937 | Cost: 0.3702\n",
+ "Epoch: 001/020 | Batch 680/937 | Cost: 0.3033\n",
+ "Epoch: 001/020 | Batch 720/937 | Cost: 0.2718\n",
+ "Epoch: 001/020 | Batch 760/937 | Cost: 0.2446\n",
+ "Epoch: 001/020 | Batch 800/937 | Cost: 0.1849\n",
+ "Epoch: 001/020 | Batch 840/937 | Cost: 0.2771\n",
+ "Epoch: 001/020 | Batch 880/937 | Cost: 0.2944\n",
+ "Epoch: 001/020 | Batch 920/937 | Cost: 0.2184\n",
+ "Epoch: 001/020 Train Acc.: 93.42% | Test Acc.: 93.14%\n",
+ "Time elapsed: 0.35 min\n",
+ "Epoch: 002/020 | Batch 000/937 | Cost: 0.1171\n",
+ "Epoch: 002/020 | Batch 040/937 | Cost: 0.1853\n",
+ "Epoch: 002/020 | Batch 080/937 | Cost: 0.3799\n",
+ "Epoch: 002/020 | Batch 120/937 | Cost: 0.1855\n",
+ "Epoch: 002/020 | Batch 160/937 | Cost: 0.1740\n",
+ "Epoch: 002/020 | Batch 200/937 | Cost: 0.1779\n",
+ "Epoch: 002/020 | Batch 240/937 | Cost: 0.3683\n",
+ "Epoch: 002/020 | Batch 280/937 | Cost: 0.2920\n",
+ "Epoch: 002/020 | Batch 320/937 | Cost: 0.1824\n",
+ "Epoch: 002/020 | Batch 360/937 | Cost: 0.1820\n",
+ "Epoch: 002/020 | Batch 400/937 | Cost: 0.2009\n",
+ "Epoch: 002/020 | Batch 440/937 | Cost: 0.2574\n",
+ "Epoch: 002/020 | Batch 480/937 | Cost: 0.2585\n",
+ "Epoch: 002/020 | Batch 520/937 | Cost: 0.1984\n",
+ "Epoch: 002/020 | Batch 560/937 | Cost: 0.3349\n",
+ "Epoch: 002/020 | Batch 600/937 | Cost: 0.3076\n",
+ "Epoch: 002/020 | Batch 640/937 | Cost: 0.1993\n",
+ "Epoch: 002/020 | Batch 680/937 | Cost: 0.1191\n",
+ "Epoch: 002/020 | Batch 720/937 | Cost: 0.3657\n",
+ "Epoch: 002/020 | Batch 760/937 | Cost: 0.2793\n",
+ "Epoch: 002/020 | Batch 800/937 | Cost: 0.1457\n",
+ "Epoch: 002/020 | Batch 840/937 | Cost: 0.2790\n",
+ "Epoch: 002/020 | Batch 880/937 | Cost: 0.1547\n",
+ "Epoch: 002/020 | Batch 920/937 | Cost: 0.2164\n",
+ "Epoch: 002/020 Train Acc.: 94.03% | Test Acc.: 93.95%\n",
+ "Time elapsed: 0.70 min\n",
+ "Epoch: 003/020 | Batch 000/937 | Cost: 0.2148\n",
+ "Epoch: 003/020 | Batch 040/937 | Cost: 0.1789\n",
+ "Epoch: 003/020 | Batch 080/937 | Cost: 0.1454\n",
+ "Epoch: 003/020 | Batch 120/937 | Cost: 0.2481\n",
+ "Epoch: 003/020 | Batch 160/937 | Cost: 0.1659\n",
+ "Epoch: 003/020 | Batch 200/937 | Cost: 0.1282\n",
+ "Epoch: 003/020 | Batch 240/937 | Cost: 0.1662\n",
+ "Epoch: 003/020 | Batch 280/937 | Cost: 0.2178\n",
+ "Epoch: 003/020 | Batch 320/937 | Cost: 0.2713\n",
+ "Epoch: 003/020 | Batch 360/937 | Cost: 0.1989\n",
+ "Epoch: 003/020 | Batch 400/937 | Cost: 0.1165\n",
+ "Epoch: 003/020 | Batch 440/937 | Cost: 0.1404\n",
+ "Epoch: 003/020 | Batch 480/937 | Cost: 0.2702\n",
+ "Epoch: 003/020 | Batch 520/937 | Cost: 0.1687\n",
+ "Epoch: 003/020 | Batch 560/937 | Cost: 0.2654\n",
+ "Epoch: 003/020 | Batch 600/937 | Cost: 0.1528\n",
+ "Epoch: 003/020 | Batch 640/937 | Cost: 0.3376\n",
+ "Epoch: 003/020 | Batch 680/937 | Cost: 0.1276\n",
+ "Epoch: 003/020 | Batch 720/937 | Cost: 0.1503\n",
+ "Epoch: 003/020 | Batch 760/937 | Cost: 0.1601\n",
+ "Epoch: 003/020 | Batch 800/937 | Cost: 0.3273\n",
+ "Epoch: 003/020 | Batch 840/937 | Cost: 0.1402\n",
+ "Epoch: 003/020 | Batch 880/937 | Cost: 0.0722\n",
+ "Epoch: 003/020 | Batch 920/937 | Cost: 0.1079\n",
+ "Epoch: 003/020 Train Acc.: 94.66% | Test Acc.: 94.48%\n",
+ "Time elapsed: 1.05 min\n",
+ "Epoch: 004/020 | Batch 000/937 | Cost: 0.1416\n",
+ "Epoch: 004/020 | Batch 040/937 | Cost: 0.1268\n",
+ "Epoch: 004/020 | Batch 080/937 | Cost: 0.0471\n",
+ "Epoch: 004/020 | Batch 120/937 | Cost: 0.1445\n",
+ "Epoch: 004/020 | Batch 160/937 | Cost: 0.0965\n",
+ "Epoch: 004/020 | Batch 200/937 | Cost: 0.3022\n",
+ "Epoch: 004/020 | Batch 240/937 | Cost: 0.4159\n",
+ "Epoch: 004/020 | Batch 280/937 | Cost: 0.2396\n",
+ "Epoch: 004/020 | Batch 320/937 | Cost: 0.1781\n",
+ "Epoch: 004/020 | Batch 360/937 | Cost: 0.0802\n",
+ "Epoch: 004/020 | Batch 400/937 | Cost: 0.1311\n",
+ "Epoch: 004/020 | Batch 440/937 | Cost: 0.2961\n",
+ "Epoch: 004/020 | Batch 480/937 | Cost: 0.2948\n",
+ "Epoch: 004/020 | Batch 520/937 | Cost: 0.0457\n",
+ "Epoch: 004/020 | Batch 560/937 | Cost: 0.1286\n",
+ "Epoch: 004/020 | Batch 600/937 | Cost: 0.0914\n",
+ "Epoch: 004/020 | Batch 640/937 | Cost: 0.0629\n",
+ "Epoch: 004/020 | Batch 680/937 | Cost: 0.1266\n",
+ "Epoch: 004/020 | Batch 720/937 | Cost: 0.2728\n",
+ "Epoch: 004/020 | Batch 760/937 | Cost: 0.2375\n",
+ "Epoch: 004/020 | Batch 800/937 | Cost: 0.1158\n",
+ "Epoch: 004/020 | Batch 840/937 | Cost: 0.1314\n",
+ "Epoch: 004/020 | Batch 880/937 | Cost: 0.0635\n",
+ "Epoch: 004/020 | Batch 920/937 | Cost: 0.2360\n",
+ "Epoch: 004/020 Train Acc.: 95.18% | Test Acc.: 94.83%\n",
+ "Time elapsed: 1.44 min\n",
+ "Epoch: 005/020 | Batch 000/937 | Cost: 0.0725\n",
+ "Epoch: 005/020 | Batch 040/937 | Cost: 0.1967\n",
+ "Epoch: 005/020 | Batch 080/937 | Cost: 0.2558\n",
+ "Epoch: 005/020 | Batch 120/937 | Cost: 0.0923\n",
+ "Epoch: 005/020 | Batch 160/937 | Cost: 0.3325\n",
+ "Epoch: 005/020 | Batch 200/937 | Cost: 0.1115\n",
+ "Epoch: 005/020 | Batch 240/937 | Cost: 0.1467\n",
+ "Epoch: 005/020 | Batch 280/937 | Cost: 0.2700\n",
+ "Epoch: 005/020 | Batch 320/937 | Cost: 0.1602\n",
+ "Epoch: 005/020 | Batch 360/937 | Cost: 0.1565\n",
+ "Epoch: 005/020 | Batch 400/937 | Cost: 0.2070\n",
+ "Epoch: 005/020 | Batch 440/937 | Cost: 0.2092\n",
+ "Epoch: 005/020 | Batch 480/937 | Cost: 0.1084\n",
+ "Epoch: 005/020 | Batch 520/937 | Cost: 0.2187\n",
+ "Epoch: 005/020 | Batch 560/937 | Cost: 0.1671\n",
+ "Epoch: 005/020 | Batch 600/937 | Cost: 0.0584\n",
+ "Epoch: 005/020 | Batch 640/937 | Cost: 0.1021\n",
+ "Epoch: 005/020 | Batch 680/937 | Cost: 0.1591\n",
+ "Epoch: 005/020 | Batch 720/937 | Cost: 0.1242\n",
+ "Epoch: 005/020 | Batch 760/937 | Cost: 0.2268\n",
+ "Epoch: 005/020 | Batch 800/937 | Cost: 0.1863\n",
+ "Epoch: 005/020 | Batch 840/937 | Cost: 0.1396\n",
+ "Epoch: 005/020 | Batch 880/937 | Cost: 0.1321\n",
+ "Epoch: 005/020 | Batch 920/937 | Cost: 0.0319\n",
+ "Epoch: 005/020 Train Acc.: 95.52% | Test Acc.: 95.29%\n",
+ "Time elapsed: 1.85 min\n",
+ "Epoch: 006/020 | Batch 000/937 | Cost: 0.1838\n",
+ "Epoch: 006/020 | Batch 040/937 | Cost: 0.1462\n",
+ "Epoch: 006/020 | Batch 080/937 | Cost: 0.0624\n",
+ "Epoch: 006/020 | Batch 120/937 | Cost: 0.0796\n",
+ "Epoch: 006/020 | Batch 160/937 | Cost: 0.2425\n",
+ "Epoch: 006/020 | Batch 200/937 | Cost: 0.2167\n",
+ "Epoch: 006/020 | Batch 240/937 | Cost: 0.1442\n",
+ "Epoch: 006/020 | Batch 280/937 | Cost: 0.2165\n",
+ "Epoch: 006/020 | Batch 320/937 | Cost: 0.1545\n",
+ "Epoch: 006/020 | Batch 360/937 | Cost: 0.4105\n",
+ "Epoch: 006/020 | Batch 400/937 | Cost: 0.1044\n",
+ "Epoch: 006/020 | Batch 440/937 | Cost: 0.0697\n",
+ "Epoch: 006/020 | Batch 480/937 | Cost: 0.2290\n",
+ "Epoch: 006/020 | Batch 520/937 | Cost: 0.3396\n",
+ "Epoch: 006/020 | Batch 560/937 | Cost: 0.0978\n",
+ "Epoch: 006/020 | Batch 600/937 | Cost: 0.1656\n",
+ "Epoch: 006/020 | Batch 640/937 | Cost: 0.1001\n",
+ "Epoch: 006/020 | Batch 680/937 | Cost: 0.1289\n",
+ "Epoch: 006/020 | Batch 720/937 | Cost: 0.1522\n",
+ "Epoch: 006/020 | Batch 760/937 | Cost: 0.2334\n",
+ "Epoch: 006/020 | Batch 800/937 | Cost: 0.1678\n",
+ "Epoch: 006/020 | Batch 840/937 | Cost: 0.1534\n",
+ "Epoch: 006/020 | Batch 880/937 | Cost: 0.1272\n",
+ "Epoch: 006/020 | Batch 920/937 | Cost: 0.3166\n",
+ "Epoch: 006/020 Train Acc.: 96.13% | Test Acc.: 95.75%\n",
+ "Time elapsed: 2.22 min\n",
+ "Epoch: 007/020 | Batch 000/937 | Cost: 0.1436\n",
+ "Epoch: 007/020 | Batch 040/937 | Cost: 0.0741\n",
+ "Epoch: 007/020 | Batch 080/937 | Cost: 0.1523\n",
+ "Epoch: 007/020 | Batch 120/937 | Cost: 0.0279\n",
+ "Epoch: 007/020 | Batch 160/937 | Cost: 0.1318\n",
+ "Epoch: 007/020 | Batch 200/937 | Cost: 0.1166\n",
+ "Epoch: 007/020 | Batch 240/937 | Cost: 0.0989\n",
+ "Epoch: 007/020 | Batch 280/937 | Cost: 0.0587\n",
+ "Epoch: 007/020 | Batch 320/937 | Cost: 0.0579\n",
+ "Epoch: 007/020 | Batch 360/937 | Cost: 0.1527\n",
+ "Epoch: 007/020 | Batch 400/937 | Cost: 0.0767\n",
+ "Epoch: 007/020 | Batch 440/937 | Cost: 0.1186\n",
+ "Epoch: 007/020 | Batch 480/937 | Cost: 0.3084\n",
+ "Epoch: 007/020 | Batch 520/937 | Cost: 0.0701\n",
+ "Epoch: 007/020 | Batch 560/937 | Cost: 0.0985\n",
+ "Epoch: 007/020 | Batch 600/937 | Cost: 0.0813\n",
+ "Epoch: 007/020 | Batch 640/937 | Cost: 0.0535\n",
+ "Epoch: 007/020 | Batch 680/937 | Cost: 0.2014\n",
+ "Epoch: 007/020 | Batch 720/937 | Cost: 0.2176\n",
+ "Epoch: 007/020 | Batch 760/937 | Cost: 0.0661\n",
+ "Epoch: 007/020 | Batch 800/937 | Cost: 0.1036\n",
+ "Epoch: 007/020 | Batch 840/937 | Cost: 0.1572\n",
+ "Epoch: 007/020 | Batch 880/937 | Cost: 0.0609\n",
+ "Epoch: 007/020 | Batch 920/937 | Cost: 0.1681\n",
+ "Epoch: 007/020 Train Acc.: 96.30% | Test Acc.: 95.85%\n",
+ "Time elapsed: 2.62 min\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch: 008/020 | Batch 000/937 | Cost: 0.1980\n",
+ "Epoch: 008/020 | Batch 040/937 | Cost: 0.0825\n",
+ "Epoch: 008/020 | Batch 080/937 | Cost: 0.0951\n",
+ "Epoch: 008/020 | Batch 120/937 | Cost: 0.0543\n",
+ "Epoch: 008/020 | Batch 160/937 | Cost: 0.0646\n",
+ "Epoch: 008/020 | Batch 200/937 | Cost: 0.1128\n",
+ "Epoch: 008/020 | Batch 240/937 | Cost: 0.2344\n",
+ "Epoch: 008/020 | Batch 280/937 | Cost: 0.3762\n",
+ "Epoch: 008/020 | Batch 320/937 | Cost: 0.0942\n",
+ "Epoch: 008/020 | Batch 360/937 | Cost: 0.0754\n",
+ "Epoch: 008/020 | Batch 400/937 | Cost: 0.0786\n",
+ "Epoch: 008/020 | Batch 440/937 | Cost: 0.1946\n",
+ "Epoch: 008/020 | Batch 480/937 | Cost: 0.3427\n",
+ "Epoch: 008/020 | Batch 520/937 | Cost: 0.1430\n",
+ "Epoch: 008/020 | Batch 560/937 | Cost: 0.0346\n",
+ "Epoch: 008/020 | Batch 600/937 | Cost: 0.0527\n",
+ "Epoch: 008/020 | Batch 640/937 | Cost: 0.0742\n",
+ "Epoch: 008/020 | Batch 680/937 | Cost: 0.0604\n",
+ "Epoch: 008/020 | Batch 720/937 | Cost: 0.1201\n",
+ "Epoch: 008/020 | Batch 760/937 | Cost: 0.0534\n",
+ "Epoch: 008/020 | Batch 800/937 | Cost: 0.1878\n",
+ "Epoch: 008/020 | Batch 840/937 | Cost: 0.1715\n",
+ "Epoch: 008/020 | Batch 880/937 | Cost: 0.0791\n",
+ "Epoch: 008/020 | Batch 920/937 | Cost: 0.1122\n",
+ "Epoch: 008/020 Train Acc.: 96.24% | Test Acc.: 95.73%\n",
+ "Time elapsed: 3.01 min\n",
+ "Epoch: 009/020 | Batch 000/937 | Cost: 0.1730\n",
+ "Epoch: 009/020 | Batch 040/937 | Cost: 0.1062\n",
+ "Epoch: 009/020 | Batch 080/937 | Cost: 0.2337\n",
+ "Epoch: 009/020 | Batch 120/937 | Cost: 0.0423\n",
+ "Epoch: 009/020 | Batch 160/937 | Cost: 0.1024\n",
+ "Epoch: 009/020 | Batch 200/937 | Cost: 0.1117\n",
+ "Epoch: 009/020 | Batch 240/937 | Cost: 0.2126\n",
+ "Epoch: 009/020 | Batch 280/937 | Cost: 0.1773\n",
+ "Epoch: 009/020 | Batch 320/937 | Cost: 0.1648\n",
+ "Epoch: 009/020 | Batch 360/937 | Cost: 0.0847\n",
+ "Epoch: 009/020 | Batch 400/937 | Cost: 0.1294\n",
+ "Epoch: 009/020 | Batch 440/937 | Cost: 0.0558\n",
+ "Epoch: 009/020 | Batch 480/937 | Cost: 0.0368\n",
+ "Epoch: 009/020 | Batch 520/937 | Cost: 0.1517\n",
+ "Epoch: 009/020 | Batch 560/937 | Cost: 0.0750\n",
+ "Epoch: 009/020 | Batch 600/937 | Cost: 0.0989\n",
+ "Epoch: 009/020 | Batch 640/937 | Cost: 0.1705\n",
+ "Epoch: 009/020 | Batch 680/937 | Cost: 0.1395\n",
+ "Epoch: 009/020 | Batch 720/937 | Cost: 0.0953\n",
+ "Epoch: 009/020 | Batch 760/937 | Cost: 0.1714\n",
+ "Epoch: 009/020 | Batch 800/937 | Cost: 0.1297\n",
+ "Epoch: 009/020 | Batch 840/937 | Cost: 0.1021\n",
+ "Epoch: 009/020 | Batch 880/937 | Cost: 0.1514\n",
+ "Epoch: 009/020 | Batch 920/937 | Cost: 0.1189\n",
+ "Epoch: 009/020 Train Acc.: 96.58% | Test Acc.: 96.06%\n",
+ "Time elapsed: 3.41 min\n",
+ "Epoch: 010/020 | Batch 000/937 | Cost: 0.2688\n",
+ "Epoch: 010/020 | Batch 040/937 | Cost: 0.0683\n",
+ "Epoch: 010/020 | Batch 080/937 | Cost: 0.0939\n",
+ "Epoch: 010/020 | Batch 120/937 | Cost: 0.1421\n",
+ "Epoch: 010/020 | Batch 160/937 | Cost: 0.0710\n",
+ "Epoch: 010/020 | Batch 200/937 | Cost: 0.1371\n",
+ "Epoch: 010/020 | Batch 240/937 | Cost: 0.1028\n",
+ "Epoch: 010/020 | Batch 280/937 | Cost: 0.0942\n",
+ "Epoch: 010/020 | Batch 320/937 | Cost: 0.0748\n",
+ "Epoch: 010/020 | Batch 360/937 | Cost: 0.0486\n",
+ "Epoch: 010/020 | Batch 400/937 | Cost: 0.1287\n",
+ "Epoch: 010/020 | Batch 440/937 | Cost: 0.0415\n",
+ "Epoch: 010/020 | Batch 480/937 | Cost: 0.1211\n",
+ "Epoch: 010/020 | Batch 520/937 | Cost: 0.0656\n",
+ "Epoch: 010/020 | Batch 560/937 | Cost: 0.0297\n",
+ "Epoch: 010/020 | Batch 600/937 | Cost: 0.1392\n",
+ "Epoch: 010/020 | Batch 640/937 | Cost: 0.0982\n",
+ "Epoch: 010/020 | Batch 680/937 | Cost: 0.2512\n",
+ "Epoch: 010/020 | Batch 720/937 | Cost: 0.0822\n",
+ "Epoch: 010/020 | Batch 760/937 | Cost: 0.1396\n",
+ "Epoch: 010/020 | Batch 800/937 | Cost: 0.1442\n",
+ "Epoch: 010/020 | Batch 840/937 | Cost: 0.0424\n",
+ "Epoch: 010/020 | Batch 880/937 | Cost: 0.1086\n",
+ "Epoch: 010/020 | Batch 920/937 | Cost: 0.2092\n",
+ "Epoch: 010/020 Train Acc.: 96.78% | Test Acc.: 96.26%\n",
+ "Time elapsed: 3.86 min\n",
+ "Epoch: 011/020 | Batch 000/937 | Cost: 0.0496\n",
+ "Epoch: 011/020 | Batch 040/937 | Cost: 0.0274\n",
+ "Epoch: 011/020 | Batch 080/937 | Cost: 0.1024\n",
+ "Epoch: 011/020 | Batch 120/937 | Cost: 0.0695\n",
+ "Epoch: 011/020 | Batch 160/937 | Cost: 0.0893\n",
+ "Epoch: 011/020 | Batch 200/937 | Cost: 0.0476\n",
+ "Epoch: 011/020 | Batch 240/937 | Cost: 0.0975\n",
+ "Epoch: 011/020 | Batch 280/937 | Cost: 0.1455\n",
+ "Epoch: 011/020 | Batch 320/937 | Cost: 0.1843\n",
+ "Epoch: 011/020 | Batch 360/937 | Cost: 0.0734\n",
+ "Epoch: 011/020 | Batch 400/937 | Cost: 0.3055\n",
+ "Epoch: 011/020 | Batch 440/937 | Cost: 0.1761\n",
+ "Epoch: 011/020 | Batch 480/937 | Cost: 0.1540\n",
+ "Epoch: 011/020 | Batch 520/937 | Cost: 0.1594\n",
+ "Epoch: 011/020 | Batch 560/937 | Cost: 0.1639\n",
+ "Epoch: 011/020 | Batch 600/937 | Cost: 0.0841\n",
+ "Epoch: 011/020 | Batch 640/937 | Cost: 0.0391\n",
+ "Epoch: 011/020 | Batch 680/937 | Cost: 0.0801\n",
+ "Epoch: 011/020 | Batch 720/937 | Cost: 0.0734\n",
+ "Epoch: 011/020 | Batch 760/937 | Cost: 0.0939\n",
+ "Epoch: 011/020 | Batch 800/937 | Cost: 0.1293\n",
+ "Epoch: 011/020 | Batch 840/937 | Cost: 0.1839\n",
+ "Epoch: 011/020 | Batch 880/937 | Cost: 0.2179\n",
+ "Epoch: 011/020 | Batch 920/937 | Cost: 0.0467\n",
+ "Epoch: 011/020 Train Acc.: 97.19% | Test Acc.: 96.50%\n",
+ "Time elapsed: 4.27 min\n",
+ "Epoch: 012/020 | Batch 000/937 | Cost: 0.0857\n",
+ "Epoch: 012/020 | Batch 040/937 | Cost: 0.1831\n",
+ "Epoch: 012/020 | Batch 080/937 | Cost: 0.0794\n",
+ "Epoch: 012/020 | Batch 120/937 | Cost: 0.0661\n",
+ "Epoch: 012/020 | Batch 160/937 | Cost: 0.0264\n",
+ "Epoch: 012/020 | Batch 200/937 | Cost: 0.0456\n",
+ "Epoch: 012/020 | Batch 240/937 | Cost: 0.0547\n",
+ "Epoch: 012/020 | Batch 280/937 | Cost: 0.0670\n",
+ "Epoch: 012/020 | Batch 320/937 | Cost: 0.0703\n",
+ "Epoch: 012/020 | Batch 360/937 | Cost: 0.0460\n",
+ "Epoch: 012/020 | Batch 400/937 | Cost: 0.1003\n",
+ "Epoch: 012/020 | Batch 440/937 | Cost: 0.1268\n",
+ "Epoch: 012/020 | Batch 480/937 | Cost: 0.1655\n",
+ "Epoch: 012/020 | Batch 520/937 | Cost: 0.1070\n",
+ "Epoch: 012/020 | Batch 560/937 | Cost: 0.0670\n",
+ "Epoch: 012/020 | Batch 600/937 | Cost: 0.0235\n",
+ "Epoch: 012/020 | Batch 640/937 | Cost: 0.0800\n",
+ "Epoch: 012/020 | Batch 680/937 | Cost: 0.1504\n",
+ "Epoch: 012/020 | Batch 720/937 | Cost: 0.2404\n",
+ "Epoch: 012/020 | Batch 760/937 | Cost: 0.0260\n",
+ "Epoch: 012/020 | Batch 800/937 | Cost: 0.0618\n",
+ "Epoch: 012/020 | Batch 840/937 | Cost: 0.0914\n",
+ "Epoch: 012/020 | Batch 880/937 | Cost: 0.0702\n",
+ "Epoch: 012/020 | Batch 920/937 | Cost: 0.1922\n",
+ "Epoch: 012/020 Train Acc.: 97.11% | Test Acc.: 96.50%\n",
+ "Time elapsed: 4.69 min\n",
+ "Epoch: 013/020 | Batch 000/937 | Cost: 0.2285\n",
+ "Epoch: 013/020 | Batch 040/937 | Cost: 0.0176\n",
+ "Epoch: 013/020 | Batch 080/937 | Cost: 0.0886\n",
+ "Epoch: 013/020 | Batch 120/937 | Cost: 0.1240\n",
+ "Epoch: 013/020 | Batch 160/937 | Cost: 0.0365\n",
+ "Epoch: 013/020 | Batch 200/937 | Cost: 0.0393\n",
+ "Epoch: 013/020 | Batch 240/937 | Cost: 0.0662\n",
+ "Epoch: 013/020 | Batch 280/937 | Cost: 0.0322\n",
+ "Epoch: 013/020 | Batch 320/937 | Cost: 0.0907\n",
+ "Epoch: 013/020 | Batch 360/937 | Cost: 0.0963\n",
+ "Epoch: 013/020 | Batch 400/937 | Cost: 0.0755\n",
+ "Epoch: 013/020 | Batch 440/937 | Cost: 0.0617\n",
+ "Epoch: 013/020 | Batch 480/937 | Cost: 0.1898\n",
+ "Epoch: 013/020 | Batch 520/937 | Cost: 0.0823\n",
+ "Epoch: 013/020 | Batch 560/937 | Cost: 0.1680\n",
+ "Epoch: 013/020 | Batch 600/937 | Cost: 0.0834\n",
+ "Epoch: 013/020 | Batch 640/937 | Cost: 0.0813\n",
+ "Epoch: 013/020 | Batch 680/937 | Cost: 0.0753\n",
+ "Epoch: 013/020 | Batch 720/937 | Cost: 0.1346\n",
+ "Epoch: 013/020 | Batch 760/937 | Cost: 0.1369\n",
+ "Epoch: 013/020 | Batch 800/937 | Cost: 0.1674\n",
+ "Epoch: 013/020 | Batch 840/937 | Cost: 0.1763\n",
+ "Epoch: 013/020 | Batch 880/937 | Cost: 0.1911\n",
+ "Epoch: 013/020 | Batch 920/937 | Cost: 0.1163\n",
+ "Epoch: 013/020 Train Acc.: 97.26% | Test Acc.: 96.51%\n",
+ "Time elapsed: 5.10 min\n",
+ "Epoch: 014/020 | Batch 000/937 | Cost: 0.1177\n",
+ "Epoch: 014/020 | Batch 040/937 | Cost: 0.0553\n",
+ "Epoch: 014/020 | Batch 080/937 | Cost: 0.1216\n",
+ "Epoch: 014/020 | Batch 120/937 | Cost: 0.0586\n",
+ "Epoch: 014/020 | Batch 160/937 | Cost: 0.2118\n",
+ "Epoch: 014/020 | Batch 200/937 | Cost: 0.1186\n",
+ "Epoch: 014/020 | Batch 240/937 | Cost: 0.0613\n",
+ "Epoch: 014/020 | Batch 280/937 | Cost: 0.1523\n",
+ "Epoch: 014/020 | Batch 320/937 | Cost: 0.0336\n",
+ "Epoch: 014/020 | Batch 360/937 | Cost: 0.0553\n",
+ "Epoch: 014/020 | Batch 400/937 | Cost: 0.0338\n",
+ "Epoch: 014/020 | Batch 440/937 | Cost: 0.1454\n",
+ "Epoch: 014/020 | Batch 480/937 | Cost: 0.2022\n",
+ "Epoch: 014/020 | Batch 520/937 | Cost: 0.0996\n",
+ "Epoch: 014/020 | Batch 560/937 | Cost: 0.0920\n",
+ "Epoch: 014/020 | Batch 600/937 | Cost: 0.1648\n",
+ "Epoch: 014/020 | Batch 640/937 | Cost: 0.1044\n",
+ "Epoch: 014/020 | Batch 680/937 | Cost: 0.0574\n",
+ "Epoch: 014/020 | Batch 720/937 | Cost: 0.1116\n",
+ "Epoch: 014/020 | Batch 760/937 | Cost: 0.0655\n",
+ "Epoch: 014/020 | Batch 800/937 | Cost: 0.0728\n",
+ "Epoch: 014/020 | Batch 840/937 | Cost: 0.0455\n",
+ "Epoch: 014/020 | Batch 880/937 | Cost: 0.0130\n",
+ "Epoch: 014/020 | Batch 920/937 | Cost: 0.0960\n",
+ "Epoch: 014/020 Train Acc.: 97.63% | Test Acc.: 96.90%\n",
+ "Time elapsed: 5.50 min\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch: 015/020 | Batch 000/937 | Cost: 0.0837\n",
+ "Epoch: 015/020 | Batch 040/937 | Cost: 0.0756\n",
+ "Epoch: 015/020 | Batch 080/937 | Cost: 0.0989\n",
+ "Epoch: 015/020 | Batch 120/937 | Cost: 0.0373\n",
+ "Epoch: 015/020 | Batch 160/937 | Cost: 0.1872\n",
+ "Epoch: 015/020 | Batch 200/937 | Cost: 0.1655\n",
+ "Epoch: 015/020 | Batch 240/937 | Cost: 0.1507\n",
+ "Epoch: 015/020 | Batch 280/937 | Cost: 0.0935\n",
+ "Epoch: 015/020 | Batch 320/937 | Cost: 0.0802\n",
+ "Epoch: 015/020 | Batch 360/937 | Cost: 0.0969\n",
+ "Epoch: 015/020 | Batch 400/937 | Cost: 0.0165\n",
+ "Epoch: 015/020 | Batch 440/937 | Cost: 0.0528\n",
+ "Epoch: 015/020 | Batch 480/937 | Cost: 0.0934\n",
+ "Epoch: 015/020 | Batch 520/937 | Cost: 0.0676\n",
+ "Epoch: 015/020 | Batch 560/937 | Cost: 0.1019\n",
+ "Epoch: 015/020 | Batch 600/937 | Cost: 0.0576\n",
+ "Epoch: 015/020 | Batch 640/937 | Cost: 0.0843\n",
+ "Epoch: 015/020 | Batch 680/937 | Cost: 0.0703\n",
+ "Epoch: 015/020 | Batch 720/937 | Cost: 0.1550\n",
+ "Epoch: 015/020 | Batch 760/937 | Cost: 0.0339\n",
+ "Epoch: 015/020 | Batch 800/937 | Cost: 0.1117\n",
+ "Epoch: 015/020 | Batch 840/937 | Cost: 0.0820\n",
+ "Epoch: 015/020 | Batch 880/937 | Cost: 0.1017\n",
+ "Epoch: 015/020 | Batch 920/937 | Cost: 0.0450\n",
+ "Epoch: 015/020 Train Acc.: 97.65% | Test Acc.: 96.86%\n",
+ "Time elapsed: 5.90 min\n",
+ "Epoch: 016/020 | Batch 000/937 | Cost: 0.2557\n",
+ "Epoch: 016/020 | Batch 040/937 | Cost: 0.1025\n",
+ "Epoch: 016/020 | Batch 080/937 | Cost: 0.0103\n",
+ "Epoch: 016/020 | Batch 120/937 | Cost: 0.0368\n",
+ "Epoch: 016/020 | Batch 160/937 | Cost: 0.0568\n",
+ "Epoch: 016/020 | Batch 200/937 | Cost: 0.1087\n",
+ "Epoch: 016/020 | Batch 240/937 | Cost: 0.0483\n",
+ "Epoch: 016/020 | Batch 280/937 | Cost: 0.0659\n",
+ "Epoch: 016/020 | Batch 320/937 | Cost: 0.0642\n",
+ "Epoch: 016/020 | Batch 360/937 | Cost: 0.2254\n",
+ "Epoch: 016/020 | Batch 400/937 | Cost: 0.0381\n",
+ "Epoch: 016/020 | Batch 440/937 | Cost: 0.0290\n",
+ "Epoch: 016/020 | Batch 480/937 | Cost: 0.0783\n",
+ "Epoch: 016/020 | Batch 520/937 | Cost: 0.1370\n",
+ "Epoch: 016/020 | Batch 560/937 | Cost: 0.0740\n",
+ "Epoch: 016/020 | Batch 600/937 | Cost: 0.0210\n",
+ "Epoch: 016/020 | Batch 640/937 | Cost: 0.1869\n",
+ "Epoch: 016/020 | Batch 680/937 | Cost: 0.0768\n",
+ "Epoch: 016/020 | Batch 720/937 | Cost: 0.1811\n",
+ "Epoch: 016/020 | Batch 760/937 | Cost: 0.0196\n",
+ "Epoch: 016/020 | Batch 800/937 | Cost: 0.0403\n",
+ "Epoch: 016/020 | Batch 840/937 | Cost: 0.0958\n",
+ "Epoch: 016/020 | Batch 880/937 | Cost: 0.0879\n",
+ "Epoch: 016/020 | Batch 920/937 | Cost: 0.0605\n",
+ "Epoch: 016/020 Train Acc.: 97.93% | Test Acc.: 96.94%\n",
+ "Time elapsed: 6.32 min\n",
+ "Epoch: 017/020 | Batch 000/937 | Cost: 0.1123\n",
+ "Epoch: 017/020 | Batch 040/937 | Cost: 0.0853\n",
+ "Epoch: 017/020 | Batch 080/937 | Cost: 0.0288\n",
+ "Epoch: 017/020 | Batch 120/937 | Cost: 0.0888\n",
+ "Epoch: 017/020 | Batch 160/937 | Cost: 0.0662\n",
+ "Epoch: 017/020 | Batch 200/937 | Cost: 0.1005\n",
+ "Epoch: 017/020 | Batch 240/937 | Cost: 0.0320\n",
+ "Epoch: 017/020 | Batch 280/937 | Cost: 0.0748\n",
+ "Epoch: 017/020 | Batch 320/937 | Cost: 0.0847\n",
+ "Epoch: 017/020 | Batch 360/937 | Cost: 0.0104\n",
+ "Epoch: 017/020 | Batch 400/937 | Cost: 0.0550\n",
+ "Epoch: 017/020 | Batch 440/937 | Cost: 0.0751\n",
+ "Epoch: 017/020 | Batch 480/937 | Cost: 0.0947\n",
+ "Epoch: 017/020 | Batch 520/937 | Cost: 0.0748\n",
+ "Epoch: 017/020 | Batch 560/937 | Cost: 0.1164\n",
+ "Epoch: 017/020 | Batch 600/937 | Cost: 0.0410\n",
+ "Epoch: 017/020 | Batch 640/937 | Cost: 0.1119\n",
+ "Epoch: 017/020 | Batch 680/937 | Cost: 0.1008\n",
+ "Epoch: 017/020 | Batch 720/937 | Cost: 0.0334\n",
+ "Epoch: 017/020 | Batch 760/937 | Cost: 0.0200\n",
+ "Epoch: 017/020 | Batch 800/937 | Cost: 0.0990\n",
+ "Epoch: 017/020 | Batch 840/937 | Cost: 0.1152\n",
+ "Epoch: 017/020 | Batch 880/937 | Cost: 0.0780\n",
+ "Epoch: 017/020 | Batch 920/937 | Cost: 0.0345\n",
+ "Epoch: 017/020 Train Acc.: 97.99% | Test Acc.: 96.96%\n",
+ "Time elapsed: 6.73 min\n",
+ "Epoch: 018/020 | Batch 000/937 | Cost: 0.0425\n",
+ "Epoch: 018/020 | Batch 040/937 | Cost: 0.0222\n",
+ "Epoch: 018/020 | Batch 080/937 | Cost: 0.0557\n",
+ "Epoch: 018/020 | Batch 120/937 | Cost: 0.1101\n",
+ "Epoch: 018/020 | Batch 160/937 | Cost: 0.0321\n",
+ "Epoch: 018/020 | Batch 200/937 | Cost: 0.0283\n",
+ "Epoch: 018/020 | Batch 240/937 | Cost: 0.0437\n",
+ "Epoch: 018/020 | Batch 280/937 | Cost: 0.1031\n",
+ "Epoch: 018/020 | Batch 320/937 | Cost: 0.0431\n",
+ "Epoch: 018/020 | Batch 360/937 | Cost: 0.1295\n",
+ "Epoch: 018/020 | Batch 400/937 | Cost: 0.0631\n",
+ "Epoch: 018/020 | Batch 440/937 | Cost: 0.0855\n",
+ "Epoch: 018/020 | Batch 480/937 | Cost: 0.1529\n",
+ "Epoch: 018/020 | Batch 520/937 | Cost: 0.1270\n",
+ "Epoch: 018/020 | Batch 560/937 | Cost: 0.0481\n",
+ "Epoch: 018/020 | Batch 600/937 | Cost: 0.0740\n",
+ "Epoch: 018/020 | Batch 640/937 | Cost: 0.0308\n",
+ "Epoch: 018/020 | Batch 680/937 | Cost: 0.2209\n",
+ "Epoch: 018/020 | Batch 720/937 | Cost: 0.0356\n",
+ "Epoch: 018/020 | Batch 760/937 | Cost: 0.1389\n",
+ "Epoch: 018/020 | Batch 800/937 | Cost: 0.2233\n",
+ "Epoch: 018/020 | Batch 840/937 | Cost: 0.0546\n",
+ "Epoch: 018/020 | Batch 880/937 | Cost: 0.0614\n",
+ "Epoch: 018/020 | Batch 920/937 | Cost: 0.1037\n",
+ "Epoch: 018/020 Train Acc.: 98.06% | Test Acc.: 96.94%\n",
+ "Time elapsed: 7.13 min\n",
+ "Epoch: 019/020 | Batch 000/937 | Cost: 0.1013\n",
+ "Epoch: 019/020 | Batch 040/937 | Cost: 0.1593\n",
+ "Epoch: 019/020 | Batch 080/937 | Cost: 0.0968\n",
+ "Epoch: 019/020 | Batch 120/937 | Cost: 0.0276\n",
+ "Epoch: 019/020 | Batch 160/937 | Cost: 0.0841\n",
+ "Epoch: 019/020 | Batch 200/937 | Cost: 0.0725\n",
+ "Epoch: 019/020 | Batch 240/937 | Cost: 0.0210\n",
+ "Epoch: 019/020 | Batch 280/937 | Cost: 0.0308\n",
+ "Epoch: 019/020 | Batch 320/937 | Cost: 0.0836\n",
+ "Epoch: 019/020 | Batch 360/937 | Cost: 0.0538\n",
+ "Epoch: 019/020 | Batch 400/937 | Cost: 0.1200\n",
+ "Epoch: 019/020 | Batch 440/937 | Cost: 0.1230\n",
+ "Epoch: 019/020 | Batch 480/937 | Cost: 0.0202\n",
+ "Epoch: 019/020 | Batch 520/937 | Cost: 0.0975\n",
+ "Epoch: 019/020 | Batch 560/937 | Cost: 0.0526\n",
+ "Epoch: 019/020 | Batch 600/937 | Cost: 0.0324\n",
+ "Epoch: 019/020 | Batch 640/937 | Cost: 0.0690\n",
+ "Epoch: 019/020 | Batch 680/937 | Cost: 0.1589\n",
+ "Epoch: 019/020 | Batch 720/937 | Cost: 0.0856\n",
+ "Epoch: 019/020 | Batch 760/937 | Cost: 0.1028\n",
+ "Epoch: 019/020 | Batch 800/937 | Cost: 0.0213\n",
+ "Epoch: 019/020 | Batch 840/937 | Cost: 0.1310\n",
+ "Epoch: 019/020 | Batch 880/937 | Cost: 0.0653\n",
+ "Epoch: 019/020 | Batch 920/937 | Cost: 0.0755\n",
+ "Epoch: 019/020 Train Acc.: 98.17% | Test Acc.: 96.95%\n",
+ "Time elapsed: 7.56 min\n",
+ "Epoch: 020/020 | Batch 000/937 | Cost: 0.0345\n",
+ "Epoch: 020/020 | Batch 040/937 | Cost: 0.0508\n",
+ "Epoch: 020/020 | Batch 080/937 | Cost: 0.0216\n",
+ "Epoch: 020/020 | Batch 120/937 | Cost: 0.0420\n",
+ "Epoch: 020/020 | Batch 160/937 | Cost: 0.0366\n",
+ "Epoch: 020/020 | Batch 200/937 | Cost: 0.0549\n",
+ "Epoch: 020/020 | Batch 240/937 | Cost: 0.0127\n",
+ "Epoch: 020/020 | Batch 280/937 | Cost: 0.0896\n",
+ "Epoch: 020/020 | Batch 320/937 | Cost: 0.0999\n",
+ "Epoch: 020/020 | Batch 360/937 | Cost: 0.0949\n",
+ "Epoch: 020/020 | Batch 400/937 | Cost: 0.0193\n",
+ "Epoch: 020/020 | Batch 440/937 | Cost: 0.0628\n",
+ "Epoch: 020/020 | Batch 480/937 | Cost: 0.1570\n",
+ "Epoch: 020/020 | Batch 520/937 | Cost: 0.0709\n",
+ "Epoch: 020/020 | Batch 560/937 | Cost: 0.0425\n",
+ "Epoch: 020/020 | Batch 600/937 | Cost: 0.0523\n",
+ "Epoch: 020/020 | Batch 640/937 | Cost: 0.0375\n",
+ "Epoch: 020/020 | Batch 680/937 | Cost: 0.1017\n",
+ "Epoch: 020/020 | Batch 720/937 | Cost: 0.0342\n",
+ "Epoch: 020/020 | Batch 760/937 | Cost: 0.0394\n",
+ "Epoch: 020/020 | Batch 800/937 | Cost: 0.0104\n",
+ "Epoch: 020/020 | Batch 840/937 | Cost: 0.0466\n",
+ "Epoch: 020/020 | Batch 880/937 | Cost: 0.0578\n",
+ "Epoch: 020/020 | Batch 920/937 | Cost: 0.0378\n",
+ "Epoch: 020/020 Train Acc.: 98.07% | Test Acc.: 96.92%\n",
+ "Time elapsed: 8.01 min\n",
+ "Total Training Time: 8.01 min\n"
+ ]
+ }
+ ],
+ "source": [
+ "def compute_accuracy_and_loss(model, data_loader, device):\n",
+ " correct_pred, num_examples = 0, 0\n",
+ " cross_entropy = 0.\n",
+ " for i, (features, targets) in enumerate(data_loader):\n",
+ " \n",
+ " features = features.view(-1, 28*28).to(device)\n",
+ " targets = targets.to(device)\n",
+ "\n",
+ " logits, probas = model(features)\n",
+ " cross_entropy += F.cross_entropy(logits, targets).item()\n",
+ " _, predicted_labels = torch.max(probas, 1)\n",
+ " num_examples += targets.size(0)\n",
+ " correct_pred += (predicted_labels == targets).sum()\n",
+ " return correct_pred.float()/num_examples * 100, cross_entropy/num_examples\n",
+ " \n",
+ "\n",
+ "start_time = time.time()\n",
+ "train_acc_lst, test_acc_lst = [], []\n",
+ "train_loss_lst, test_loss_lst = [], []\n",
+ "\n",
+ "for epoch in range(NUM_EPOCHS):\n",
+ " \n",
+ " model.train()\n",
+ " \n",
+ " for batch_idx, (features, targets) in enumerate(train_loader):\n",
+ " \n",
+ " ### PREPARE MINIBATCH\n",
+ " features = features.view(-1, 28*28).to(DEVICE)\n",
+ " targets = targets.to(DEVICE)\n",
+ " \n",
+ " ### FORWARD AND BACK PROP\n",
+ " logits, probas = model(features) # 모델 계산\n",
+ " cost = F.cross_entropy(logits, targets) # 크로스 엔트로피 계산\n",
+ " optimizer.zero_grad() # 기울기 초기화\n",
+ " \n",
+ " cost.backward() # 역전파\n",
+ " \n",
+ " ### UPDATE MODEL PARAMETERS\n",
+ " optimizer.step() # step 적용\n",
+ " \n",
+ " ### LOGGING\n",
+ " if not batch_idx % 40:\n",
+ " print (f'Epoch: {epoch+1:03d}/{NUM_EPOCHS:03d} | '\n",
+ " f'Batch {batch_idx:03d}/{len(train_loader):03d} |' \n",
+ " f' Cost: {cost:.4f}')\n",
+ "\n",
+ " # 매 Epoch마다 evaluation을 진행합니다. \n",
+ " # Epoch마다 Loss를 기록하여 학습과정을 살펴보고 Underfitting, Overfitting 여부를 확인합니다.\n",
+ " model.eval()\n",
+ " with torch.set_grad_enabled(False): # Gradient 계산이 안되도록\n",
+ " train_acc, train_loss = compute_accuracy_and_loss(model, train_loader, device=DEVICE) # train acc, loss 계산\n",
+ " test_acc, test_loss = compute_accuracy_and_loss(model, test_loader, device=DEVICE) # test acc, loss 계산\n",
+ " \n",
+ " # list에 train, test의 acc, loss 추가\n",
+ " train_acc_lst.append(train_acc)\n",
+ " test_acc_lst.append(test_acc)\n",
+ " train_loss_lst.append(train_loss)\n",
+ " test_loss_lst.append(test_loss)\n",
+ " \n",
+ " # 로깅\n",
+ " print(f'Epoch: {epoch+1:03d}/{NUM_EPOCHS:03d} Train Acc.: {train_acc:.2f}%'\n",
+ " f' | Test Acc.: {test_acc:.2f}%')\n",
+ " \n",
+ " # 1 epoch 학습 소요시간\n",
+ " elapsed = (time.time() - start_time)/60\n",
+ " print(f'Time elapsed: {elapsed:.2f} min')\n",
+ "\n",
+ "# 총 학습 소요시간\n",
+ "elapsed = (time.time() - start_time)/60\n",
+ "print(f'Total Training Time: {elapsed:.2f} min')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "02201bb2",
+ "metadata": {},
+ "source": [
+ "## 2-3. Evaluation\n",
+ "테스트 데이터와 학습 데이터의 Loss 변화를 확인 합니다."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "88d756c7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.plot(range(1, NUM_EPOCHS+1), train_loss_lst, label='Training loss')\n",
+ "plt.plot(range(1, NUM_EPOCHS+1), test_loss_lst, label='Test loss')\n",
+ "plt.legend(loc='upper right')\n",
+ "plt.ylabel('Cross entropy')\n",
+ "plt.xlabel('Epoch')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "3b3a090f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.plot(range(1, NUM_EPOCHS+1), train_acc_lst, label='Training accuracy')\n",
+ "plt.plot(range(1, NUM_EPOCHS+1), test_acc_lst, label='Test accuracy')\n",
+ "plt.legend(loc='upper left')\n",
+ "plt.ylabel('Cross entropy')\n",
+ "plt.xlabel('Epoch')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "ccfebc8d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Test accuracy: 96.92%\n"
+ ]
+ }
+ ],
+ "source": [
+ "model.eval()\n",
+ "with torch.set_grad_enabled(False): # save memory during inference\n",
+ " test_acc, test_loss = compute_accuracy_and_loss(model, test_loader, DEVICE)\n",
+ " print(f'Test accuracy: {test_acc:.2f}%')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "0886fd6a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "for batch_idx, (x, y) in enumerate(test_loader):\n",
+ " x = x.to(DEVICE)\n",
+ " y = y.to(DEVICE)\n",
+ "\n",
+ " x_numpy = x.numpy()\n",
+ " \n",
+ " fig, axes = plt.subplots(1, 5)\n",
+ " \n",
+ " for ax in axes:\n",
+ " index = random.randint(0, 64)\n",
+ " logits, probas = model(x[index].view(-1, 28*28))\n",
+ " _, predicted_labels = torch.max(probas, 1)\n",
+ " ax.imshow(x_numpy[index].reshape(28, 28))\n",
+ " ax.set_title(f'Label {predicted_labels[0]}')\n",
+ " \n",
+ " plt.show()\n",
+ " break"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9606aff2",
+ "metadata": {},
+ "source": [
+ "## 2-4. Discussion\n",
+ "1. Train Data에 대한 정확도와, Test Data에 대한 정확도가 왜 다를까요?\n",
+ "- train data에 대해 학습을 잘 시켜도, test data에 대해 잘 맞을지는 확실하지 않기 때문이다. test data에는 train data set에는 없는 값이 있을 수도 있기 때문에 이에 대해서 정확도가 떨어질 수 있다.\n",
+ "\n",
+ "2. 다른 사람들은 정확도가 99퍼가 넘는 모델도 만들던데, DNN의 한계가 있다면 어떤 점이 있을까요? (Hint: 우리는 28x28의 이미지를 768x1로 쫙 펴서 넣어 줬습니다.)\n",
+ "- 원래 이미지를 28 by 28 크기로 쪼개고, 이를 1차원 배열로 만들기 위해 768x1로 펼치면, 국소 부분들을 추출 못 하는 경우가 생긴다. 이것이 이미지에 대한 정확도가 낮아지는 DNN의 한계점이다. 이에 대한 단점을 해결한 것이 CNN이다."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e72bd14c",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/assignments/Charmull/world-happiness-report-2021.csv b/assignments/Charmull/world-happiness-report-2021.csv
new file mode 100644
index 0000000..cd19041
--- /dev/null
+++ b/assignments/Charmull/world-happiness-report-2021.csv
@@ -0,0 +1,150 @@
+Country name,Regional indicator,Ladder score,Standard error of ladder score,upperwhisker,lowerwhisker,Logged GDP per capita,Social support,Healthy life expectancy,Freedom to make life choices,Generosity,Perceptions of corruption,Ladder score in Dystopia,Explained by: Log GDP per capita,Explained by: Social support,Explained by: Healthy life expectancy,Explained by: Freedom to make life choices,Explained by: Generosity,Explained by: Perceptions of corruption,Dystopia + residual
+Finland,Western Europe,7.842,0.032,7.904,7.780,10.775,0.954,72.000,0.949,-0.098,0.186,2.430,1.446,1.106,0.741,0.691,0.124,0.481,3.253
+Denmark,Western Europe,7.620,0.035,7.687,7.552,10.933,0.954,72.700,0.946,0.030,0.179,2.430,1.502,1.108,0.763,0.686,0.208,0.485,2.868
+Switzerland,Western Europe,7.571,0.036,7.643,7.500,11.117,0.942,74.400,0.919,0.025,0.292,2.430,1.566,1.079,0.816,0.653,0.204,0.413,2.839
+Iceland,Western Europe,7.554,0.059,7.670,7.438,10.878,0.983,73.000,0.955,0.160,0.673,2.430,1.482,1.172,0.772,0.698,0.293,0.170,2.967
+Netherlands,Western Europe,7.464,0.027,7.518,7.410,10.932,0.942,72.400,0.913,0.175,0.338,2.430,1.501,1.079,0.753,0.647,0.302,0.384,2.798
+Norway,Western Europe,7.392,0.035,7.462,7.323,11.053,0.954,73.300,0.960,0.093,0.270,2.430,1.543,1.108,0.782,0.703,0.249,0.427,2.580
+Sweden,Western Europe,7.363,0.036,7.433,7.293,10.867,0.934,72.700,0.945,0.086,0.237,2.430,1.478,1.062,0.763,0.685,0.244,0.448,2.683
+Luxembourg,Western Europe,7.324,0.037,7.396,7.252,11.647,0.908,72.600,0.907,-0.034,0.386,2.430,1.751,1.003,0.760,0.639,0.166,0.353,2.653
+New Zealand,North America and ANZ,7.277,0.040,7.355,7.198,10.643,0.948,73.400,0.929,0.134,0.242,2.430,1.400,1.094,0.785,0.665,0.276,0.445,2.612
+Austria,Western Europe,7.268,0.036,7.337,7.198,10.906,0.934,73.300,0.908,0.042,0.481,2.430,1.492,1.062,0.782,0.640,0.215,0.292,2.784
+Australia,North America and ANZ,7.183,0.041,7.265,7.102,10.796,0.940,73.900,0.914,0.159,0.442,2.430,1.453,1.076,0.801,0.647,0.291,0.317,2.598
+Israel,Middle East and North Africa,7.157,0.034,7.224,7.090,10.575,0.939,73.503,0.800,0.031,0.753,2.430,1.376,1.074,0.788,0.509,0.208,0.119,3.083
+Germany,Western Europe,7.155,0.040,7.232,7.077,10.873,0.903,72.500,0.875,0.011,0.460,2.430,1.480,0.993,0.757,0.600,0.195,0.306,2.824
+Canada,North America and ANZ,7.103,0.042,7.185,7.021,10.776,0.926,73.800,0.915,0.089,0.415,2.430,1.447,1.044,0.798,0.648,0.246,0.335,2.585
+Ireland,Western Europe,7.085,0.040,7.164,7.006,11.342,0.947,72.400,0.879,0.077,0.363,2.430,1.644,1.092,0.753,0.606,0.238,0.367,2.384
+Costa Rica,Latin America and Caribbean,7.069,0.056,7.179,6.960,9.880,0.891,71.400,0.934,-0.126,0.809,2.430,1.134,0.966,0.722,0.673,0.105,0.083,3.387
+United Kingdom,Western Europe,7.064,0.038,7.138,6.990,10.707,0.934,72.500,0.859,0.233,0.459,2.430,1.423,1.062,0.757,0.580,0.340,0.306,2.596
+Czech Republic,Central and Eastern Europe,6.965,0.049,7.062,6.868,10.556,0.947,70.807,0.858,-0.208,0.868,2.430,1.370,1.090,0.703,0.580,0.052,0.046,3.124
+United States,North America and ANZ,6.951,0.049,7.047,6.856,11.023,0.920,68.200,0.837,0.098,0.698,2.430,1.533,1.030,0.621,0.554,0.252,0.154,2.807
+Belgium,Western Europe,6.834,0.034,6.901,6.767,10.823,0.906,72.199,0.783,-0.153,0.646,2.430,1.463,0.998,0.747,0.489,0.088,0.187,2.862
+France,Western Europe,6.690,0.037,6.762,6.618,10.704,0.942,74.000,0.822,-0.147,0.571,2.430,1.421,1.081,0.804,0.536,0.092,0.235,2.521
+Bahrain,Middle East and North Africa,6.647,0.068,6.779,6.514,10.669,0.862,69.495,0.925,0.089,0.722,2.430,1.409,0.899,0.662,0.661,0.246,0.139,2.631
+Malta,Western Europe,6.602,0.044,6.688,6.516,10.674,0.931,72.200,0.927,0.133,0.653,2.430,1.411,1.055,0.747,0.664,0.275,0.183,2.268
+Taiwan Province of China,East Asia,6.584,0.038,6.659,6.510,10.871,0.898,69.600,0.784,-0.070,0.721,2.430,1.480,0.982,0.665,0.490,0.142,0.139,2.687
+United Arab Emirates,Middle East and North Africa,6.561,0.039,6.637,6.484,11.085,0.844,67.333,0.932,0.074,0.589,2.430,1.555,0.860,0.594,0.670,0.236,0.223,2.422
+Saudi Arabia,Middle East and North Africa,6.494,0.056,6.604,6.384,10.743,0.891,66.603,0.877,-0.149,0.684,2.430,1.435,0.964,0.571,0.603,0.090,0.163,2.668
+Spain,Western Europe,6.491,0.042,6.574,6.408,10.571,0.932,74.700,0.761,-0.081,0.745,2.430,1.375,1.057,0.826,0.462,0.135,0.124,2.513
+Italy,Western Europe,6.483,0.045,6.572,6.395,10.623,0.880,73.800,0.693,-0.084,0.866,2.430,1.393,0.940,0.798,0.379,0.133,0.047,2.794
+Slovenia,Central and Eastern Europe,6.461,0.043,6.546,6.376,10.529,0.948,71.400,0.949,-0.101,0.806,2.430,1.360,1.093,0.722,0.690,0.122,0.085,2.388
+Guatemala,Latin America and Caribbean,6.435,0.073,6.577,6.292,9.053,0.813,64.958,0.906,-0.038,0.775,2.430,0.845,0.790,0.519,0.638,0.163,0.105,3.375
+Uruguay,Latin America and Caribbean,6.431,0.046,6.521,6.341,9.966,0.925,69.100,0.896,-0.092,0.590,2.430,1.164,1.042,0.649,0.625,0.128,0.223,2.600
+Singapore,Southeast Asia,6.377,0.043,6.460,6.293,11.488,0.915,76.953,0.927,-0.018,0.082,2.430,1.695,1.019,0.897,0.664,0.176,0.547,1.379
+Kosovo,Central and Eastern Europe,6.372,0.059,6.487,6.257,9.318,0.821,63.813,0.869,0.257,0.917,2.430,0.937,0.807,0.483,0.593,0.356,0.014,3.182
+Slovakia,Central and Eastern Europe,6.331,0.041,6.411,6.251,10.369,0.936,69.201,0.766,-0.124,0.911,2.430,1.304,1.066,0.653,0.468,0.107,0.018,2.714
+Brazil,Latin America and Caribbean,6.330,0.043,6.415,6.245,9.577,0.882,66.601,0.804,-0.071,0.756,2.430,1.028,0.944,0.571,0.514,0.142,0.117,3.015
+Mexico,Latin America and Caribbean,6.317,0.053,6.420,6.213,9.859,0.831,68.597,0.862,-0.147,0.799,2.430,1.126,0.830,0.634,0.585,0.092,0.089,2.961
+Jamaica,Latin America and Caribbean,6.309,0.156,6.615,6.004,9.186,0.877,67.500,0.890,-0.137,0.884,2.430,0.891,0.932,0.599,0.618,0.099,0.035,3.135
+Lithuania,Central and Eastern Europe,6.255,0.045,6.344,6.167,10.499,0.935,67.906,0.773,-0.203,0.826,2.430,1.350,1.065,0.612,0.476,0.056,0.073,2.624
+Cyprus,Western Europe,6.223,0.049,6.319,6.128,10.576,0.802,73.898,0.763,-0.015,0.844,2.430,1.377,0.765,0.801,0.464,0.178,0.061,2.578
+Estonia,Central and Eastern Europe,6.189,0.038,6.263,6.115,10.481,0.941,68.800,0.909,-0.106,0.527,2.430,1.344,1.079,0.640,0.641,0.119,0.263,2.103
+Panama,Latin America and Caribbean,6.180,0.073,6.323,6.036,10.350,0.896,69.652,0.872,-0.166,0.856,2.430,1.298,0.976,0.667,0.596,0.079,0.053,2.509
+Uzbekistan,Commonwealth of Independent States,6.179,0.068,6.312,6.045,8.836,0.918,65.255,0.970,0.311,0.515,2.430,0.769,1.027,0.528,0.716,0.391,0.271,2.477
+Chile,Latin America and Caribbean,6.172,0.046,6.262,6.081,10.071,0.882,70.000,0.742,-0.044,0.830,2.430,1.200,0.946,0.678,0.438,0.159,0.070,2.682
+Poland,Central and Eastern Europe,6.166,0.040,6.245,6.087,10.382,0.898,69.702,0.841,-0.165,0.735,2.430,1.309,0.982,0.668,0.558,0.080,0.130,2.438
+Kazakhstan,Commonwealth of Independent States,6.152,0.047,6.243,6.060,10.155,0.952,65.200,0.853,-0.069,0.733,2.430,1.230,1.103,0.527,0.573,0.143,0.132,2.446
+Romania,Central and Eastern Europe,6.140,0.057,6.253,6.027,10.284,0.832,67.355,0.845,-0.219,0.938,2.430,1.275,0.832,0.595,0.564,0.045,0.001,2.830
+Kuwait,Middle East and North Africa,6.106,0.066,6.235,5.977,10.817,0.843,66.900,0.867,-0.104,0.736,2.430,1.461,0.857,0.580,0.591,0.120,0.130,2.368
+Serbia,Central and Eastern Europe,6.078,0.053,6.181,5.974,9.787,0.873,68.600,0.778,0.002,0.835,2.430,1.101,0.924,0.634,0.482,0.189,0.066,2.682
+El Salvador,Latin America and Caribbean,6.061,0.065,6.188,5.933,9.054,0.762,66.402,0.888,-0.110,0.688,2.430,0.845,0.675,0.565,0.615,0.116,0.160,3.085
+Mauritius,Sub-Saharan Africa,6.049,0.059,6.165,5.933,10.008,0.905,66.701,0.867,-0.054,0.789,2.430,1.178,0.996,0.574,0.590,0.153,0.096,2.462
+Latvia,Central and Eastern Europe,6.032,0.036,6.103,5.961,10.315,0.927,67.100,0.715,-0.162,0.800,2.430,1.285,1.047,0.587,0.405,0.082,0.089,2.536
+Colombia,Latin America and Caribbean,6.012,0.061,6.132,5.892,9.557,0.847,68.001,0.837,-0.135,0.841,2.430,1.021,0.866,0.615,0.554,0.100,0.063,2.794
+Hungary,Central and Eastern Europe,5.992,0.047,6.085,5.899,10.358,0.943,68.000,0.755,-0.186,0.876,2.430,1.301,1.083,0.615,0.454,0.067,0.040,2.432
+Thailand,Southeast Asia,5.985,0.047,6.077,5.893,9.805,0.888,67.401,0.884,0.287,0.895,2.430,1.107,0.957,0.596,0.611,0.375,0.028,2.309
+Nicaragua,Latin America and Caribbean,5.972,0.083,6.134,5.810,8.620,0.864,67.657,0.836,0.020,0.664,2.430,0.693,0.904,0.604,0.553,0.201,0.176,2.841
+Japan,East Asia,5.940,0.040,6.020,5.861,10.611,0.884,75.100,0.796,-0.258,0.638,2.430,1.389,0.949,0.838,0.504,0.020,0.192,2.048
+Argentina,Latin America and Caribbean,5.929,0.056,6.040,5.819,9.962,0.898,69.000,0.828,-0.182,0.834,2.430,1.162,0.980,0.646,0.544,0.069,0.067,2.461
+Portugal,Western Europe,5.929,0.055,6.037,5.821,10.421,0.879,72.600,0.892,-0.244,0.887,2.430,1.323,0.939,0.760,0.621,0.029,0.033,2.225
+Honduras,Latin America and Caribbean,5.919,0.082,6.081,5.758,8.648,0.812,67.300,0.857,0.081,0.809,2.430,0.703,0.787,0.593,0.578,0.241,0.083,2.934
+Croatia,Central and Eastern Europe,5.882,0.048,5.975,5.788,10.217,0.924,70.799,0.754,-0.118,0.939,2.430,1.251,1.039,0.703,0.453,0.111,0.000,2.325
+Philippines,Southeast Asia,5.880,0.052,5.982,5.778,9.076,0.830,62.000,0.917,-0.097,0.742,2.430,0.853,0.828,0.426,0.651,0.125,0.126,2.872
+South Korea,East Asia,5.845,0.042,5.928,5.763,10.651,0.799,73.900,0.672,-0.083,0.727,2.430,1.403,0.758,0.801,0.353,0.134,0.135,2.262
+Peru,Latin America and Caribbean,5.840,0.075,5.988,5.692,9.458,0.832,68.250,0.822,-0.154,0.891,2.430,0.986,0.833,0.623,0.536,0.087,0.031,2.744
+Bosnia and Herzegovina,Central and Eastern Europe,5.813,0.050,5.911,5.715,9.590,0.870,68.098,0.706,0.113,0.931,2.430,1.032,0.919,0.618,0.395,0.261,0.005,2.583
+Moldova,Commonwealth of Independent States,5.766,0.046,5.856,5.677,9.454,0.857,65.699,0.822,-0.079,0.918,2.430,0.985,0.888,0.542,0.536,0.137,0.013,2.665
+Ecuador,Latin America and Caribbean,5.764,0.057,5.875,5.653,9.313,0.821,68.800,0.842,-0.124,0.843,2.430,0.935,0.806,0.640,0.560,0.107,0.062,2.653
+Kyrgyzstan,Commonwealth of Independent States,5.744,0.046,5.834,5.653,8.538,0.893,64.401,0.935,0.119,0.908,2.430,0.665,0.971,0.501,0.673,0.266,0.020,2.648
+Greece,Western Europe,5.723,0.046,5.813,5.632,10.279,0.823,72.600,0.582,-0.288,0.823,2.430,1.273,0.811,0.760,0.243,0.000,0.074,2.561
+Bolivia,Latin America and Caribbean,5.716,0.053,5.819,5.613,9.046,0.810,63.901,0.875,-0.077,0.839,2.430,0.842,0.782,0.486,0.600,0.138,0.064,2.805
+Mongolia,East Asia,5.677,0.042,5.760,5.595,9.400,0.935,62.500,0.708,0.116,0.856,2.430,0.966,1.065,0.442,0.397,0.263,0.053,2.492
+Paraguay,Latin America and Caribbean,5.653,0.092,5.832,5.473,9.448,0.893,65.900,0.876,0.028,0.882,2.430,0.983,0.970,0.549,0.602,0.206,0.037,2.306
+Montenegro,Central and Eastern Europe,5.581,0.054,5.686,5.475,9.940,0.858,68.699,0.708,-0.034,0.812,2.430,1.155,0.891,0.637,0.397,0.166,0.081,2.254
+Dominican Republic,Latin America and Caribbean,5.545,0.071,5.685,5.405,9.802,0.853,66.102,0.860,-0.133,0.714,2.430,1.106,0.879,0.555,0.581,0.101,0.144,2.178
+North Cyprus,Western Europe,5.536,0.051,5.636,5.435,10.576,0.820,73.898,0.795,0.012,0.626,2.430,1.377,0.806,0.801,0.503,0.196,0.200,1.653
+Belarus,Commonwealth of Independent States,5.534,0.047,5.625,5.442,9.853,0.910,66.253,0.650,-0.180,0.627,2.430,1.124,1.007,0.560,0.326,0.070,0.199,2.247
+Russia,Commonwealth of Independent States,5.477,0.033,5.541,5.413,10.189,0.903,64.703,0.718,-0.111,0.845,2.430,1.241,0.992,0.511,0.409,0.115,0.060,2.148
+Hong Kong S.A.R. of China,East Asia,5.477,0.049,5.573,5.380,11.000,0.836,76.820,0.717,0.067,0.403,2.430,1.525,0.841,0.893,0.408,0.232,0.342,1.236
+Tajikistan,Commonwealth of Independent States,5.466,0.034,5.532,5.400,8.091,0.860,64.281,0.832,-0.056,0.553,2.430,0.508,0.895,0.498,0.548,0.152,0.247,2.619
+Vietnam,Southeast Asia,5.411,0.039,5.488,5.334,8.973,0.850,68.034,0.940,-0.098,0.796,2.430,0.817,0.873,0.616,0.679,0.124,0.091,2.211
+Libya,Middle East and North Africa,5.410,0.076,5.558,5.262,9.622,0.827,62.300,0.771,-0.087,0.667,2.430,1.044,0.821,0.435,0.474,0.131,0.174,2.331
+Malaysia,Southeast Asia,5.384,0.049,5.480,5.289,10.238,0.817,67.102,0.895,0.125,0.839,2.430,1.259,0.797,0.587,0.624,0.270,0.064,1.784
+Indonesia,Southeast Asia,5.345,0.056,5.454,5.235,9.365,0.811,62.236,0.873,0.542,0.867,2.430,0.954,0.786,0.433,0.598,0.541,0.046,1.987
+Congo (Brazzaville),Sub-Saharan Africa,5.342,0.097,5.533,5.151,8.117,0.636,58.221,0.695,-0.068,0.745,2.430,0.518,0.392,0.307,0.381,0.144,0.124,3.476
+China,East Asia,5.339,0.029,5.397,5.281,9.673,0.811,69.593,0.904,-0.146,0.755,2.430,1.061,0.785,0.665,0.636,0.093,0.117,1.982
+Ivory Coast,Sub-Saharan Africa,5.306,0.078,5.460,5.152,8.551,0.644,50.114,0.741,-0.016,0.794,2.430,0.669,0.409,0.052,0.438,0.177,0.092,3.469
+Armenia,Commonwealth of Independent States,5.283,0.058,5.397,5.168,9.487,0.799,67.055,0.825,-0.168,0.629,2.430,0.996,0.758,0.585,0.540,0.079,0.198,2.127
+Nepal,South Asia,5.269,0.070,5.406,5.132,8.120,0.774,64.233,0.782,0.152,0.727,2.430,0.519,0.702,0.496,0.488,0.287,0.135,2.642
+Bulgaria,Central and Eastern Europe,5.266,0.054,5.371,5.160,10.016,0.931,67.000,0.788,-0.096,0.932,2.430,1.181,1.055,0.583,0.494,0.125,0.005,1.823
+Maldives,South Asia,5.198,0.072,5.339,5.057,9.826,0.913,70.600,0.854,0.024,0.825,2.430,1.115,1.015,0.697,0.575,0.204,0.073,1.520
+Azerbaijan,Commonwealth of Independent States,5.171,0.040,5.250,5.091,9.569,0.836,65.656,0.814,-0.223,0.506,2.430,1.025,0.841,0.541,0.526,0.043,0.276,1.919
+Cameroon,Sub-Saharan Africa,5.142,0.074,5.288,4.996,8.189,0.710,53.515,0.731,0.026,0.848,2.430,0.543,0.556,0.159,0.425,0.205,0.058,3.195
+Senegal,Sub-Saharan Africa,5.132,0.068,5.266,4.998,8.118,0.710,59.802,0.695,-0.046,0.801,2.430,0.518,0.558,0.357,0.381,0.158,0.088,3.071
+Albania,Central and Eastern Europe,5.117,0.059,5.234,5.001,9.520,0.697,68.999,0.785,-0.030,0.901,2.430,1.008,0.529,0.646,0.491,0.168,0.024,2.250
+North Macedonia,Central and Eastern Europe,5.101,0.051,5.202,5.001,9.693,0.805,65.474,0.751,0.038,0.905,2.430,1.068,0.772,0.535,0.450,0.212,0.022,2.042
+Ghana,Sub-Saharan Africa,5.088,0.067,5.219,4.958,8.580,0.727,57.586,0.807,0.123,0.848,2.430,0.680,0.595,0.287,0.517,0.268,0.058,2.684
+Niger,Sub-Saharan Africa,5.074,0.102,5.273,4.875,7.098,0.641,53.780,0.806,0.018,0.693,2.430,0.162,0.402,0.167,0.516,0.200,0.157,3.470
+Turkmenistan,Commonwealth of Independent States,5.066,0.036,5.136,4.996,9.629,0.983,62.409,0.877,0.273,0.888,2.430,1.046,1.172,0.439,0.602,0.366,0.033,1.409
+Gambia,Sub-Saharan Africa,5.051,0.089,5.225,4.877,7.686,0.690,55.160,0.697,0.424,0.746,2.430,0.367,0.511,0.210,0.384,0.465,0.123,2.990
+Benin,Sub-Saharan Africa,5.045,0.073,5.189,4.901,8.087,0.489,54.713,0.757,-0.034,0.661,2.430,0.507,0.058,0.196,0.457,0.166,0.178,3.482
+Laos,Southeast Asia,5.030,0.045,5.119,4.941,8.947,0.728,58.968,0.910,0.123,0.658,2.430,0.808,0.598,0.330,0.643,0.268,0.179,2.204
+Bangladesh,South Asia,5.025,0.046,5.115,4.934,8.454,0.693,64.800,0.877,-0.041,0.682,2.430,0.635,0.520,0.514,0.603,0.161,0.164,2.427
+Guinea,Sub-Saharan Africa,4.984,0.090,5.160,4.808,7.838,0.639,55.008,0.697,0.095,0.766,2.430,0.420,0.399,0.206,0.384,0.250,0.111,3.216
+South Africa,Sub-Saharan Africa,4.956,0.060,5.074,4.839,9.403,0.860,56.904,0.749,-0.067,0.860,2.430,0.967,0.895,0.265,0.447,0.144,0.051,2.187
+Turkey,Middle East and North Africa,4.948,0.046,5.038,4.857,10.240,0.822,67.199,0.576,-0.139,0.776,2.430,1.260,0.809,0.590,0.236,0.097,0.104,1.852
+Pakistan,South Asia,4.934,0.068,5.066,4.802,8.458,0.651,58.709,0.726,0.098,0.787,2.430,0.637,0.423,0.322,0.418,0.252,0.097,2.784
+Morocco,Middle East and North Africa,4.918,0.060,5.036,4.800,8.903,0.560,66.208,0.774,-0.236,0.801,2.430,0.792,0.219,0.558,0.477,0.034,0.088,2.749
+Venezuela,Latin America and Caribbean,4.892,0.064,5.017,4.767,9.073,0.861,66.700,0.615,-0.169,0.827,2.430,0.852,0.897,0.574,0.284,0.078,0.072,2.135
+Georgia,Commonwealth of Independent States,4.891,0.054,4.998,4.785,9.585,0.671,64.300,0.783,-0.238,0.655,2.430,1.030,0.470,0.498,0.488,0.032,0.181,2.191
+Algeria,Middle East and North Africa,4.887,0.053,4.991,4.783,9.342,0.802,66.005,0.480,-0.067,0.752,2.430,0.946,0.765,0.552,0.119,0.144,0.120,2.242
+Ukraine,Commonwealth of Independent States,4.875,0.052,4.977,4.773,9.436,0.888,64.902,0.724,-0.011,0.924,2.430,0.979,0.958,0.517,0.417,0.181,0.010,1.813
+Iraq,Middle East and North Africa,4.854,0.059,4.970,4.738,9.240,0.746,60.583,0.630,-0.053,0.875,2.430,0.910,0.638,0.381,0.302,0.153,0.041,2.429
+Gabon,Sub-Saharan Africa,4.852,0.075,4.998,4.706,9.603,0.776,59.962,0.731,-0.200,0.840,2.430,1.037,0.707,0.362,0.424,0.058,0.064,2.201
+Burkina Faso,Sub-Saharan Africa,4.834,0.081,4.993,4.675,7.678,0.672,54.151,0.695,-0.009,0.748,2.430,0.364,0.472,0.179,0.381,0.182,0.122,3.133
+Cambodia,Southeast Asia,4.830,0.067,4.963,4.698,8.360,0.765,62.000,0.959,0.034,0.843,2.430,0.603,0.680,0.426,0.702,0.210,0.061,2.148
+Mozambique,Sub-Saharan Africa,4.794,0.103,4.997,4.592,7.158,0.744,54.706,0.882,0.061,0.684,2.430,0.183,0.634,0.196,0.608,0.228,0.163,2.783
+Nigeria,Sub-Saharan Africa,4.759,0.052,4.861,4.658,8.533,0.740,50.102,0.737,0.037,0.878,2.430,0.663,0.625,0.051,0.433,0.212,0.039,2.736
+Mali,Sub-Saharan Africa,4.723,0.082,4.884,4.563,7.744,0.724,51.969,0.697,-0.036,0.827,2.430,0.387,0.590,0.110,0.384,0.164,0.072,3.016
+Iran,Middle East and North Africa,4.721,0.055,4.828,4.614,9.584,0.710,66.300,0.608,0.218,0.714,2.430,1.030,0.557,0.561,0.275,0.330,0.144,1.823
+Uganda,Sub-Saharan Africa,4.636,0.073,4.780,4.493,7.677,0.781,56.101,0.709,0.122,0.855,2.430,0.364,0.718,0.240,0.398,0.267,0.054,2.596
+Liberia,Sub-Saharan Africa,4.625,0.106,4.833,4.417,7.288,0.720,56.498,0.735,0.050,0.850,2.430,0.228,0.580,0.253,0.430,0.221,0.057,2.857
+Kenya,Sub-Saharan Africa,4.607,0.072,4.747,4.466,8.361,0.688,60.704,0.779,0.287,0.825,2.430,0.603,0.508,0.385,0.483,0.375,0.073,2.180
+Tunisia,Middle East and North Africa,4.596,0.058,4.709,4.484,9.266,0.691,67.201,0.656,-0.201,0.870,2.430,0.919,0.515,0.590,0.334,0.057,0.044,2.138
+Lebanon,Middle East and North Africa,4.584,0.055,4.691,4.477,9.626,0.848,67.355,0.525,-0.073,0.898,2.430,1.045,0.868,0.595,0.175,0.140,0.026,1.736
+Namibia,Sub-Saharan Africa,4.574,0.064,4.700,4.448,9.161,0.818,56.799,0.719,-0.149,0.847,2.430,0.882,0.801,0.262,0.411,0.091,0.059,2.068
+Palestinian Territories,Middle East and North Africa,4.517,0.067,4.649,4.384,8.485,0.826,62.250,0.653,-0.163,0.821,2.430,0.646,0.819,0.434,0.330,0.082,0.075,2.131
+Myanmar,Southeast Asia,4.426,0.052,4.527,4.324,8.541,0.779,59.302,0.876,0.509,0.660,2.430,0.666,0.713,0.341,0.601,0.520,0.178,1.407
+Jordan,Middle East and North Africa,4.395,0.062,4.516,4.273,9.182,0.767,67.000,0.755,-0.167,0.705,2.430,0.890,0.685,0.583,0.455,0.079,0.150,1.553
+Chad,Sub-Saharan Africa,4.355,0.094,4.540,4.171,7.364,0.619,48.478,0.579,0.041,0.807,2.430,0.255,0.353,0.000,0.240,0.215,0.084,3.209
+Sri Lanka,South Asia,4.325,0.066,4.454,4.196,9.470,0.827,67.299,0.841,0.079,0.863,2.430,0.990,0.820,0.593,0.559,0.239,0.049,1.075
+Swaziland,Sub-Saharan Africa,4.308,0.071,4.448,4.168,9.065,0.770,50.833,0.647,-0.185,0.708,2.430,0.849,0.693,0.074,0.323,0.067,0.147,2.155
+Comoros,Sub-Saharan Africa,4.289,0.084,4.454,4.123,8.031,0.626,57.349,0.548,0.082,0.781,2.430,0.488,0.367,0.279,0.202,0.241,0.101,2.610
+Egypt,Middle East and North Africa,4.283,0.045,4.371,4.195,9.367,0.750,61.998,0.749,-0.182,0.795,2.430,0.954,0.647,0.426,0.446,0.069,0.092,1.648
+Ethiopia,Sub-Saharan Africa,4.275,0.051,4.374,4.175,7.694,0.764,59.000,0.752,0.082,0.761,2.430,0.370,0.679,0.331,0.451,0.241,0.114,2.089
+Mauritania,Sub-Saharan Africa,4.227,0.070,4.365,4.090,8.542,0.795,57.161,0.561,-0.106,0.731,2.430,0.666,0.749,0.273,0.218,0.119,0.133,2.069
+Madagascar,Sub-Saharan Africa,4.208,0.072,4.349,4.068,7.396,0.686,59.305,0.552,-0.005,0.803,2.430,0.266,0.503,0.341,0.207,0.185,0.087,2.620
+Togo,Sub-Saharan Africa,4.107,0.077,4.258,3.956,7.362,0.569,54.914,0.619,0.032,0.772,2.430,0.254,0.239,0.203,0.289,0.209,0.107,2.806
+Zambia,Sub-Saharan Africa,4.073,0.069,4.209,3.938,8.145,0.708,55.809,0.782,0.061,0.823,2.430,0.528,0.552,0.231,0.487,0.227,0.074,1.975
+Sierra Leone,Sub-Saharan Africa,3.849,0.077,4.001,3.698,7.434,0.630,51.651,0.717,0.084,0.866,2.430,0.279,0.377,0.100,0.408,0.243,0.047,2.396
+India,South Asia,3.819,0.026,3.869,3.769,8.755,0.603,60.633,0.893,0.089,0.774,2.430,0.741,0.316,0.383,0.622,0.246,0.106,1.405
+Burundi,Sub-Saharan Africa,3.775,0.107,3.985,3.565,6.635,0.490,53.400,0.626,-0.024,0.607,2.430,0.000,0.062,0.155,0.298,0.172,0.212,2.876
+Yemen,Middle East and North Africa,3.658,0.070,3.794,3.521,7.578,0.832,57.122,0.602,-0.147,0.800,2.430,0.329,0.831,0.272,0.268,0.092,0.089,1.776
+Tanzania,Sub-Saharan Africa,3.623,0.071,3.762,3.485,7.876,0.702,57.999,0.833,0.183,0.577,2.430,0.433,0.540,0.300,0.549,0.307,0.231,1.263
+Haiti,Latin America and Caribbean,3.615,0.173,3.953,3.276,7.477,0.540,55.700,0.593,0.422,0.721,2.430,0.294,0.173,0.227,0.257,0.463,0.139,2.060
+Malawi,Sub-Saharan Africa,3.600,0.092,3.781,3.419,6.958,0.537,57.948,0.780,0.038,0.729,2.430,0.113,0.168,0.298,0.484,0.213,0.134,2.190
+Lesotho,Sub-Saharan Africa,3.512,0.120,3.748,3.276,7.926,0.787,48.700,0.715,-0.131,0.915,2.430,0.451,0.731,0.007,0.405,0.103,0.015,1.800
+Botswana,Sub-Saharan Africa,3.467,0.074,3.611,3.322,9.782,0.784,59.269,0.824,-0.246,0.801,2.430,1.099,0.724,0.340,0.539,0.027,0.088,0.648
+Rwanda,Sub-Saharan Africa,3.415,0.068,3.548,3.282,7.676,0.552,61.400,0.897,0.061,0.167,2.430,0.364,0.202,0.407,0.627,0.227,0.493,1.095
+Zimbabwe,Sub-Saharan Africa,3.145,0.058,3.259,3.030,7.943,0.750,56.201,0.677,-0.047,0.821,2.430,0.457,0.649,0.243,0.359,0.157,0.075,1.205
+Afghanistan,South Asia,2.523,0.038,2.596,2.449,7.695,0.463,52.493,0.382,-0.102,0.924,2.430,0.370,0.000,0.126,0.000,0.122,0.010,1.895
\ No newline at end of file