Skip to content

Instantly share code, notes, and snippets.

@dsaint31x
Last active June 6, 2024 12:56
Show Gist options
  • Save dsaint31x/736ea85c52b704c40e0214785b456351 to your computer and use it in GitHub Desktop.
Save dsaint31x/736ea85c52b704c40e0214785b456351 to your computer and use it in GitHub Desktop.
dl_torch_multiclass_classification.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"toc_visible": true,
"authorship_tag": "ABX9TyNj1kdaUZgptbBRBwIow1U/",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/dsaint31x/736ea85c52b704c40e0214785b456351/dl_torch_multiclass_classification.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"# Dataset"
],
"metadata": {
"id": "XwRyZEthq7FW"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "oLUs_h-Ysn6i",
"outputId": "22348492-0fe4-45d9-d587-07ecbfc2b550"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"<class 'sklearn.utils._bunch.Bunch'>\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"['DESCR',\n",
" 'data',\n",
" 'data_module',\n",
" 'feature_names',\n",
" 'filename',\n",
" 'frame',\n",
" 'target',\n",
" 'target_names']"
]
},
"metadata": {},
"execution_count": 1
}
],
"source": [
"from sklearn.datasets import load_iris\n",
"\n",
"iris = load_iris()\n",
"print(type(iris))\n",
"dir(iris)"
]
},
{
"cell_type": "markdown",
"source": [
"# Exploratory Data Analysis (EDA)\n",
"\n",
"탐색적 데이터 분석.\n",
"\n",
"여기선 df를 이용해 간단히 살펴본다."
],
"metadata": {
"id": "BigXS9S_E9n7"
}
},
{
"cell_type": "code",
"source": [
"from IPython import display\n",
"display.Markdown(iris.DESCR)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 872
},
"id": "TWQMre-us0bD",
"outputId": "b7d17519-2666-47bd-fe05-c53aa0e24f04"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<IPython.core.display.Markdown object>"
],
"text/markdown": ".. _iris_dataset:\n\nIris plants dataset\n--------------------\n\n**Data Set Characteristics:**\n\n :Number of Instances: 150 (50 in each of three classes)\n :Number of Attributes: 4 numeric, predictive attributes and the class\n :Attribute Information:\n - sepal length in cm\n - sepal width in cm\n - petal length in cm\n - petal width in cm\n - class:\n - Iris-Setosa\n - Iris-Versicolour\n - Iris-Virginica\n \n :Summary Statistics:\n\n ============== ==== ==== ======= ===== ====================\n Min Max Mean SD Class Correlation\n ============== ==== ==== ======= ===== ====================\n sepal length: 4.3 7.9 5.84 0.83 0.7826\n sepal width: 2.0 4.4 3.05 0.43 -0.4194\n petal length: 1.0 6.9 3.76 1.76 0.9490 (high!)\n petal width: 0.1 2.5 1.20 0.76 0.9565 (high!)\n ============== ==== ==== ======= ===== ====================\n\n :Missing Attribute Values: None\n :Class Distribution: 33.3% for each of 3 classes.\n :Creator: R.A. Fisher\n :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)\n :Date: July, 1988\n\nThe famous Iris database, first used by Sir R.A. Fisher. The dataset is taken\nfrom Fisher's paper. Note that it's the same as in R, but not as in the UCI\nMachine Learning Repository, which has two wrong data points.\n\nThis is perhaps the best known database to be found in the\npattern recognition literature. Fisher's paper is a classic in the field and\nis referenced frequently to this day. (See Duda & Hart, for example.) The\ndata set contains 3 classes of 50 instances each, where each class refers to a\ntype of iris plant. One class is linearly separable from the other 2; the\nlatter are NOT linearly separable from each other.\n\n.. topic:: References\n\n - Fisher, R.A. \"The use of multiple measurements in taxonomic problems\"\n Annual Eugenics, 7, Part II, 179-188 (1936); also in \"Contributions to\n Mathematical Statistics\" (John Wiley, NY, 1950).\n - Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.\n (Q327.D83) John Wiley & Sons. ISBN 0-471-22361-1. See page 218.\n - Dasarathy, B.V. (1980) \"Nosing Around the Neighborhood: A New System\n Structure and Classification Rule for Recognition in Partially Exposed\n Environments\". IEEE Transactions on Pattern Analysis and Machine\n Intelligence, Vol. PAMI-2, No. 1, 67-71.\n - Gates, G.W. (1972) \"The Reduced Nearest Neighbor Rule\". IEEE Transactions\n on Information Theory, May 1972, 431-433.\n - See also: 1988 MLC Proceedings, 54-64. Cheeseman et al\"s AUTOCLASS II\n conceptual clustering system finds 3 classes in the data.\n - Many, many more ..."
},
"metadata": {},
"execution_count": 2
}
]
},
{
"cell_type": "code",
"source": [
"import pandas as pd\n",
"\n",
"df = pd.DataFrame(iris.data, columns=iris.feature_names)\n",
"df['label'] = iris.target\n",
"\n",
"df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "dhnsMaE0Dl3s",
"outputId": "ec5aba95-c39c-4020-fa6e-279527b202de"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n",
"0 5.1 3.5 1.4 0.2 \n",
"1 4.9 3.0 1.4 0.2 \n",
"2 4.7 3.2 1.3 0.2 \n",
"3 4.6 3.1 1.5 0.2 \n",
"4 5.0 3.6 1.4 0.2 \n",
"\n",
" label \n",
"0 0 \n",
"1 0 \n",
"2 0 \n",
"3 0 \n",
"4 0 "
],
"text/html": [
"\n",
" <div id=\"df-f51c7776-70b5-4e58-af69-f9d5b1c7e702\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sepal length (cm)</th>\n",
" <th>sepal width (cm)</th>\n",
" <th>petal length (cm)</th>\n",
" <th>petal width (cm)</th>\n",
" <th>label</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>5.1</td>\n",
" <td>3.5</td>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>4.9</td>\n",
" <td>3.0</td>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>4.7</td>\n",
" <td>3.2</td>\n",
" <td>1.3</td>\n",
" <td>0.2</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4.6</td>\n",
" <td>3.1</td>\n",
" <td>1.5</td>\n",
" <td>0.2</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5.0</td>\n",
" <td>3.6</td>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-f51c7776-70b5-4e58-af69-f9d5b1c7e702')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-f51c7776-70b5-4e58-af69-f9d5b1c7e702 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-f51c7776-70b5-4e58-af69-f9d5b1c7e702');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-5fda5829-6ec5-4cf6-9f15-1d82a10c9cc5\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-5fda5829-6ec5-4cf6-9f15-1d82a10c9cc5')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-5fda5829-6ec5-4cf6-9f15-1d82a10c9cc5 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "df",
"summary": "{\n \"name\": \"df\",\n \"rows\": 150,\n \"fields\": [\n {\n \"column\": \"sepal length (cm)\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.828066127977863,\n \"min\": 4.3,\n \"max\": 7.9,\n \"num_unique_values\": 35,\n \"samples\": [\n 6.2,\n 4.5,\n 5.6\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sepal width (cm)\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.4358662849366982,\n \"min\": 2.0,\n \"max\": 4.4,\n \"num_unique_values\": 23,\n \"samples\": [\n 2.3,\n 4.0,\n 3.5\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"petal length (cm)\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.7652982332594662,\n \"min\": 1.0,\n \"max\": 6.9,\n \"num_unique_values\": 43,\n \"samples\": [\n 6.7,\n 3.8,\n 3.7\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"petal width (cm)\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.7622376689603465,\n \"min\": 0.1,\n \"max\": 2.5,\n \"num_unique_values\": 22,\n \"samples\": [\n 0.2,\n 1.2,\n 1.3\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"label\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 0,\n \"max\": 2,\n \"num_unique_values\": 3,\n \"samples\": [\n 0,\n 1,\n 2\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 3
}
]
},
{
"cell_type": "code",
"source": [
"df.describe()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 300
},
"id": "HtdJ8b29ETZb",
"outputId": "8506418c-e2c2-4fbf-97f1-f564e5857e07"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) \\\n",
"count 150.000000 150.000000 150.000000 \n",
"mean 5.843333 3.057333 3.758000 \n",
"std 0.828066 0.435866 1.765298 \n",
"min 4.300000 2.000000 1.000000 \n",
"25% 5.100000 2.800000 1.600000 \n",
"50% 5.800000 3.000000 4.350000 \n",
"75% 6.400000 3.300000 5.100000 \n",
"max 7.900000 4.400000 6.900000 \n",
"\n",
" petal width (cm) label \n",
"count 150.000000 150.000000 \n",
"mean 1.199333 1.000000 \n",
"std 0.762238 0.819232 \n",
"min 0.100000 0.000000 \n",
"25% 0.300000 0.000000 \n",
"50% 1.300000 1.000000 \n",
"75% 1.800000 2.000000 \n",
"max 2.500000 2.000000 "
],
"text/html": [
"\n",
" <div id=\"df-4cfd8458-1294-4138-b725-12b6242a9c73\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sepal length (cm)</th>\n",
" <th>sepal width (cm)</th>\n",
" <th>petal length (cm)</th>\n",
" <th>petal width (cm)</th>\n",
" <th>label</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>150.000000</td>\n",
" <td>150.000000</td>\n",
" <td>150.000000</td>\n",
" <td>150.000000</td>\n",
" <td>150.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>5.843333</td>\n",
" <td>3.057333</td>\n",
" <td>3.758000</td>\n",
" <td>1.199333</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>0.828066</td>\n",
" <td>0.435866</td>\n",
" <td>1.765298</td>\n",
" <td>0.762238</td>\n",
" <td>0.819232</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>4.300000</td>\n",
" <td>2.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.100000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>5.100000</td>\n",
" <td>2.800000</td>\n",
" <td>1.600000</td>\n",
" <td>0.300000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>5.800000</td>\n",
" <td>3.000000</td>\n",
" <td>4.350000</td>\n",
" <td>1.300000</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>6.400000</td>\n",
" <td>3.300000</td>\n",
" <td>5.100000</td>\n",
" <td>1.800000</td>\n",
" <td>2.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>7.900000</td>\n",
" <td>4.400000</td>\n",
" <td>6.900000</td>\n",
" <td>2.500000</td>\n",
" <td>2.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-4cfd8458-1294-4138-b725-12b6242a9c73')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-4cfd8458-1294-4138-b725-12b6242a9c73 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-4cfd8458-1294-4138-b725-12b6242a9c73');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-632ebb4c-f65e-4da1-8fa8-27b4cb38c406\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-632ebb4c-f65e-4da1-8fa8-27b4cb38c406')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-632ebb4c-f65e-4da1-8fa8-27b4cb38c406 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"summary": "{\n \"name\": \"df\",\n \"rows\": 8,\n \"fields\": [\n {\n \"column\": \"sepal length (cm)\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 51.24711349471842,\n \"min\": 0.828066127977863,\n \"max\": 150.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 5.843333333333334,\n 5.8,\n 150.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sepal width (cm)\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 52.08617800869865,\n \"min\": 0.4358662849366982,\n \"max\": 150.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 3.0573333333333337,\n 3.0,\n 150.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"petal length (cm)\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 51.83521261418364,\n \"min\": 1.0,\n \"max\": 150.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 3.7580000000000005,\n 4.35,\n 150.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"petal width (cm)\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 52.63664824261751,\n \"min\": 0.1,\n \"max\": 150.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 1.1993333333333336,\n 1.3,\n 150.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"label\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 52.69404575122032,\n \"min\": 0.0,\n \"max\": 150.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 1.0,\n 2.0,\n 0.8192319205190405\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"source": [
"df.info()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "VQ3w6RP0EbIC",
"outputId": "48174f67-62af-4478-e545-11e7b7b76cf4"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 150 entries, 0 to 149\n",
"Data columns (total 5 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 sepal length (cm) 150 non-null float64\n",
" 1 sepal width (cm) 150 non-null float64\n",
" 2 petal length (cm) 150 non-null float64\n",
" 3 petal width (cm) 150 non-null float64\n",
" 4 label 150 non-null int64 \n",
"dtypes: float64(4), int64(1)\n",
"memory usage: 6.0 KB\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"df['label'].value_counts()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "RJ6EnxywFQ4M",
"outputId": "ef77b276-971a-4ff3-ea22-e7dc3f89b359"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"label\n",
"0 50\n",
"1 50\n",
"2 50\n",
"Name: count, dtype: int64"
]
},
"metadata": {},
"execution_count": 6
}
]
},
{
"cell_type": "code",
"source": [
"import numpy as np\n",
"np.unique(iris.target_names) # 0: setosa, 1: versicolor, 2: virginica"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "nR5npuudGSV6",
"outputId": "53c123c6-394d-46f2-bb18-cbe28eac92dc"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array(['setosa', 'versicolor', 'virginica'], dtype='<U10')"
]
},
"metadata": {},
"execution_count": 7
}
]
},
{
"cell_type": "markdown",
"source": [
"# Data Processing"
],
"metadata": {
"id": "lb5YoeHDq4hl"
}
},
{
"cell_type": "code",
"source": [
"x_raw = iris.data\n",
"y_raw = iris.target\n",
"\n",
"print(f'{type(x_raw)=}:{x_raw.shape=}')\n",
"print(f'{type(y_raw)=}:{y_raw.shape=}')"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "HFn8uURBtCP5",
"outputId": "5149406e-32a9-4a6b-9b81-4c63f4af7409"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"type(x_raw)=<class 'numpy.ndarray'>:x_raw.shape=(150, 4)\n",
"type(y_raw)=<class 'numpy.ndarray'>:y_raw.shape=(150,)\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"iris.feature_names"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "1frbC4zpuCkL",
"outputId": "08deb9dd-5c57-450e-957f-e5d25eeded3c"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"['sepal length (cm)',\n",
" 'sepal width (cm)',\n",
" 'petal length (cm)',\n",
" 'petal width (cm)']"
]
},
"metadata": {},
"execution_count": 9
}
]
},
{
"cell_type": "code",
"source": [
"from torch.utils.data import Dataset\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"x_train, x_test, y_train, y_test = train_test_split(\n",
" x_raw, y_raw, test_size = .2,\n",
" stratify=y_raw,\n",
")\n",
"\n",
"x_train, x_val, y_train, y_val = train_test_split(\n",
" x_train, y_train, test_size = .2,\n",
" stratify=y_train,\n",
")\n",
"\n",
"print(len(x_train), len(x_val), len(x_test))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "DcTbgjUDuW1Q",
"outputId": "a1360d7e-45d7-4aaa-f9dd-a1e0a68a6ba2"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"96 24 30\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"import numpy as np\n",
"\n",
"test_r = np.unique(y_test , return_counts = True)\n",
"train_r = np.unique(y_train, return_counts = True)\n",
"val_r = np.unique(y_val, return_counts = True)\n",
"\n",
"print(\"test's versicolor ratio : \", np.round( test_r[1][1]/np.sum( test_r[1]),2))\n",
"print(\"train's versicolor ratio: \", np.round(train_r[1][1]/np.sum(train_r[1]),2))\n",
"print(\"val's versicolor ratio. : \", np.round( val_r[1][1]/np.sum( val_r[1]),2))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Sm5GtCYGu8Up",
"outputId": "8cfef970-9d7c-4147-dff1-aa597088b1c0"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"test's versicolor ratio : 0.33\n",
"train's versicolor ratio: 0.33\n",
"val's versicolor ratio. : 0.33\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"print(f' {x_test.shape=}\\n{x_train.shape=}\\n{ x_val.shape=}')\n",
"print(f' {y_test.shape=}\\n{y_train.shape=}\\n{ y_val.shape=}')"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "rYQVGnODvNsV",
"outputId": "641326ba-bbcc-46ed-b490-f027f49ea5f7"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" x_test.shape=(30, 4)\n",
"x_train.shape=(96, 4)\n",
" x_val.shape=(24, 4)\n",
" y_test.shape=(30,)\n",
"y_train.shape=(96,)\n",
" y_val.shape=(24,)\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"from sklearn.preprocessing import StandardScaler\n",
"\n",
"f_scaler = StandardScaler()\n",
"x_norm = f_scaler.fit_transform(x_train)"
],
"metadata": {
"id": "YySDUs0HS2u5"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"# Dataset and DataLoader"
],
"metadata": {
"id": "Jnwq_Fg8lELm"
}
},
{
"cell_type": "code",
"source": [
"from torch.utils.data import Dataset\n",
"import torch\n",
"import torch.nn as nn\n",
"\n",
"class IrisDataset (Dataset):\n",
"\n",
" def __init__(self, r_vec, r_label, transform):\n",
" self.data = torch.tensor(transform.transform(r_vec)).float()\n",
" self.label = torch.tensor(r_label).long()\n",
"\n",
" def __len__(self):\n",
" return len(self.data)\n",
"\n",
" def __getitem__(self, idx):\n",
"\n",
" return self.data[idx],self.label[idx]\n",
"\n",
"train_ds = IrisDataset(x_train,y_train,f_scaler)\n",
"val_ds = IrisDataset(x_val, y_val,f_scaler)\n",
"test_ds = IrisDataset(x_test, y_test,f_scaler)"
],
"metadata": {
"id": "xCk7YXHRyQ3f"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"next(iter(train_ds))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "pWDO_6s_K-ch",
"outputId": "28dbb47a-6d26-4fcd-924b-41618cdd259a"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(tensor([0.6833, 1.0169, 1.0851, 1.6177]), tensor(2))"
]
},
"metadata": {},
"execution_count": 15
}
]
},
{
"cell_type": "code",
"source": [
"from torch.utils.data import DataLoader\n",
"\n",
"train_loader = DataLoader(\n",
" dataset = train_ds,\n",
" batch_size = 32,\n",
" shuffle = True,\n",
")\n",
"valid_loader = DataLoader(\n",
" dataset = val_ds,\n",
" batch_size = 32,\n",
" shuffle = True,\n",
")\n",
"test_loader = DataLoader(\n",
" dataset = test_ds,\n",
" batch_size = 32,\n",
" shuffle = False,\n",
")"
],
"metadata": {
"id": "1JnWNey3Q-tO"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"# Train Loop"
],
"metadata": {
"id": "F2HehIUClKx0"
}
},
{
"cell_type": "code",
"source": [
"def train_loop (\n",
" n_epoch,\n",
" train_loader, val_loader,\n",
" model, optimizer, loss_fnc,\n",
" device = 'cpu',):\n",
"\n",
" log_hist = torch.zeros([0,3]).to(device)\n",
" for epoch in range(n_epoch):\n",
" # print(f'\\r{epoch:6>}', end='')\n",
"\n",
" model = model.to(device)\n",
" model.train()\n",
"\n",
" for x_tensor, y_tensor in train_loader:\n",
"\n",
" x_tensor = x_tensor.to(device)\n",
" y_tensor = y_tensor.to(device)\n",
"\n",
" y_pred = model(x_tensor)\n",
" # print(y_tensor.shape)\n",
" loss_train = loss_fnc(y_pred,y_tensor)\n",
"\n",
" if torch.isinf(loss_train):\n",
" print(f'Error: loss is infinity!')\n",
" break\n",
"\n",
" optimizer.zero_grad()\n",
" loss_train.backward()\n",
" optimizer.step()\n",
"\n",
" with torch.no_grad():\n",
" for x_tensor, y_tensor in val_loader:\n",
" x_tensor = x_tensor.to(device)\n",
" y_tensor = y_tensor.to(device)\n",
" model.eval()\n",
" pred = model(x_tensor)\n",
" loss_val = loss_fnc(pred, y_tensor)\n",
"\n",
"\n",
" if epoch % 200 == 0:\n",
" tmp = torch.tensor([epoch, loss_train.item(), loss_val.item()]).to(log_hist.device)\n",
" # print(tmp)\n",
" log_hist = torch.concat( (log_hist, tmp.reshape(1,-1)), dim=0 )\n",
" print(f'{epoch} Epoch / loss {loss_train.item():.4f} / val_loss {loss_val.item():.4f}')\n",
"\n",
" if epoch == n_epoch:\n",
" print(f'{epoch} Epoch / loss {loss_train.item():.4f} / val_loss {loss_val.item():.4f}')\n",
"\n",
" return model,log_hist\n"
],
"metadata": {
"id": "ANWVidl1LB8C"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"# Model"
],
"metadata": {
"id": "-xE9AeCXlNTm"
}
},
{
"cell_type": "code",
"source": [
"class SimpleModel(nn.Module):\n",
"\n",
" def __init__(self, n_feature, n_classes):\n",
" super().__init__()\n",
"\n",
" self.l0 = nn.Linear(n_feature, 16)\n",
" self.a0 = nn.ReLU()\n",
" self.l1 = nn.Linear(16,16)\n",
" self.a1 = nn.ReLU()\n",
" self.lf = nn.Linear(16,n_classes)\n",
" # self.out = nn.Softmax(dim=-1)\n",
"\n",
" def forward(self, x):\n",
" x = self.l0(x)\n",
" x = self.a0(x)\n",
" x = self.l1(x)\n",
" x = self.a1(x)\n",
" x = self.lf(x)\n",
" # x = self.out(x)\n",
"\n",
" return x"
],
"metadata": {
"id": "3jQjVqvBO7x1"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# input vector의 number of components확인.\n",
"n_features = x_raw.shape[-1]\n",
"print(f'{n_features =}')\n",
"# output vector의 number of components확인.\n",
"n_classes = len(np.unique(y_raw))\n",
"print(f'{n_classes =}')\n",
"\n",
"\n",
"# random한 input vector 5개에 대한\n",
"# 모델의 예측 결과를 확인하여\n",
"# 모델의 i/o 의 shape 확인.\n",
"model = SimpleModel(n_features, n_classes)\n",
"x = torch.randn( (5, n_features) )\n",
"print(f'{x.shape =}')\n",
"print(f'{model(x).shape=}')"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "2PyGzAoIP4XY",
"outputId": "c3847a1d-2904-4e5d-9e48-0164a0604622"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"n_features =4\n",
"n_classes =3\n",
"x.shape =torch.Size([5, 4])\n",
"model(x).shape=torch.Size([5, 3])\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"# Training"
],
"metadata": {
"id": "PoVUr8UrleVU"
}
},
{
"cell_type": "code",
"source": [
"# device 설정.\n",
"device = (\n",
" \"cuda\" if torch.cuda.is_available()\n",
" else \"mps\"\n",
" if torch.backends.mps.is_available()\n",
" else \"cpu\"\n",
" )\n",
"print(f\"{device=}\")\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "4_8JdhNbERd-",
"outputId": "6a727d9d-a8b3-4187-d055-bb20fb625e78"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"device='cpu'\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# number of epochs\n",
"n_epoch = 7000\n",
"# learning ratio\n",
"lr = 4e-4\n",
"\n",
"# loss function 설정\n",
"loss_fnc = nn.CrossEntropyLoss()\n",
"# 모델 생성 및 초기화\n",
"model = SimpleModel(n_features, n_classes)\n",
"# optimizer 생성 및 초기화\n",
"# optimizer = torch.optim.SGD(model.parameters(), lr=lr)\n",
"optimizer = torch.optim.Adam(model.parameters(), lr=lr) # recommanded\n",
"\n",
"m, h = train_loop (\n",
" n_epoch,\n",
" train_loader, valid_loader,\n",
" model, optimizer, loss_fnc,\n",
" device = device)\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "3ffpgj5jMbsZ",
"outputId": "7635d05a-a7f9-44ce-c2a3-ed84ae785501"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0 Epoch / loss 1.1006 / val_loss 1.1116\n",
"200 Epoch / loss 0.3397 / val_loss 0.3407\n",
"400 Epoch / loss 0.1005 / val_loss 0.0738\n",
"600 Epoch / loss 0.0817 / val_loss 0.0198\n",
"800 Epoch / loss 0.0367 / val_loss 0.0076\n",
"1000 Epoch / loss 0.0088 / val_loss 0.0031\n",
"1200 Epoch / loss 0.0354 / val_loss 0.0016\n",
"1400 Epoch / loss 0.0181 / val_loss 0.0010\n",
"1600 Epoch / loss 0.0008 / val_loss 0.0006\n",
"1800 Epoch / loss 0.0062 / val_loss 0.0004\n",
"2000 Epoch / loss 0.0005 / val_loss 0.0003\n",
"2200 Epoch / loss 0.0026 / val_loss 0.0002\n",
"2400 Epoch / loss 0.0008 / val_loss 0.0001\n",
"2600 Epoch / loss 0.0047 / val_loss 0.0001\n",
"2800 Epoch / loss 0.0023 / val_loss 0.0001\n",
"3000 Epoch / loss 0.0017 / val_loss 0.0000\n",
"3200 Epoch / loss 0.0006 / val_loss 0.0000\n",
"3400 Epoch / loss 0.0001 / val_loss 0.0000\n",
"3600 Epoch / loss 0.0007 / val_loss 0.0000\n",
"3800 Epoch / loss 0.0004 / val_loss 0.0000\n",
"4000 Epoch / loss 0.0000 / val_loss 0.0000\n",
"4200 Epoch / loss 0.0004 / val_loss 0.0000\n",
"4400 Epoch / loss 0.0002 / val_loss 0.0000\n",
"4600 Epoch / loss 0.0000 / val_loss 0.0000\n",
"4800 Epoch / loss 0.0000 / val_loss 0.0000\n",
"5000 Epoch / loss 0.0000 / val_loss 0.0000\n",
"5200 Epoch / loss 0.0000 / val_loss 0.0000\n",
"5400 Epoch / loss 0.0000 / val_loss 0.0000\n",
"5600 Epoch / loss 0.0000 / val_loss 0.0000\n",
"5800 Epoch / loss 0.0000 / val_loss 0.0000\n",
"6000 Epoch / loss 0.0000 / val_loss 0.0000\n",
"6200 Epoch / loss 0.0000 / val_loss 0.0000\n",
"6400 Epoch / loss 0.0000 / val_loss 0.0000\n",
"6600 Epoch / loss 0.0000 / val_loss 0.0000\n",
"6800 Epoch / loss 0.0000 / val_loss 0.0000\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"# Learning Curve"
],
"metadata": {
"id": "QdTtvBTyllHo"
}
},
{
"cell_type": "code",
"source": [
"h"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ZM1WKxeSItRM",
"outputId": "9f2ed918-668a-47d9-c939-5c2eaabd366c"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"tensor([[0.0000e+00, 1.1006e+00, 1.1116e+00],\n",
" [2.0000e+02, 3.3965e-01, 3.4072e-01],\n",
" [4.0000e+02, 1.0054e-01, 7.3833e-02],\n",
" [6.0000e+02, 8.1709e-02, 1.9839e-02],\n",
" [8.0000e+02, 3.6681e-02, 7.6313e-03],\n",
" [1.0000e+03, 8.8194e-03, 3.1158e-03],\n",
" [1.2000e+03, 3.5368e-02, 1.6438e-03],\n",
" [1.4000e+03, 1.8125e-02, 9.6418e-04],\n",
" [1.6000e+03, 7.6428e-04, 5.9564e-04],\n",
" [1.8000e+03, 6.1815e-03, 4.1257e-04],\n",
" [2.0000e+03, 4.8867e-04, 2.7939e-04],\n",
" [2.2000e+03, 2.5835e-03, 1.9565e-04],\n",
" [2.4000e+03, 8.2186e-04, 1.3476e-04],\n",
" [2.6000e+03, 4.7214e-03, 9.3336e-05],\n",
" [2.8000e+03, 2.2601e-03, 6.5094e-05],\n",
" [3.0000e+03, 1.7150e-03, 4.8414e-05],\n",
" [3.2000e+03, 6.3290e-04, 3.5402e-05],\n",
" [3.4000e+03, 1.4205e-04, 2.6710e-05],\n",
" [3.6000e+03, 7.0753e-04, 1.9487e-05],\n",
" [3.8000e+03, 3.9150e-04, 1.4536e-05],\n",
" [4.0000e+03, 1.4901e-06, 1.0757e-05],\n",
" [4.2000e+03, 4.2672e-04, 7.6883e-06],\n",
" [4.4000e+03, 1.9806e-04, 5.4783e-06],\n",
" [4.6000e+03, 2.7865e-06, 4.0033e-06],\n",
" [4.8000e+03, 1.6243e-05, 3.2583e-06],\n",
" [5.0000e+03, 4.2322e-05, 2.5133e-06],\n",
" [5.2000e+03, 2.8833e-06, 1.9272e-06],\n",
" [5.4000e+03, 4.0924e-05, 1.4355e-06],\n",
" [5.6000e+03, 3.2992e-05, 9.3380e-07],\n",
" [5.8000e+03, 6.8054e-06, 6.0598e-07],\n",
" [6.0000e+03, 1.1435e-05, 3.7253e-07],\n",
" [6.2000e+03, 1.0538e-05, 2.4338e-07],\n",
" [6.4000e+03, 4.8165e-06, 1.5398e-07],\n",
" [6.6000e+03, 1.1884e-06, 9.9341e-08],\n",
" [6.8000e+03, 2.2352e-08, 6.4572e-08]])"
]
},
"metadata": {},
"execution_count": 22
}
]
},
{
"cell_type": "code",
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"h = h.cpu()\n",
"h0 = h.detach().numpy()\n",
"print(h0.shape)\n",
"plt.plot(h0[:,0], h0[:,1], label='train')\n",
"plt.plot(h0[:,0], h0[:,2], label='valid')\n",
"plt.legend()\n",
"plt.grid()\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 448
},
"id": "2PbbyHveHWp0",
"outputId": "17d782de-00db-41b5-bd96-985f016aa317"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"(35, 3)\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAisAAAGdCAYAAADT1TPdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABHOUlEQVR4nO3deXhU9dk+8PvMPpNMFgzZIBg2QUQWQTAurZZABEvVt/pSoBXQ0qpwvWjqhlUR/WmsWoptqVQUsVWE1rq1IBIDSFUWRUCQTTYDgYQESGYmk8x2vr8/TjLJkG0mmcmZZO7Pdc2VmTPnnHnO45jcfM8mCSEEiIiIiKKURu0CiIiIiFrDsEJERERRjWGFiIiIohrDChEREUU1hhUiIiKKagwrREREFNUYVoiIiCiqMawQERFRVNOpXUAwZFnGqVOnYLVaIUmS2uUQERFREIQQsNvtyMzMhEbT/vGRLhFWTp06haysLLXLICIionY4ceIEevfu3e7lu0RYsVqtAJSNTUhICNt6PR4P1q9fjwkTJkCv14dtvV0Re6FgHxTsQwP2QsE+KNgHRbB9sNlsyMrK8v8db68uEVbqd/0kJCSEPaxYLBYkJCTE9JcOYC/qsQ8K9qEBe6FgHxTsgyLUPnT0EA4eYEtERERRjWGFiIiIohrDChEREUW1LnHMChERUbgJIeD1euHz+YJexuPxQKfToba2NqTlupv6Pni9Xuh0uohfVoRhhYiIYo7b7cbp06fhdDpDWk4IgfT0dJw4cSKmr/tV34djx44hLi4OGRkZMBgMEfs8hhUiIoopsizj2LFj0Gq1yMzMhMFgCDp4yLIMh8OB+Pj4Dl3krKur74PBYEBFRQWOHTuGgQMHRqwnDCtERBRT3G43ZFlGVlYWLBZLSMvKsgy32w2TyRTzYcXtdiMhIQEGgwHff/+9vy+RELudJiKimBbLYSOcOqOP/C9FREREUY1hhYiIiKIawwoREVEMys7OxuLFi9UuIyg8wJaIiKiLuP766zFixIiwhIwvv/wScXFxHS+qE8T0yIpm+18x7MQbQPkBtUshIiLqsPoL3QWjZ8+eIZ8NpZaYDivSvvfQt6II0rmjapdCREQqEkLA6fYG9ahx+4KeN5iHECKoGmfOnIlPP/0UL730EiRJgiRJWLFiBSRJwkcffYRRo0bBaDTis88+w5EjR3DzzTcjLS0N8fHxuPLKK/HJJ58ErO/C3UCSJOHVV1/FrbfeCovFgoEDB+LDDz8MZ5vbLbZ3Axmtyk+XTd06iIhIVTUeH4Y88bEqn73vqTxYDG3/OX7ppZdw6NAhDB06FE899RQA4NtvvwUAPPLII3jxxRfRr18/JCcn48SJE5g0aRKeeeYZGI1G/O1vf8PkyZNx8OBB9OnTp8XPWLhwIZ5//nm88MIL+NOf/oTp06fj+++/R48ePcKzse0U0yMrdmEGADjt51WuhIiIqHWJiYkwGAywWCxIT09Heno6tFotAOCpp57C+PHj0b9/f/To0QPDhw/Hr3/9awwdOhQDBw7E008/jf79+7c5UjJz5kxMnToVAwYMwLPPPguHw4Ht27d3xua1KqZHVrae8iIPQFl5ORLULoaIiFRj1mux76m8NueTZRl2mx3WBGvYLoZm1ms7vI7Ro0cHvHY4HHjyySexZs0anD59Gl6vFzU1NSguLm51PcOGDfM/j4uLQ0JCAs6cOdPh+joqpsOKVxcPuABRa1e7FCIiUpEkSUHtipFlGV6DFhaDLqqugHvhWT0PPPAACgsL8eKLL2LAgAEwm8247bbb4Ha7W12PXq8PeC1JEmRZDnu9oYrtsKJXjlkRtTxmhYiIop/BYIDP52tzvs8//xwzZ87ErbfeCkAZaTl+/HiEq4uc6ImFKpCN8QAAiQfYEhFRF5CdnY1t27bh+PHjqKioaHHUY+DAgXj33Xexa9cu7N69G9OmTYuKEZL2iumwAoNypIrW41C5ECIiorY98MAD0Gq1GDJkCHr27NniMSiLFi1CcnIyrr76akyePBl5eXm44oorOrna8Inp3UAak7IbSOfhMStERBT9LrnkEmzZsiVg2syZM5vMl52djQ0bNgRMmzNnTsDrC3cLNXe9l8rKynbVGW4xPbKiMScCAPTeapUrISIiopbEdFjRWZSwYvRxNxAREVG0iumwYqgLKybZqXIlRERE1JKYDivGuCQAgFk4gS58lDQREVF3FtNhxWRNAgBoIAA3dwURERFFo5gOKxZLPDyi7jLHLp4RREREFI1iOqxYzXo4oNzMUNRWqVwNERERNSe2w4pR57/zsquaYYWIiCgaxXRYsRi0sMMCAKi1n1e5GiIiosjKzs7G4sWL/a8lScL777/f4vzHjx+HJEnYtWtXxGtrTUxfwVaSJDjrdgPVVleqWwwREVEnO336NJKTk9Uuo00xHVYAwCkpIytuhhUiIoox6enpapcQlJjeDQQAtZIysuJx8pgVIiKKXq+88goyMzOb3D355ptvxp133okjR47g5ptvRlpaGuLj43HllVfik08+aXWdF+4G2r59O0aOHAmTyYTRo0dj586dkdiUkDGsaJSwItfYVK6EiIhUIwTgrg7u4XEGP28wj2ZuINic22+/HWfPnsXGjRv9086dO4d169Zh+vTpcDgcmDRpEoqKirBz507ceOONmDx5cot3Zr6Qw+HAj3/8YwwZMgQ7duzAk08+iQceeKBd7Qy3mN8N5NKYAZmnLhMRxTSPE3g2s83ZNACSwv3Zj54CDHFtzpacnIyJEydi5cqVGDduHADgnXfeQUpKCm644QZoNBoMHz7cP//TTz+N9957Dx9++CHmzp3b5vpXrlwJWZbx2muvwWQy4bLLLsPJkydxzz33tH/bwiTmR1bcdSMrvCgcERFFu+nTp+Nf//oXXC4XAOCtt97Cz372M2g0GjgcDjzwwAO49NJLkZSUhPj4eOzfvz/okZX9+/dj2LBhMJlM/mk5OTkR2Y5QxfzIilujHGArubgbiIgoZuktyghHG2RZhs1uR4LVCo0mTP/e11uCnnXy5MkQQmDNmjW48sor8d///hd/+MMfAAAPPPAACgsL8eKLL2LAgAEwm8247bbb4Ha7w1OnimI+rPi0ysiK1sN7AxERxSxJCmpXDGQZ0PuUecMVVkJgMpnwP//zP3jrrbdw+PBhDBo0CFdccQUA4PPPP8fMmTNx6623AlCOQTl+/HjQ67700kvx97//HbW1tf7Rla1bt4Z9G9oj5ncD+XRKWNEzrBARURcwffp0rFmzBsuXL8f06dP90wcOHIh3330Xu3btwu7duzFt2rQmZw61Ztq0aZAkCbNnz8a+ffuwdu1avPjii5HYhJDFfFiR60ZW9D6GFSIiin4/+tGP0KNHDxw8eBDTpk3zT1+0aBGSk5Nx9dVXY/LkycjLy/OPugQjPj4e//73v7Fnzx6MHDkSv/3tb/G73/0uEpsQspjfDSTqRlZMvmqVKyEiImqbRqPBqVNNj6/Jzs7Ghg0bAqbNmTMn4PWFu4XEBadNX3XVVU0urX/hPGqI+ZEVoVfCillmWCEiIopGIYeVzZs3Y/LkycjMzGzzBkj1Nm3ahCuuuAJGoxEDBgzAihUr2lFqZGjqwooRbsDb9Y+YJiIi6m5CDivV1dUYPnw4lixZEtT8x44dw0033YQbbrgBu3btwn333Ydf/vKX+Pjjj0MuNhI0+obzyXmtFSIiougT8jErEydOxMSJE4Oef+nSpejbty9+//vfA1BOjfrss8/whz/8AXl5eaF+fNgZdDo4hREWyQW4bEDcRWqXRERERI1E/ADbLVu2IDc3N2BaXl4e7rvvvhaXcblc/qvzAYDNplywzePxwOPxhK02j8cDsw6wwwwLXKixnYXO2jts6+9K6vsazv52ReyDgn1owF4oulMfPB4PhBCQZTmkU3uBhoNN65ePVRf2QQgBj8cDrVYbMF+4vi8RDyulpaVIS0sLmJaWlgabzYaamhqYzeYmyxQUFGDhwoVNpq9fvx4WS/BX+guGSQs4hBlpUiU++7QIzqSSsK6/qyksLFS7hKjAPijYhwbshaI79EGn0yE9PR12u73dV3e123nYAKD0weVyoaamBps3b4bX6w143+l0huVzovLU5fnz5yM/P9//2mazISsrCxMmTEBCQkLYPsfj8aCwsBAOSblq4WWD+qHnqElhW39XUt+L8ePHQ6/Xq12OatgHBfvQgL1QdKc++Hw+HD16FBqNJuS/KUII2O12WK1WSJIUoQqjX+M+eDwemM1mjBs3rsnISv2ekY6KeFhJT09HWVlZwLSysjIkJCQ0O6oCAEajEUajscl0vV4fkf9JajUWQAByrb3L/0/YUZHqcVfDPijYhwbshaI79EGv1yM5ORkVFRXQaDSwWCxBBw9ZluF2u+FyucJ3b6AuSJZluFwueDweVFRUIDk5OeAGiPXC9V2JeFjJycnB2rVrA6YVFhZGzZ0cAcCljQO8gNtZpXYpRETUCdLT0wEAZ86cCWk5IYT/EIZYH1mp70NycrK/n5ESclhxOBw4fPiw//WxY8ewa9cu9OjRA3369MH8+fNRUlKCv/3tbwCAu+++G3/+85/x0EMP4c4778SGDRvwj3/8A2vWrAnfVnSQWxcPeAEfwwoRUUyQJAkZGRlITU0N6SBQj8eDzZs34wc/+EGXH2HqiPo+jBs3rtkRlXALOax89dVXuOGGG/yv648tmTFjBlasWIHTp0+juLjY/37fvn2xZs0a3H///XjppZfQu3dvvPrqq1Fx2nI9jy4eACDXhmffGhERdQ1arbbJcRZtze/1emEymWI6rNT3IZTedUTIYeX6669v9T4BzV2d9vrrr8fOnTtD/ahO49NbAQCCYYWIiCjqxO7RQY0IgzKyIvEKtkRERFGHYQUATMqpa1o3wwoREVG0YVgBAGNdWPEwrBAREUUbhhUAWrMSVvReh8qVEBER0YUYVgDozYkAAKOvWuVKiIiI6EIMKwAMcUpYMckMK0RERNGGYQWAMT4JAGARTqCV07KJiIio8zGsADDVhRUtZMATnjtEEhERUXgwrACIi0+AT9Td44EXhiMiIooqDCsArCY9HFDuAO2r4f2BiIiIognDCoB4kx52WAAAtdWV6hZDREREARhWABh1GjjqwkqN/bzK1RAREVFjDCt1aiQlrLgcleoWQkRERAEYVurUapWbGbq5G4iIiCiqMKzUcWvjAADeGp4NREREFE0YVuq4dcrIis9ZqW4hREREFIBhpY5Pr4QVweusEBERRRWGlTqyQbnzMlx2dQshIiKiAAwr9YxWAIDGzZEVIiKiaMKwUs+kjKxoPQ6VCyEiIqLGGFbqaM2JAAA9wwoREVFUYVipo7MoYcXgq1a5EiIiImqMYaWOPk4JK0YfR1aIiIiiCcNKHUPdyIpF5sgKERFRNGFYqWOy9lB+wgX4vCpXQ0RERPUYVurEWZMaXrh4+jIREVG0YFipY42LQ63QAwAEwwoREVHUYFipE2/SwQ4LAMDlqFK5GiIiIqrHsFInzqCFQ5gBADX28ypXQ0RERPUYVupIkoRqTRwAoMbBsEJERBQtGFYaqdUou4Hc1dwNREREFC0YVhpxaeMBAF5npbqFEBERkR/DSiMerbIbyFvDkRUiIqJowbDSiEdvBQDINTx1mYiIKFowrDTiMyhhBbUMK0RERNGCYaURYVSOWZHcdpUrISIionoMK40ZlZsZahhWiIiIogbDSiMaUwIAQOdxqFwJERER1WNYaURnVkZW9F6GFSIiomjBsNKIPk4JKyYfwwoREVG0YFhpRG9JAgCYZKe6hRAREZEfw0ojpvgkAIBFVANCqFsMERERAWBYCWC2JgMAdPAB3lqVqyEiIiKAYSVAnDURspCUF7wwHBERUVRgWGnEajbAARMAwMP7AxEREUUFhpVG4o062GEBADht51WuhoiIiACGlQA6rQZOmAEAtfZzKldDREREAMNKE05NHADAVc3dQERERNGAYeUCtRrlZobu6kp1CyEiIiIA7QwrS5YsQXZ2NkwmE8aOHYvt27e3Ov/ixYsxaNAgmM1mZGVl4f7770dtbXSeGuzWKSMrXh5gS0REFBVCDiurV69Gfn4+FixYgK+//hrDhw9HXl4ezpw50+z8K1euxCOPPIIFCxZg//79eO2117B69Wo8+uijHS4+Ejw6ZWTFx7BCREQUFUIOK4sWLcLs2bMxa9YsDBkyBEuXLoXFYsHy5cubnf+LL77ANddcg2nTpiE7OxsTJkzA1KlT2xyNUYustwIARK1d5UqIiIgICDGsuN1u7NixA7m5uQ0r0GiQm5uLLVu2NLvM1VdfjR07dvjDydGjR7F27VpMmjSpA2VHjs+ghBXJxYvCERERRQNdKDNXVFTA5/MhLS0tYHpaWhoOHDjQ7DLTpk1DRUUFrr32Wggh4PV6cffdd7e6G8jlcsHlcvlf22xKcPB4PPB4PKGU3Kr6dTVepzAou4Ekly2snxXtmutFLGIfFOxDA/ZCwT4o2AdFsH0IV59CCivtsWnTJjz77LP4y1/+grFjx+Lw4cOYN28enn76aTz++OPNLlNQUICFCxc2mb5+/XpYLJaw11hYWOh/Xlmp3HHZYyvH2rVrw/5Z0a5xL2IZ+6BgHxqwFwr2QcE+KNrqg9PpDMvnSEIEf3tht9sNi8WCd955B7fccot/+owZM1BZWYkPPvigyTLXXXcdrrrqKrzwwgv+aW+++SZ+9atfweFwQKNpuiequZGVrKwsVFRUICEhIdhy2+TxeFBYWIjx48dDr9cDADZ+uAIT9jyAo8YhyHpgc9g+K9o114tYxD4o2IcG7IWCfVCwD4pg+2Cz2ZCSkoKqqqoO/f0OaWTFYDBg1KhRKCoq8ocVWZZRVFSEuXPnNruM0+lsEki0Wi0AoKWcZDQaYTQam0zX6/UR+XI0Xq8hTrnzslGujskvYqR63NWwDwr2oQF7oWAfFOyDoq0+hKtHIe8Gys/Px4wZMzB69GiMGTMGixcvRnV1NWbNmgUAuOOOO9CrVy8UFBQAACZPnoxFixZh5MiR/t1Ajz/+OCZPnuwPLdHEEJcIADD5HCpXQkREREA7wsqUKVNQXl6OJ554AqWlpRgxYgTWrVvnP+i2uLg4YCTlsccegyRJeOyxx1BSUoKePXti8uTJeOaZZ8K3FWFkjEsCAJjk8OxnIyIioo5p1wG2c+fObXG3z6ZNmwI/QKfDggULsGDBgvZ8VKczWZXdQHGoAWQfoIm+0R8iIqJYwnsDXSCuLqwAAFy8MBwREZHaGFYuEBcXD5dQBpzkWl4YjoiISG0MKxewmnRwwAwAcNrPq1wNERERMaxcwKTXwgHlwnM1jkp1iyEiIiKGleY4pTgAgIsjK0RERKpjWGlGrUYZWXFVV6lcCRERETGsNKNWq9zM0OusVLcQIiIiYlhpjken7Aby1nBkhYiISG0MK83w6q0AALmGpy4TERGpjWGlGT6DshsILoYVIiIitTGsNMeg3MZacvMKtkRERGpjWGmOSQkrWoYVIiIi1TGsNENTF1Z0HofKlRARERHDSjO05kQAgMHLsEJERKQ2hpVm6C1KWDH6GFaIiIjUxrDSDEN8EgDAJDvVLYSIiIgYVppjqgsrFlGtbiFERETEsNIcszUZAGCAF/C6VK6GiIgotjGsNCPOmuR/Lmp5yX0iIiI1Maw0w2oxwSFMAACXg2GFiIhITQwrzYgzaGGHBQDgtJ9TuRoiIqLYxrDSDEmS4JTMAIAaR6W6xRAREcU4hpUW1EhxAAA3wwoREZGqGFZa4NLWhRVnpbqFEBERxTiGlRa4dPEAAK+TB9gSERGpiWGlBZ66sCLXMKwQERGpiWGlBT69FQAgau0qV0JERBTbGFZaIBuUsAKXTd1CiIiIYhzDSkuMSljRuHnnZSIiIjUxrLRAMicCALQejqwQERGpiWGlBVpTAgDA4OXIChERkZoYVlqgsygjKwZvtcqVEBERxTaGlRYY4pIAACaZYYWIiEhNDCstMNaFFbPsVLcQIiKiGMew0gKTNQkAYIETkGV1iyEiIophDCstiLMmAwA0EICHu4KIiIjUwrDSgvh4KzxCCwDw8GaGREREqmFYaUG8SQ8HzAAAp+28ytUQERHFLoaVFui0GjhgAQDU2CvVLYaIiCiGMay0winFAQBqHRxZISIiUgvDSitqtcrIiru6SuVKiIiIYhfDSitc2ngAPMCWiIhITQwrrfDolN1AvhrezJCIiEgtDCut8OqtAABRy91AREREamFYaYWsV3YDoZYjK0RERGphWGmFMCYAACS3XeVKiIiIYhfDSmtMSljRMKwQERGphmGlFZq6sKL3OlSuhIiIKHYxrLRCa0kEwLBCRESkJoaVVhjqworRx7suExERqaVdYWXJkiXIzs6GyWTC2LFjsX379lbnr6ysxJw5c5CRkQGj0YhLLrkEa9eubVfBnckQlwwAMMsMK0RERGrRhbrA6tWrkZ+fj6VLl2Ls2LFYvHgx8vLycPDgQaSmpjaZ3+12Y/z48UhNTcU777yDXr164fvvv0dSUlI46o8oU7wyshInnCpXQkREFLtCDiuLFi3C7NmzMWvWLADA0qVLsWbNGixfvhyPPPJIk/mXL1+Oc+fO4YsvvoBerwcAZGdnd6zqTmK2KiMrRrgBrxvQGVSuiIiIKPaEFFbcbjd27NiB+fPn+6dpNBrk5uZiy5YtzS7z4YcfIicnB3PmzMEHH3yAnj17Ytq0aXj44Yeh1WqbXcblcsHlcvlf22zKRdk8Hg88Hk8oJbeqfl0trdNosTbUZD8LTXxK2D472rTVi1jBPijYhwbshYJ9ULAPimD7EK4+hRRWKioq4PP5kJaWFjA9LS0NBw4caHaZo0ePYsOGDZg+fTrWrl2Lw4cP495774XH48GCBQuaXaagoAALFy5sMn39+vWwWCyhlByUwsLCZqe7fcBNwgiL5ML6df+BbGm6m6u7aakXsYZ9ULAPDdgLBfugYB8UbfXB6QzPYRQh7wYKlSzLSE1NxSuvvAKtVotRo0ahpKQEL7zwQothZf78+cjPz/e/ttlsyMrKwoQJE5CQkBC22jweDwoLCzF+/Hj/LqrGhBA4v9sMC1wYPWIoUgaMDttnR5u2ehEr2AcF+9CAvVCwDwr2QRFsH+r3jHRUSGElJSUFWq0WZWVlAdPLysqQnp7e7DIZGRnQ6/UBu3wuvfRSlJaWwu12w2BoehyI0WiE0WhsMl2v10fky9Haep2SBUAlPDX2mPhiRqrHXQ37oGAfGrAXCvZBwT4o2upDuHoU0qnLBoMBo0aNQlFRkX+aLMsoKipCTk5Os8tcc801OHz4MGRZ9k87dOgQMjIymg0q0aZGEwcAcDnOq1wJERFRbAr5Oiv5+flYtmwZ3njjDezfvx/33HMPqqur/WcH3XHHHQEH4N5zzz04d+4c5s2bh0OHDmHNmjV49tlnMWfOnPBtRQS5tEpY8VRXqVwJERFRbAr5mJUpU6agvLwcTzzxBEpLSzFixAisW7fOf9BtcXExNJqGDJSVlYWPP/4Y999/P4YNG4ZevXph3rx5ePjhh8O3FRHk1sYDHsBby7BCRESkhnYdYDt37lzMnTu32fc2bdrUZFpOTg62bt3ano9SnUcfD9QCcg3DChERkRp4b6A2+PTKtVZErV3lSoiIiGITw0obhEEJK5IrPKdfERERUWgYVtogjEpY0bg5skJERKQGhpU2SCblZoZaj0PlSoiIiGITw0obtGblirl6D0dWiIiI1MCw0ga9JQkAYPRVq1sIERFRjGJYaYM+TtkNZJIZVoiIiNTAsNIGU3wSAMAsh+fOkURERBQahpU2mKzJAAALnIAQKldDREQUexhW2hBXF1Z0kCHc3BVERETU2RhW2hAXnwCfkAAAtY5KdYshIiKKQQwrbYgz6uGAGQDgtJ9XuRoiIqLYw7DSBo1GgkOKAwDUMKwQERF1OoaVIDjrwoqLu4GIiIg6HcNKEFwaCwDA7axUtxAiIqIYxLASBJc2HgDgra5SuRIiIqLYw7ASBI9O2Q3kq7GpXAkREVHsYVgJgldvBQDItRxZISIi6mwMK0HwGZTdQMLFOy8TERF1NoaVIAhjAgBA4+ZuICIios7GsBIEjUkJK1o3R1aIiIg6G8NKEDRmJazoPA6VKyEiIoo9DCtB0JoTAQAGL8MKERFRZ2NYCYLekgQAMMq86zIREVFnY1gJgiEuCQBgZlghIiLqdAwrQTBZld1AFlGjciVERESxh2ElCHHWHgAAC2oBn1flaoiIiGILw0oQLNZk/3NPDa9iS0RE1JkYVoIQH2dBrdADAJy28ypXQ0REFFsYVoKg12pghwUAwwoREVFnY1gJUo2khJUaB8MKERFRZ2JYCZJTEwcAcFVXqlsIERFRjGFYCZJLq4QVr5M3MyQiIupMDCtBcuviAQBeZ6W6hRAREcUYhpUgeevCilzLU5eJiIg6E8NKkHwGJayIWrvKlRAREcUWhpUgyYYEAIDk4jErREREnYlhJVhGKwBA43GoXAgREVFsYVgJksas3MxQ5+ZuICIios7EsBIkrUnZDaT3cmSFiIioMzGsBElnSQIAGH0MK0RERJ2JYSVIhjhlN5DJV61yJURERLGFYSVIxvhkAIBZOFWuhIiIKLYwrATJZE0CAMQJJyCEusUQERHFEIaVIMVZlZEVveSD7K5RuRoiIqLYwbASJGtCEmQhAQCc9nMqV0NERBQ7GFaCZNTrUA0TAKDaXqluMURERDGEYSVIkiTBIVkAALX28ypXQ0REFDsYVkJQI8UBAGodDCtERESdpV1hZcmSJcjOzobJZMLYsWOxffv2oJZbtWoVJEnCLbfc0p6PVV2tVgkrbmeVypUQERHFjpDDyurVq5Gfn48FCxbg66+/xvDhw5GXl4czZ860utzx48fxwAMP4Lrrrmt3sWpzaeMBAF6GFSIiok4TclhZtGgRZs+ejVmzZmHIkCFYunQpLBYLli9f3uIyPp8P06dPx8KFC9GvX78OFawmj04ZWfHVMKwQERF1lpDCitvtxo4dO5Cbm9uwAo0Gubm52LJlS4vLPfXUU0hNTcVdd93V/kqjgE9vBQCIGpvKlRAREcUOXSgzV1RUwOfzIS0tLWB6WloaDhw40Owyn332GV577TXs2rUr6M9xuVxwuVz+1zabEg48Hg88Hk8oJbeqfl3BrtOnV0ZWRG1VWOuIBqH2ortiHxTsQwP2QsE+KNgHRbB9CFefQgorobLb7fjFL36BZcuWISUlJejlCgoKsHDhwibT169fD4vFEs4SAQCFhYVBzSccXgBA9bnTWLt2bdjriAbB9qK7Yx8U7EMD9kLBPijYB0VbfXA6w3M/vZDCSkpKCrRaLcrKygKml5WVIT09vcn8R44cwfHjxzF58mT/NFmWlQ/W6XDw4EH079+/yXLz589Hfn6+/7XNZkNWVhYmTJiAhISEUEpulcfjQWFhIcaPHw+9Xt/m/Fttu4EjQJJR4NpJk8JWRzQItRfdFfugYB8asBcK9kHBPiiC7UP9npGOCimsGAwGjBo1CkVFRf7Tj2VZRlFREebOndtk/sGDB2PPnj0B0x577DHY7Xa89NJLyMrKavZzjEYjjEZjk+l6vT4iX45g16u1JCnze53d9ksaqR53NeyDgn1owF4o2AcF+6Boqw/h6lHIu4Hy8/MxY8YMjB49GmPGjMHixYtRXV2NWbNmAQDuuOMO9OrVCwUFBTCZTBg6dGjA8klJSQDQZHpXoKsLKwavXd1CiIiIYkjIYWXKlCkoLy/HE088gdLSUowYMQLr1q3zH3RbXFwMjaZ7XhhXb0kEABjl8OyDIyIiora16wDbuXPnNrvbBwA2bdrU6rIrVqxoz0dGBVN8EgDALFerWwgREVEM6Z5DIBFijEsCAFgER1aIiIg6C8NKCCwJyQCAeNRA+LwqV0NERBQbGFZCEFcXVgDA5eRBtkRERJ2BYSUEcZZ4uIRymI/DdlblaoiIiGIDw0oINBoJDihX0K2xn1e5GiIiotjAsBKiGkkJK7WOSnULISIiihEMKyGq0Sg3M3QzrBAREXUKhpUQubRKWPE4q1SuhIiIKDYwrITIrYsHAHgZVoiIiDoFw0qIvHolrPhqw3MnSSIiImodw0qIfHqr8sTFsEJERNQZGFZC5DMpNzPU1pxTuRIiIqLYwLASIqlHfwBAnP2oypUQERHFBoaVEPXIvhwAkOY6rm4hREREMYJhJURZl4wAAPSADefOlKhbDBERUQxgWAlRvDURp6VUAMDJQ7tVroaIiKj7Y1hphwpzXwCA7cQelSshIiLq/hhW2sGdfAkAQJw5oHIlRERE3R/DSjsYM4cAAOLtR1SuhIiIqPtjWGmHnn2HAwAyPd/D7ZVVroaIiKh7Y1hph9R+dacvS5U4euKkytUQERF1bwwr7SCZElCh6QkAKD28S91iiIiIujmGlXY6H9cPAFB98luVKyEiIureGFbayXeRckaQ5uxBlSshIiLq3hhW2imu92UAgCTHUQghVK6GiIio+2JYaafU/soZQReLEzhjd6lcDRERUffFsNJOxvRLAQCZ0jkcLOY9goiIiCKFYaW9zMmo0l4EADhz9BuViyEiIuq+GFY6wGYdAACoPbVf5UqIiIi6L4aVjkgdBAAwnDukciFERETdF8NKByRkKVey7VlzDLUen8rVEBERdU8MKx2QkKWcvjxAKsGhMrvK1RAREXVPDCsdIKUqZwRlacrx3YlSlashIiLqnhhWOsLSAw5dMgDg7PG9KhdDRETUPTGsdJAzUTkjyFPKM4KIiIgigWGlg3Rpyq4gU9V3vOw+ERFRBDCsdJC1z1AAQB/fCZyqqlW5GiIiou6HYaWD9HUjKwOlEuw/ZVO5GiIiou6HYaWjeg4GAPSRzuDQyTMqF0NERNT9MKx0VFxP1OqToJEEKk/uU7saIiKibodhpaMkCa6kgQAAueyAysUQERF1PwwrYWDIVI5bSao+Cqfbq3I1RERE3QvDShiYMxouu3+glJfdJyIiCieGlXDoqdx9eaB0EvtP84wgIiKicGJYCYe6M4IulspwqKRC5WKIiIi6F4aVcLCmw6OzQifJsJ3kQbZEREThxLASDpIE70WXAAA0FQchy7zsPhERUbgwrISJMWMIAKCPfAInzjtVroaIiKj7YFgJE02qctzKAB5kS0REFFYMK+FSF1YGSiXYd5qnLxMREYVLu8LKkiVLkJ2dDZPJhLFjx2L79u0tzrts2TJcd911SE5ORnJyMnJzc1udv8uqOyOor1SKQ6fOqVwMERFR9xFyWFm9ejXy8/OxYMECfP311xg+fDjy8vJw5kzzN/HbtGkTpk6dio0bN2LLli3IysrChAkTUFJS0uHio0pCL/h0cdBLPthPHVS7GiIiom4j5LCyaNEizJ49G7NmzcKQIUOwdOlSWCwWLF++vNn533rrLdx7770YMWIEBg8ejFdffRWyLKOoqKjDxUcVSYKouzic1X4UtlqPygURERF1D7pQZna73dixYwfmz5/vn6bRaJCbm4stW7YEtQ6n0wmPx4MePXq0OI/L5YLL5fK/ttmUA1Y9Hg88nvCFgPp1hWud2p6DgNNfY6B0EntPnMeV2clhWW9nCHcvuir2QcE+NGAvFOyDgn1QBNuHcPUppLBSUVEBn8+HtLS0gOlpaWk4cCC4i6E9/PDDyMzMRG5ubovzFBQUYOHChU2mr1+/HhaLJZSSg1JYWBiW9QyokHEZgIGaEvyraCvKM7re9VbC1Yuujn1QsA8N2AsF+6BgHxRt9cHpDM+lPEIKKx313HPPYdWqVdi0aRNMJlOL882fPx/5+fn+1zabzX+sS0JCQtjq8Xg8KCwsxPjx46HX6zu8Puk7HfCP1RgoleCzi/pg0qTLwlBl5wh3L7oq9kHBPjRgLxTsg4J9UATbh/o9Ix0VUlhJSUmBVqtFWVlZwPSysjKkp6e3uuyLL76I5557Dp988gmGDRvW6rxGoxFGo7HJdL1eH5EvR9jWW3f35X7SaXxXWtUlv8iR6nFXwz4o2IcG7IWCfVCwD4q2+hCuHoV0gK3BYMCoUaMCDo6tP1g2JyenxeWef/55PP3001i3bh1Gjx7d/mqjXWIfyDoTjJIHNWcOw8fL7hMREXVYyGcD5efnY9myZXjjjTewf/9+3HPPPaiursasWbMAAHfccUfAAbi/+93v8Pjjj2P58uXIzs5GaWkpSktL4XA4wrcV0UKjgVR3RlAf3wkcq6hWuSAiIqKuL+RjVqZMmYLy8nI88cQTKC0txYgRI7Bu3Tr/QbfFxcXQaBoy0Msvvwy3243bbrstYD0LFizAk08+2bHqo5DU81Lg9G4MkEqw/7QNA1Lj1S6JiIioS2vXAbZz587F3Llzm31v06ZNAa+PHz/eno/ouupGVgZqlLAyeXimygURERF1bbw3ULj1bLhHEG9oSERE1HEMK+FWN7IyQCrBwVOV6tZCRETUDTCshFtyNoTWCJPkgdZxEuer3WpXRERE1KUxrISbRgsp5RIA3BVEREQUDgwrkVB/kK1Ugn0MK0RERB3CsBIJ9QfZakpwoNSucjFERERdG8NKJPgPsj3J3UBEREQdxLASCY1OX/6uzA6PT1a5ICIioq6LYSUSevSF0OgRJ7nQ03cGR8t52X0iIqL2YliJBK0eUspAAA1XsiUiIqL2YViJlEYXh2NYISIiaj+GlUhpdNwKT18mIiJqP4aVSPHf0PAk9p/m6ctERETtxbASKXUjKwOkElQ4alFud6lcEBERUdfEsBIpPfoDkhYJUg3ScJ7HrRAREbUTw0qk6AzARf0B8IwgIiKijmBYiST/PYJ4JVsiIqL2YliJpEZnBPEgWyIiovZhWImk+oNsNSU4Uu6Ay+tTuSAiIqKuh2ElkurCyiDNSXhlGd+VOVQuiIiIqOthWImkiwYAkgaJqEZPVPG4FSIionZgWIkkvQlI7gtA2RXE41aIiIhCx7ASaf6DbE9i/b5SfPxtKXyyULkoIiKiroNhJdLqTl8erD2Fk+dr8Ou/78APX9iIVzYfQZXTo3JxRERE0Y9hJdLqRlZ+2seBOTf0R7JFj5Pna/Ds2gMYW/AJ5r+7BwdLuXuIiIioJQwrkVY3smI89x0ezBuMLfPH4fnbhuHSjATUemS8vb0YeYs3Y9qyrVjPXURERERN6NQuoNtLuQSABDgrgOoKmOJS8L+js3D7qN748vh5rPjiGNbtLcUXR87iiyNn0TvZjBk52fjf0VlItOjVrp6IiEh1DCuRZrAASX2Ayu+B8oNAXAoAQJIkjOnbA2P69kBJZQ3e3Po93t5ejJPna/DM2v1YVHgIt17RC3dd2xf9e8arvBFERETq4W6gzlB33ArKDzT7dq8kMx6+cTC2zh+H3/30cgxOt6LG48PKbcWY+NJ/sflQeScWS0REFF0YVjpD3XErKD/Y6mwmvRZTruyDj+Zdh1W/ugpX9esBt1fG7L99hS+OVHRCoURERNGHYaUzpF6q/Dy9O6jZJUnCVf0uwht3jsGPBqfC5ZVx14qv8OXxcxEskoiIKDoxrHSG3mMASMCJrcCXrwW9mFGnxV+mX4HrBqagxuPDrNe/xM7i85Grk4iIKAoxrHSGlAFA7pPK848eAo5/HvSiJr0Wr/xiNHL6XQSHy4s7lm/HnpNVkamTiIgoCjGsdJZr5gFDbwNkL/CPO4DK4qAXNRu0eG3maFyZnQx7rRc/f20b9p3iTRGJiCg2MKx0FkkCfvInIGO4cs2VVdMAtzPoxS0GHV6fNQYj+yShqsaDn7+2DYfKeOVbIiLq/hhWOpPBAkx5C4jrCZTuAT6YA4jgr1gbb9RhxawxuLxXIs5VuzFt2TYcKXdEsGAiIiL1Max0tqQs4H//Dmj0wLfvAp/9IaTFE816/P2uMbg0IwEVDhemLduK4xXVESqWiIhIfQwrarg4B5j0gvK86Cng0MchLZ5kMeDNu8bgkrR4lNmUwHLiXPC7lIiIiLoShhW1jJ4FjL4LgAD+9Uug/FBIi18Ub8Rbv7wK/XrG4VRVLaa9uhWnKmsiUysREZGKGFbUdONzwMXXAC4bsGoqUFMZ0uI9rUa8PfsqZF9kwYlzNZi2bCvKbLWRqZWIiEglDCtq0hmA298AErOAs4eVERbZF9Iq0hJMWDn7KvRONuP4WSemLduKcrsrQgUTERF1PoYVtcX3BH72FqAzA4cLlWNYQpSZZMbbs69CZqIJR8qr8fNXt6H4bOSPYSmtqsVZB4MRERFFFsNKNMgYDtyyRHn++WLgm3+GvIqsHhasnH0V0hKMOFhmx4TFn+Kvnx6B1yeHt1YAFQ4XfvOP3biqoAhjni3Cr/72FTYeOAOfHPxp2ERERMFiWIkWQ38KXJuvPP9wLnBqZ8iryE6Jwzt3X42r+1+EWo+Mgo8O4Cd//jxsl+f3yQJ/33IcP3pxE/719Un/tPX7yjBrxZe49ncbsKjwEE6e55lJREQUPgwr0eRHjwED8wBvLbBqOuA4E/IqsnpY8NYvx+KF24Yh0azHvtM23LzkM/y//+yD0+1td2m7TlTiliWf4/EPvoWt1ovLMhPw3r1X4+P7foA7r+mLJIsep6tq8cei73Dd8xtxx/Lt+GjPabi94R/ZISKi2KJTuwBqRKMFfroMWDYOOPsdsPoXwIx/KwfihkCSJNw+Ogs3DE7FU//ehw93n8Krnx3DR3tL8f9uHYobBqUGva7z1W48//FBrPqyGEIAVpMOD+YNwvSxF0OrkQAAT0wegoduHIT1+8qwansxvjhyFpsPlWPzoXKkxBvw0yt6Y8qVWejXMz6k7SAiIgI4shJ9TInA1LcBYyJwYivw3q+VXUJy6CMUKfFG/HHqSLw+60r0SjKjpLIGs17/Ev/39k5UtHFgrCwLrNpejB/9fhPe3q4Elf+5ohc2/OZ63JGT7Q8q/rL1WvxkeCZWzr4Kmx64Hvde3x89rUZUONz46+aj+NHvP8WUv27BeztPotYT2hlPREQU2ziyEo1SBgK3vQa8dbtySf5v3wUsKUD/G4D+44D+PwKsaUGv7oZBqVh//w/wh8JDWP75MXy4+xQ+PVSO3950KW4f1RuSFBg89pZU4fEP9mJncSUAYFCaFU/fMhRj+vYI6vOyU+Lw0I2Dcf/4S7DxwBms+vIENh08g23HzmHbsXNY8MG3+J8reuNnY7IwOD0h6O0gIqLYxLASrQaOB6b9A9ixAji2WblT855/Kg8ASL9cCS4DxgFZV7W5qyjOqMNjPx6Cn4zIxCP/2oN9p2146J1v8P7OEjx76+XolWiA0ws89Z/9eGv7CcgCiDNocf/4SzDj6mzotaEPwum1Gky4LB0TLkvH6aoa/POrk1j95QmUVNZgxRfHseKL4xjZJwlTr+yDHw/PgMXAryMRETXVrt1AS5YsQXZ2NkwmE8aOHYvt27e3Ov8///lPDB48GCaTCZdffjnWrl3brmJjziUTgKkrgYePATPXKmcLZQxX3ivdo5zm/MZk4Pm+wMqfAduXAWePtLrKYb2T8OHcazB/4mCY9Bp8ceQs8hZvxsL/7Mczu7T4+zYlqPx4WAaKfnM9fnldv3YFlQtlJJrxf+MGYvNDN+CNO8dg4tB06DQSdhZX4qF/fYMxzxTh0ff2YG9JeM5cIiKi7iPkf8quXr0a+fn5WLp0KcaOHYvFixcjLy8PBw8eRGpq0wM3v/jiC0ydOhUFBQX48Y9/jJUrV+KWW27B119/jaFDh4ZlI7o9rR7IvkZ55C4AHOXA0Y3A4U+AIxuA6nLg0EfKAwASegNJfYCEDMCaAVjT634qz3XWDPz6h/0xcWgGfvv+Hvz3uwq8ue0EAAn9Uix4+pbLcc2AlMhsikbCDy/piR9e0hPldhfe2XESq78sxvGzTqzcVoyV24oxtFcCfnZlH9w8IhNWkz6k9dtqPSg5X4OT52tQaqvFRXEGZCVbkNXDjESzvskuLyIiin4hh5VFixZh9uzZmDVrFgBg6dKlWLNmDZYvX45HHnmkyfwvvfQSbrzxRjz44IMAgKeffhqFhYX485//jKVLl3aw/BgV3xMY9r/KQ5aBsj3A4SLlcWIrYDupPFpjSkQfawb+Zs1A8cAEfFlhgEED5F05FMbzR4CdJkBnAvRmQGdUrrCrr5uma/SeVg9odMpD0gKa4EdhelqNuOf6/vj1D/ph69GzePvLE/h4byn2ltjwWMlePLNmPyYPz8DPxvTByKwkAEBVjQcn68LIyfNOlFTW+F+XnHfCVtvy6dlWow69e1jQp4e5LsAoISYr2YLeyRaYDdoWlxVCwOWV4XT7UO3yotrtRbXLB6fbi2qXF15ZwKzXwmzQ+n9a9DqYDBqY9VpYDLomByXX8/pknHO6UWF3o8Lhwtlql/95ucOFCocbZx0uVDhcOF/tgV4rwWrSI96kQ7xRB6tJeSjP9RdM08Nq0sGo00CrkaDRSNBKErSahoem/rUkQaMBdBoNZJ8XDg9gr/UiTtJAr9FA00L9RESRJgkhgr7sqNvthsViwTvvvINbbrnFP33GjBmorKzEBx980GSZPn36ID8/H/fdd59/2oIFC/D+++9j9+7dzX6Oy+WCy9VwtorNZkNWVhYqKiqQkBC+AzI9Hg8KCwsxfvx46PWh/Qs+arnskM58C9hPQ7KXAo5SSPbTgL0UkqNU+emJ3EXbhKRpFF4aPddoA6dLGmVa/XNoAEmCFxqcd3pRXu1FjVdAhgQZGui1GnhlwCsDAoCAdMGjYZpOq4FJr4VBp4XbJ+D0yHB75YD5ADR6rrw26DQw6XXwej3Q6PTwyspF7zyygNen1FK/nKL+dd3PRv8n1U9r/FyjQV1A0ECnkSBJQK1XKLWJ+nmbExgSBJqGhguXu3Ce5pYJRuP1aqT6sFP3vO61RoI/9Ggk5dR5SZKUzvp/1j0gNX0OQEgShCwg132oLITy3yfguYAQddPqKpOgrB9SQ5carxvNTpP8ryEp+8IDptetq35+IQTsdjvirValJwL+2kR9bY3rq5+p0YcH1tZQsH+6/30Jjd5ueK/JvIHLh1OLfxDq+mC1WtG4uR2toeU/QJ0TjkP9FAEBu80Oa4IVUifVGLJ2ltU7736kX3xJUPMG+/fTZrMhJSUFVVVVHfr7HdLISkVFBXw+H9LSAs9ESUtLw4EDB5pdprS0tNn5S0tLW/ycgoICLFy4sMn09evXw2KxhFJyUAoLC8O+TvUZAVysPAwALqp7CAGdXAOT5zzM7vMweSph8pyH0VsFreyCVvZAK7uhEcrPhucXTBceaETTU5AlIQM+t/JoBz2A1LpHwBFVAsr/gC0PfgTy1D3qBbOcAFBf9oXlB/u5wZDrHpFYd2ep/wsdS9f8O6t2AVGCfVBUqF1A+K3edClMPQ+HtExbfz+dzvD84zgqT7+YP38+8vPz/a/rR1YmTJjAkZUICbUXPgA+2Qv4H76Wn4uG11L9e0Ju9BB1P33NTPfB6fLg1PlqWI06JFt0MGglAKLhX6/18/qnXfgTyphK/TTU/1CmCQjUuH2ocrpxzlGLklOnkN07E0aD8lkGrQYGnfJTr1VGDxrWU//vwuaGRgSEEMrojE+G1yfg8fmU57KALAuY9RpYDFqY9Fo0u5elycBnKwOhLQ6Shn7PJtkn4/CRI8jumw1AA1/ddshCwCcDPqHU75NF4HM5cBSk8QhJ/SiE3GiERNT1qH4Upn5kRlM3wqFpNELjH7VBw0//Z/lbIBr+0zZ5r9FISKNRENGoRkBAbjQ6IqBcc6iqshJJyUnQajTNjBg1/xyN62i0Pn8tjf67NZ6nfjsa/5drGHkT/nX6368P8iEKeURBCFRWViIpKanFY7+a/aY1U1+0jEe0525mQhaoqqpEYmISpEjvGu3k261d86NJSMsaENS8oYyshENIYSUlJQVarRZlZWUB08vKypCent7sMunp6SHNDwBGoxFGo7HJdL1eH5FQEan1dkWh9aJzepZQ94gka90jzePBsbVrMWDSpLB9J3RQxrm6EtnjwaGatRgwLnx96Ko8Hg/Wrl2LK8P4neiK2AdFfR/GxHgf6rX1NyNcPQrpnFSDwYBRo0ahqKjIP02WZRQVFSEnJ6fZZXJycgLmB5Rho5bmJyIiImos5N1A+fn5mDFjBkaPHo0xY8Zg8eLFqK6u9p8ddMcdd6BXr14oKCgAAMybNw8//OEP8fvf/x433XQTVq1aha+++gqvvPJKeLeEiIiIuqWQw8qUKVNQXl6OJ554AqWlpRgxYgTWrVvnP4i2uLgYmkanr1599dVYuXIlHnvsMTz66KMYOHAg3n//fV5jhYiIiILSrgNs586di7lz5zb73qZNm5pMu/3223H77be356OIiIgoxvGuy0RERBTVGFaIiIgoqjGsEBERUVRjWCEiIqKoxrBCREREUY1hhYiIiKIawwoRERFFNYYVIiIiimoMK0RERBTV2nUF285Wf7v0cN1qup7H44HT6YTNZov5u2eyFwr2QcE+NGAvFOyDgn1QBNuH+r/b9X/H26tLhBW73Q4AyMrKUrkSIiIiCpXdbkdiYmK7l5dER+NOJ5BlGadOnYLVaoUkSWFbr81mQ1ZWFk6cOIGEhISwrbcrYi8U7IOCfWjAXijYBwX7oAi2D0II2O12ZGZmBtzkOFRdYmRFo9Ggd+/eEVt/QkJCTH/pGmMvFOyDgn1owF4o2AcF+6AIpg8dGVGpxwNsiYiIKKoxrBAREVFUi+mwYjQasWDBAhiNRrVLUR17oWAfFOxDA/ZCwT4o2AdFZ/ehSxxgS0RERLErpkdWiIiIKPoxrBAREVFUY1ghIiKiqMawQkRERFEtpsPKkiVLkJ2dDZPJhLFjx2L79u1ql9QhmzdvxuTJk5GZmQlJkvD+++8HvC+EwBNPPIGMjAyYzWbk5ubiu+++C5jn3LlzmD59OhISEpCUlIS77roLDocjYJ5vvvkG1113HUwmE7KysvD8889HetOCVlBQgCuvvBJWqxWpqam45ZZbcPDgwYB5amtrMWfOHFx00UWIj4/HT3/6U5SVlQXMU1xcjJtuugkWiwWpqal48MEH4fV6A+bZtGkTrrjiChiNRgwYMAArVqyI9OaF5OWXX8awYcP8F23KycnBRx995H8/Vvpwoeeeew6SJOG+++7zT4uFXjz55JOQJCngMXjwYP/7sdCDxkpKSvDzn/8cF110EcxmMy6//HJ89dVX/vdj4fdldnZ2k++EJEmYM2cOgCj7TogYtWrVKmEwGMTy5cvFt99+K2bPni2SkpJEWVmZ2qW129q1a8Vvf/tb8e677woA4r333gt4/7nnnhOJiYni/fffF7t37xY/+clPRN++fUVNTY1/nhtvvFEMHz5cbN26Vfz3v/8VAwYMEFOnTvW/X1VVJdLS0sT06dPF3r17xdtvvy3MZrP461//2lmb2aq8vDzx+uuvi71794pdu3aJSZMmiT59+giHw+Gf5+677xZZWVmiqKhIfPXVV+Kqq64SV199tf99r9crhg4dKnJzc8XOnTvF2rVrRUpKipg/f75/nqNHjwqLxSLy8/PFvn37xJ/+9Ceh1WrFunXrOnV7W/Phhx+KNWvWiEOHDomDBw+KRx99VOj1erF3714hROz0obHt27eL7OxsMWzYMDFv3jz/9FjoxYIFC8Rll10mTp8+7X+Ul5f734+FHtQ7d+6cuPjii8XMmTPFtm3bxNGjR8XHH38sDh8+7J8nFn5fnjlzJuD7UFhYKACIjRs3CiGi6zsRs2FlzJgxYs6cOf7XPp9PZGZmioKCAhWrCp8Lw4osyyI9PV288MIL/mmVlZXCaDSKt99+WwghxL59+wQA8eWXX/rn+eijj4QkSaKkpEQIIcRf/vIXkZycLFwul3+ehx9+WAwaNCjCW9Q+Z86cEQDEp59+KoRQtlmv14t//vOf/nn2798vAIgtW7YIIZTQp9FoRGlpqX+el19+WSQkJPi3+6GHHhKXXXZZwGdNmTJF5OXlRXqTOiQ5OVm8+uqrMdkHu90uBg4cKAoLC8UPf/hDf1iJlV4sWLBADB8+vNn3YqUH9R5++GFx7bXXtvh+rP6+nDdvnujfv7+QZTnqvhMxuRvI7XZjx44dyM3N9U/TaDTIzc3Fli1bVKwsco4dO4bS0tKAbU5MTMTYsWP927xlyxYkJSVh9OjR/nlyc3Oh0Wiwbds2/zw/+MEPYDAY/PPk5eXh4MGDOH/+fCdtTfCqqqoAAD169AAA7NixAx6PJ6APgwcPRp8+fQL6cPnllyMtLc0/T15eHmw2G7799lv/PI3XUT9PtH5/fD4fVq1aherqauTk5MRkH+bMmYObbrqpSb2x1IvvvvsOmZmZ6NevH6ZPn47i4mIAsdUDAPjwww8xevRo3H777UhNTcXIkSOxbNky//ux+PvS7XbjzTffxJ133glJkqLuOxGTYaWiogI+ny+gwQCQlpaG0tJSlaqKrPrtam2bS0tLkZqaGvC+TqdDjx49AuZpbh2NPyNayLKM++67D9dccw2GDh0KQKnRYDAgKSkpYN4L+9DWNrY0j81mQ01NTSQ2p1327NmD+Ph4GI1G3H333XjvvfcwZMiQmOvDqlWr8PXXX6OgoKDJe7HSi7Fjx2LFihVYt24dXn75ZRw7dgzXXXcd7HZ7zPSg3tGjR/Hyyy9j4MCB+Pjjj3HPPffg//7v//DGG28AiM3fl++//z4qKysxc+ZMANH3/0WXuOsyUXvMmTMHe/fuxWeffaZ2KaoZNGgQdu3ahaqqKrzzzjuYMWMGPv30U7XL6lQnTpzAvHnzUFhYCJPJpHY5qpk4caL/+bBhwzB27FhcfPHF+Mc//gGz2axiZZ1PlmWMHj0azz77LABg5MiR2Lt3L5YuXYoZM2aoXJ06XnvtNUycOBGZmZlql9KsmBxZSUlJgVarbXJUc1lZGdLT01WqKrLqt6u1bU5PT8eZM2cC3vd6vTh37lzAPM2to/FnRIO5c+fiP//5DzZu3IjevXv7p6enp8PtdqOysjJg/gv70NY2tjRPQkJCVP3iNxgMGDBgAEaNGoWCggIMHz4cL730Ukz1YceOHThz5gyuuOIK6HQ66HQ6fPrpp/jjH/8InU6HtLS0mOlFY0lJSbjkkktw+PDhmPo+AEBGRgaGDBkSMO3SSy/17xaLtd+X33//PT755BP88pe/9E+Ltu9ETIYVg8GAUaNGoaioyD9NlmUUFRUhJydHxcoip2/fvkhPTw/YZpvNhm3btvm3OScnB5WVldixY4d/ng0bNkCWZYwdO9Y/z+bNm+HxePzzFBYWYtCgQUhOTu6krWmZEAJz587Fe++9hw0bNqBv374B748aNQp6vT6gDwcPHkRxcXFAH/bs2RPwi6iwsBAJCQn+X3A5OTkB66ifJ9q/P7Isw+VyxVQfxo0bhz179mDXrl3+x+jRozF9+nT/81jpRWMOhwNHjhxBRkZGTH0fAOCaa65pckmDQ4cO4eKLLwYQO78v673++utITU3FTTfd5J8Wdd+Jdh403OWtWrVKGI1GsWLFCrFv3z7xq1/9SiQlJQUc1dzV2O12sXPnTrFz504BQCxatEjs3LlTfP/990II5VS8pKQk8cEHH4hvvvlG3Hzzzc2eijdy5Eixbds28dlnn4mBAwcGnIpXWVkp0tLSxC9+8Quxd+9esWrVKmGxWKLmVLx77rlHJCYmik2bNgWckud0Ov3z3H333aJPnz5iw4YN4quvvhI5OTkiJyfH/3796XgTJkwQu3btEuvWrRM9e/Zs9nS8Bx98UOzfv18sWbIk6k7RfOSRR8Snn34qjh07Jr755hvxyCOPCEmSxPr164UQsdOH5jQ+G0iI2OjFb37zG7Fp0yZx7Ngx8fnnn4vc3FyRkpIizpw5I4SIjR7U2759u9DpdOKZZ54R3333nXjrrbeExWIRb775pn+eWPh9KYRyJmyfPn3Eww8/3OS9aPpOxGxYEUKIP/3pT6JPnz7CYDCIMWPGiK1bt6pdUods3LhRAGjymDFjhhBCOR3v8ccfF2lpacJoNIpx48aJgwcPBqzj7NmzYurUqSI+Pl4kJCSIWbNmCbvdHjDP7t27xbXXXiuMRqPo1auXeO655zprE9vU3PYDEK+//rp/npqaGnHvvfeK5ORkYbFYxK233ipOnz4dsJ7jx4+LiRMnCrPZLFJSUsRvfvMb4fF4AubZuHGjGDFihDAYDKJfv34BnxEN7rzzTnHxxRcLg8EgevbsKcaNG+cPKkLETh+ac2FYiYVeTJkyRWRkZAiDwSB69eolpkyZEnBdkVjoQWP//ve/xdChQ4XRaBSDBw8Wr7zySsD7sfD7UgghPv74YwGgybYJEV3fCUkIIUIbiyEiIiLqPDF5zAoRERF1HQwrREREFNUYVoiIiCiqMawQERFRVGNYISIioqjGsEJERERRjWGFiIiIohrDChEREUU1hhUiIiKKagwrREREFNUYVoiIiCiqMawQERFRVPv/q+27MuUgzDIAAAAASUVORK5CYII=\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"# Test"
],
"metadata": {
"id": "XzE1E_fDlssv"
}
},
{
"cell_type": "code",
"source": [
"f_m = model.cpu()\n",
"f_m.eval()\n",
"with torch.no_grad():\n",
" is_first = True\n",
" for x_tensor, y_tensor in test_loader:\n",
" x_tensor = x_tensor.cpu()\n",
" y_tensor = y_tensor.cpu()\n",
" pred_prob = f_m(x_tensor)\n",
" pred = torch.argmax(pred_prob, dim=-1) # class 수 만큼 나오므로 가장 큰 확률의 index를 얻어야함.\n",
"\n",
" # print(y_tensor.numpy().shape)\n",
" if is_first:\n",
" test_pred = pred.numpy().copy()\n",
" test_label = y_tensor.numpy().copy()\n",
" is_first = False\n",
" else:\n",
" test_label = np.concatenate((test_label, y_tensor.numpy()), axis=0)\n",
" test_pred = np.concatenate((test_pred, pred.numpy()), axis=0)\n",
"\n",
"print(test_label.shape, test_label.dtype)\n",
"print(test_pred.shape, test_pred.dtype)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "bJEygiJETGIt",
"outputId": "398e37a4-962b-43ea-fa53-9ef358abdd0f"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"(30,) int64\n",
"(30,) int64\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"from sklearn.metrics import (\n",
" confusion_matrix,\n",
" precision_score,\n",
" recall_score,\n",
" f1_score,\n",
" fbeta_score,\n",
")\n",
"pred = test_pred\n",
"label = test_label\n",
"\n",
"print('Confusion Matrix\\n',\n",
" str(confusion_matrix(label,pred))\n",
" )\n",
"print(f'Precision :{np.round(precision_score(label,pred,average=None),2)}')\n",
"print(f'Precision (macro) :{np.round(precision_score(label,pred,average=\"macro\"),2)}')\n",
"print(f'Precision (micro) :{np.round(precision_score(label,pred,average=\"micro\"),2)}')\n",
"print(f'Precision (weighted):{np.round(precision_score(label,pred,average=\"weighted\"),2)}')\n",
"print(f'Recall :{np.round(recall_score(label,pred,average=None),2)}')\n",
"print(f'Recall (macro) :{np.round(recall_score(label,pred,average=\"macro\"),2)}')\n",
"print(f'Recall (micro) :{np.round(recall_score(label,pred,average=\"micro\"),2)}')\n",
"print(f'Recall (weighted):{np.round(recall_score(label,pred,average=\"weighted\"),2)}')\n",
"print(f'F1-score :{np.round(f1_score(label,pred,average=None),2)}')\n",
"print(f'F1-score (macro) :{np.round(f1_score(label,pred,average=\"macro\"),2)}')\n",
"print(f'F1-score (micro) :{np.round(f1_score(label,pred,average=\"micro\"),2)}')\n",
"print(f'F1-score (weighted):{np.round(f1_score(label,pred,average=\"weighted\"),2)}')\n",
"print(f'F2-score :{np.round(fbeta_score(label,pred,beta=2,average=None),2)}')\n",
"print(f'F2-score (macro) :{np.round(fbeta_score(label,pred,beta=2,average=\"macro\"),2)}')\n",
"print(f'F2-score (micro) :{np.round(fbeta_score(label,pred,beta=2,average=\"micro\"),2)}')\n",
"print(f'F2-score (weighted):{np.round(fbeta_score(label,pred,beta=2,average=\"weighted\"),2)}')\n",
"\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "BhUC7lATWE4g",
"outputId": "db725383-a1c8-4b45-d680-d3eb2d2e7d08"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Confusion Matrix\n",
" [[10 0 0]\n",
" [ 0 8 2]\n",
" [ 0 0 10]]\n",
"Precision :[1. 1. 0.83]\n",
"Precision (macro) :0.94\n",
"Precision (micro) :0.93\n",
"Precision (weighted):0.94\n",
"Recall :[1. 0.8 1. ]\n",
"Recall (macro) :0.93\n",
"Recall (micro) :0.93\n",
"Recall (weighted):0.93\n",
"F1-score :[1. 0.89 0.91]\n",
"F1-score (macro) :0.93\n",
"F1-score (micro) :0.93\n",
"F1-score (weighted):0.93\n",
"F2-score :[1. 0.83 0.96]\n",
"F2-score (macro) :0.93\n",
"F2-score (micro) :0.93\n",
"F2-score (weighted):0.93\n"
]
}
]
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "Cx3NqQukU-7t"
},
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment