diff --git "a/10\354\243\274\354\260\250_\354\230\210\354\212\265\352\263\274\354\240\234.pdf" "b/10\354\243\274\354\260\250_\354\230\210\354\212\265\352\263\274\354\240\234.pdf" new file mode 100644 index 0000000..38622fc Binary files /dev/null and "b/10\354\243\274\354\260\250_\354\230\210\354\212\265\352\263\274\354\240\234.pdf" differ diff --git "a/Week13_\353\263\265\354\212\265\352\263\274\354\240\234.ipynb" "b/Week13_\353\263\265\354\212\265\352\263\274\354\240\234.ipynb" new file mode 100644 index 0000000..bf0163e --- /dev/null +++ "b/Week13_\353\263\265\354\212\265\352\263\274\354\240\234.ipynb" @@ -0,0 +1,398 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "VsEwV1k2sc_L" + }, + "source": [ + "# **Description**\n", + "- 아래 코드는 **Dropout**과 **Batch Normalization** 기법을 사용하여 Digits 데이터셋에 대해 MLP 모델을 학습하는 코드입니다.\n", + "- PyTorch의 `nn.Sequential`을 사용해 모델을 간단히 정의하였습니다.\n", + " - 기본 모델 vs dropout 적용 모델 vs dropout + batch normalization 적용 모델의 test 결과 비교를 통해 각 기법의 영향을 알아보고자 합니다.\n", + "- 아래 모델 정의 코드 내에 `##답안 코드 작성##` 부분을 채우면서 코드를 실행시켜 주세요!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NVFE9r2Qsc_N" + }, + "source": [ + "## **데이터 준비**" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "1bM7QKTWsc_O" + }, + "outputs": [], + "source": [ + "import torch\n", + "from torch import nn, optim\n", + "from torch.utils.data import TensorDataset, DataLoader\n", + "\n", + "from sklearn.datasets import load_digits\n", + "from sklearn.model_selection import train_test_split\n", + "from tqdm import tqdm\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "2Yp64KE6sc_P" + }, + "outputs": [], + "source": [ + "## 데이터를 훈련용과 테스트용으로 분리\n", + "# 전체의 20%는 검증용\n", + "\n", + "digits = load_digits()\n", + "\n", + "X = digits.data\n", + "Y = digits.target\n", + "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2)\n", + "\n", + "X_train = torch.tensor(X_train, dtype=torch.float32)\n", + "Y_train = torch.tensor(Y_train, dtype=torch.int64)\n", + "X_test = torch.tensor(X_test, dtype=torch.float32)\n", + "Y_test = torch.tensor(Y_test, dtype=torch.int64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XpUWgc2Gsc_P" + }, + "source": [ + "## **Dropout** \n", + "- **Dropout**은 **과적합 방지**를 위해 훈련 시 일부 노드를 확률 $p$로 무작위로 비활성화하는 기법입니다. \n", + " - 비활성화된 노드의 효과는 **스케일링** $\\frac{1}{1-p}$을 통해 살아남은 노드에 보상하여 전체 효과를 유지합니다. \n", + "- Dropout의 **훈련 단계**와 **평가 단계**의 작동 방식은 다릅니다. \n", + " - **훈련 단계** (`model.train()`): 일부 노드만 활성화되며 다양한 노드 조합을 학습해 **특정 노드 의존도를 줄입니다**. \n", + " - **평가 단계** (`model.eval()`): 드롭아웃이 비활성화되어 **모든 노드**가 사용되며, 스케일링도 적용되지 않아 **일관된 출력**을 제공합니다. \n", + "> 이를 통해 모델은 **훈련 시 일반화 성능**을 높이고, **평가 시 안정적 결과**를 도출합니다. \n", + "\n", + " \n", + "\n", + "(Image Source = https://d2l.ai/_images/dropout2.svg)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "EEvdln6Hsc_P" + }, + "outputs": [], + "source": [ + "### 모델링\n", + "## 힌트\n", + "# 입력층부터 출력층까지 선형층(Linear), ReLU 활성화 함수, 드롭아웃이 반복되는 구조\n", + "# 4개의 은닉층이 있으며 각 은닉층은 100개의 노드를 가짐\n", + "# dropout 기법으로 50% 확률로 노드를 비활성화함\n", + "\n", + "\n", + "model = nn.Sequential(\n", + " nn.Linear(64, 100),\n", + " nn.ReLU(),\n", + " nn.Dropout(p=0.5),\n", + "\n", + " nn.Linear(100, 100),\n", + " nn.ReLU(),\n", + " nn.Dropout(p=0.5),\n", + "\n", + " nn.Linear(100, 100),\n", + " nn.ReLU(),\n", + " nn.Dropout(p=0.5),\n", + "\n", + " nn.Linear(100, 100),\n", + " nn.ReLU(),\n", + " nn.Dropout(p=0.5),\n", + "\n", + " nn.Linear(100, 10),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "DnKElcoZsc_P" + }, + "outputs": [], + "source": [ + "### Settings\n", + "\n", + "ds = TensorDataset(X_train, Y_train)\n", + "loader = DataLoader(ds, batch_size=32, shuffle=True)\n", + "\n", + "lossFunc = nn.CrossEntropyLoss()\n", + "optimizer = optim.Adam(model.parameters())" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 467 + }, + "id": "DDwT5TBfsc_Q", + "outputId": "fac44372-b144-454b-8a96-8738bc8fc2f7" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "100%|██████████| 100/100 [00:25<00:00, 3.96it/s]\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 5 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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YqNTp05GXl6ec5s77rjDiI2NNRYsWGCsXbvWGDlypDF69Gg3trplW716tREXF2f079/fuPfee5336zi7TmZmptG5c2dj2rRpxqpVq4z9+/cbc+fONfbu3evc5m9/+5sRHBxsfPPNN8amTZuMSy+91IiPjzcKCwvd2PKW55lnnjHCw8ON77//3khMTDS++OILIyAgwHjxxRed2+hYN8ycOXOMxx9/3Jg9e7YBGF9//XWVx+tyXC+66CJjwIABxq+//mr88ssvRrdu3YwpU6Y0um1tNowMHz7cmD59uvNru91utG/f3pg5c6YbW9X6pKenG4CxZMkSwzAMIysry/D09DS++OIL5zY7duwwAGPlypXuamaLlZuba3Tv3t2YP3++MXbsWGcY0XF2rUceecQ4++yza3zc4XAYMTExxj//+U/nfVlZWYa3t7fx3//+tzma2Gpccsklxu9///sq91155ZXGddddZxiGjrWrnBxG6nJct2/fbgDGmjVrnNv8+OOPhsViMQ4fPtyo9rTJYZqSkhLWrVvH+PHjnfdZrVbGjx/PypUr3diy1ic7OxuAsLAwANatW0dpaWmVY9+rVy86deqkY98A06dP55JLLqlyPEHH2dW+++47hg4dyuTJk4mKimLQoEG89dZbzscTExNJTU2tcryDg4MZMWKEjnc9jR49mgULFrB7924ANm3axLJly5g4cSKgY91U6nJcV65cSUhICEOHDnVuM378eKxWK6tWrWrU/lvEhfJcLSMjA7vdTnR0dJX7o6Oj2blzp5ta1fo4HA7uu+8+zjrrLPr16wdAamoqXl5ehISEVNk2Ojqa1NRUN7Sy5Zo1axbr169nzZo1pzym4+xa+/fv5/XXX2fGjBn88Y9/ZM2aNdxzzz14eXlx4403Oo9pdf9TdLzr59FHHyUnJ4devXphs9mw2+0888wzXHfddQA61k2kLsc1NTWVqKioKo97eHgQFhbW6GPfJsOINI/p06ezdetWli1b5u6mtDoHDx7k3nvvZf78+fj4+Li7Oa2ew+Fg6NChPPvsswAMGjSIrVu38sYbb3DjjTe6uXWty+eff84nn3zCp59+St++fdm4cSP33Xcf7du317FuxdrkME1ERAQ2m+2UmQVpaWnExMS4qVWty1133cX333/PokWL6Nixo/P+mJgYSkpKyMrKqrK9jn39rFu3jvT0dAYPHoyHhwceHh4sWbKEl156CQ8PD6Kjo3WcXahdu3b06dOnyn29e/cmOTkZwHlM9T+l8R566CEeffRRrr32WhISErjhhhu4//77mTlzJqBj3VTqclxjYmJIT0+v8nhZWRmZmZmNPvZtMox4eXkxZMgQFixY4LzP4XCwYMECRo0a5caWtXyGYXDXXXfx9ddfs3DhQuLj46s8PmTIEDw9Pasc+127dpGcnKxjXw/nn38+W7ZsYePGjc7b0KFDue6665yf6zi7zllnnXXKFPXdu3fTuXNnAOLj44mJialyvHNycli1apWOdz0VFBRgtVY9NdlsNhwOB6Bj3VTqclxHjRpFVlYW69atc26zcOFCHA4HI0aMaFwDGlX+2oLNmjXL8Pb2Nt5//31j+/btxm233WaEhIQYqamp7m5ai3bnnXcawcHBxuLFi42UlBTnraCgwLnNHXfcYXTq1MlYuHChsXbtWmPUqFHGqFGj3Njq1uHE2TSGoePsSqtXrzY8PDyMZ555xtizZ4/xySefGH5+fsbHH3/s3OZvf/ubERISYnz77bfG5s2bjcsuu0zTTRvgxhtvNDp06OCc2jt79mwjIiLCePjhh53b6Fg3TG5urrFhwwZjw4YNBmA8//zzxoYNG4ykpCTDMOp2XC+66CJj0KBBxqpVq4xly5YZ3bt319Texnr55ZeNTp06GV5eXsbw4cONX3/91d1NavGAam/vvfeec5vCwkLjD3/4gxEaGmr4+fkZV1xxhZGSkuK+RrcSJ4cRHWfX+t///mf069fP8Pb2Nnr16mW8+eabVR53OBzGE088YURHRxve3t7G+eefb+zatctNrW25cnJyjHvvvdfo1KmT4ePjY3Tp0sV4/PHHjeLiYuc2OtYNs2jRomr/P994442GYdTtuB47dsyYMmWKERAQYAQFBRk33XSTkZub2+i2WQzjhGXtRERERJpZm6wZERERkTOHwoiIiIi4lcKIiIiIuJXCiIiIiLiVwoiIiIi4lcKIiIiIuJXCiIiIiLiVwoiIiIi4lcKIiIiIuJXCiIiIiLiVwoiIiIi4lcKIiIiIuNX/A1X3PCPp3QOtAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ], + "source": [ + "### 학습 & 평가\n", + "\n", + "trainLosses = []\n", + "testLosses = []\n", + "\n", + "for epoch in tqdm(range(100)):\n", + "\n", + " ## 학습(train)\n", + " runningLoss = 0.0\n", + "\n", + " model.train()\n", + "\n", + " for i, (batchX, batchY) in enumerate(loader):\n", + " optimizer.zero_grad()\n", + " yPred = model(batchX)\n", + " loss = lossFunc(yPred, batchY)\n", + " loss.backward()\n", + " optimizer.step()\n", + " runningLoss += loss.item()\n", + " trainLosses.append(runningLoss/i)\n", + "\n", + "\n", + " ## 평가(test)\n", + " model.eval()\n", + "\n", + " yPred = model(X_test)\n", + " testLoss = lossFunc(yPred, Y_test)\n", + " testLosses.append(testLoss.item())\n", + "\n", + "## 결과 시각화\n", + "plt.plot(range(100), trainLosses, label = \"train loss\")\n", + "plt.plot(range(100), testLosses, label = \"test loss\")\n", + "plt.legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Gcw7F1zzsc_Q" + }, + "source": [ + "## **Batch Normalization**\n", + "- **Batch Normalization**은 신경망의 각 층을 통과할 때 **데이터 분포가 변하는 문제**를 해결하기 위해 데이터를 정규화하는 기법입니다.\n", + "- 입력 데이터만 정규화하는 것으로는 부족하기 때문에, 각 층에서 배치 단위로 평균과 분산을 맞추어 학습을 더 **안정적**이고 **빠르게** 만듭니다.\n", + "- 훈련 시에는 배치 통계를 사용하고, 평가 시에는 훈련 중 기록한 평균과 분산을 사용합니다.\n", + "> 이를 통해 깊은 신경망도 안정적으로 학습할 수 있고 빠르게 수렴하도록 합니다. \n", + "\n", + " \n", + "\n", + "(Image Source: https://production-media.paperswithcode.com/methods/batchnorm.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "iC56psfEsc_Q" + }, + "outputs": [], + "source": [ + "### 모델링\n", + "## 힌트\n", + "# 입력층부터 출력층까지 선형층(Linear), ReLU 활성화 함수, 배치정규화, 드롭아웃이 반복되는 구조\n", + "# 4개의 은닉층이 있으며 각 은닉층은 100개의 노드를 가짐\n", + "# dropout 기법으로 50% 확률로 노드를 비활성화함\n", + "# 배치 정규화할 출력 차원의 수는 100\n", + "\n", + "\n", + "model = nn.Sequential(\n", + " nn.Linear(64, 100),\n", + " nn.ReLU(),\n", + " nn.BatchNorm1d(100),\n", + " nn.Dropout(p=0.5),\n", + "\n", + " nn.Linear(100, 100),\n", + " nn.ReLU(),\n", + " nn.BatchNorm1d(100),\n", + " nn.Dropout(p=0.5),\n", + "\n", + " nn.Linear(100, 100),\n", + " nn.ReLU(),\n", + " nn.BatchNorm1d(100),\n", + " nn.Dropout(p=0.5),\n", + "\n", + " nn.Linear(100, 100),\n", + " nn.ReLU(),\n", + " nn.BatchNorm1d(100),\n", + " nn.Dropout(p=0.5),\n", + "\n", + " nn.Linear(100, 10),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "hYE_iFdFsc_Q" + }, + "outputs": [], + "source": [ + "### Settings\n", + "\n", + "ds = TensorDataset(X_train, Y_train)\n", + "loader = DataLoader(ds, batch_size=32, shuffle=True)\n", + "\n", + "lossFunc = nn.CrossEntropyLoss()\n", + "optimizer = optim.Adam(model.parameters())" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 472 + }, + "id": "sR7jUmxhsc_R", + "outputId": "42942ba6-24df-4cc8-c5ee-7aa39b64f9ec" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "100%|██████████| 100/100 [00:23<00:00, 4.23it/s]\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 8 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGiCAYAAAA1LsZRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABeYElEQVR4nO3dd3hUZeL28e/MpPcE0oDQe+/NhhopugjqKmJBXXVXFqyrrvx211V3Fd+1r2tvrL2sgIpYEAQEkQ7SayABUgghvc+c94+TDAmkM4WQ+3NdcyWZnDnnmZPMnHueajEMw0BERETES6zeLoCIiIi0bAojIiIi4lUKIyIiIuJVCiMiIiLiVQojIiIi4lUKIyIiIuJVCiMiIiLiVQojIiIi4lUKIyIiIuJVCiMiIiLiVY0KI7Nnz2bYsGGEhoYSExPD5MmT2bVrV52PmTNnDhaLpdotICDgtAotIiIiZ49GhZFly5YxY8YMfvnlFxYtWkRZWRljx46loKCgzseFhYWRmprqvB08ePC0Ci0iIiJnD5/GbPztt99W+3nOnDnExMSwfv16zj///FofZ7FYiIuLa1oJRURE5KzWqDByspycHACioqLq3C4/P58OHTrgcDgYPHgwTzzxBH369Kl1+5KSEkpKSpw/OxwOsrKyaNWqFRaL5XSKLCIiIh5iGAZ5eXm0adMGq7X2xhiLYRhGUw7gcDi4/PLLyc7OZsWKFbVut2rVKvbs2UP//v3Jycnh6aefZvny5Wzbto127drV+JhHHnmERx99tCnFEhERkTNMSkpKrdd8OI0wMn36dL755htWrFhR5wFOVlZWRq9evZg6dSr/+Mc/atzm5JqRnJwc2rdvT0pKCmFhYU0proiIiHhYbm4uCQkJZGdnEx4eXut2TWqmmTlzJgsWLGD58uWNCiIAvr6+DBo0iL1799a6jb+/P/7+/qfcHxYWpjAiIiLSzNTXxaJRo2kMw2DmzJnMmzePJUuW0KlTp0YXyG63s2XLFuLj4xv9WBERETn7NKpmZMaMGXz44Yd88cUXhIaGkpaWBkB4eDiBgYEATJs2jbZt2zJ79mwAHnvsMUaOHEnXrl3Jzs7mqaee4uDBg9x2220ufioiIiLSHDUqjLzyyisAjBkzptr977zzDjfffDMAycnJ1XrMHj9+nNtvv520tDQiIyMZMmQIP//8M7179z69kouIiMhZockdWD0pNzeX8PBwcnJy1GdEROQsYxgG5eXl2O12bxdFGslms+Hj41Nrn5CGXr9Pa54RERGR01FaWkpqaiqFhYXeLoo0UVBQEPHx8fj5+TV5HwojIiLiFQ6Hg6SkJGw2G23atMHPz08TWzYjhmFQWlrK0aNHSUpKolu3bnVObFYXhREREfGK0tJSHA4HCQkJBAUFebs40gSBgYH4+vpy8OBBSktLm7wQbtMijIiIiIs09dO0nBlc8ffTf4CIiIh4lcKIiIiIeJXCiIiIiJd17NiR559/3uv78BZ1YBUREWmkMWPGMHDgQJdd/NeuXUtwcLBL9tUctegw8vaKJPZn5nPTqI50iw31dnFEROQsYhgGdrsdH5/6L7XR0dEeKNGZq0U303z16xHe/yWZ/ZkF3i6KiIhgXsALS8u9cmvohOQ333wzy5Yt44UXXsBisWCxWDhw4ABLly7FYrHwzTffMGTIEPz9/VmxYgX79u1j0qRJxMbGEhISwrBhw/jhhx+q7fPkJhaLxcKbb77JFVdcQVBQEN26dePLL79s1LlMTk5m0qRJhISEEBYWxjXXXEN6errz95s3b+bCCy8kNDSUsLAwhgwZwrp16wA4ePAgEydOJDIykuDgYPr06cPChQsbdfzGaNE1I2EBvgDkFJV5uSQiIgJQVGan98PfeeXY2x8bR5Bf/ZfFF154gd27d9O3b18ee+wxwKzZOHDgAAAPPfQQTz/9NJ07dyYyMpKUlBQuvfRSHn/8cfz9/Xn33XeZOHEiu3bton379rUe59FHH+Vf//oXTz31FC+++CLXX389Bw8eJCoqqt4yOhwOZxBZtmwZ5eXlzJgxgylTprB06VIArr/+egYNGsQrr7yCzWZj06ZN+Pqa18UZM2ZQWlrK8uXLCQ4OZvv27YSEhNR73KZq0WEkPNA86bkKIyIi0kDh4eH4+fkRFBREXFzcKb9/7LHHuOSSS5w/R0VFMWDAAOfP//jHP5g3bx5ffvklM2fOrPU4N998M1OnTgXgiSee4N///jdr1qxh/Pjx9ZZx8eLFbNmyhaSkJBISEgB499136dOnD2vXrmXYsGEkJyfzwAMP0LNnTwC6devmfHxycjJXXXUV/fr1A6Bz5871HvN0tOgwEhZoPn2FERGRM0Ogr43tj43z2rFdYejQodV+zs/P55FHHuHrr78mNTWV8vJyioqKSE5OrnM//fv3d34fHBxMWFgYGRkZDSrDjh07SEhIcAYRgN69exMREcGOHTsYNmwY9913H7fddhvvvfceiYmJXH311XTp0gWAu+66i+nTp/P999+TmJjIVVddVa08rtai+4w4a0aKy71cEhERAbOvRJCfj1durloX5+RRMffffz/z5s3jiSee4KeffmLTpk3069eP0tLSOvdT2WRS9dw4HA6XlBHgkUceYdu2bVx22WUsWbKE3r17M2/ePABuu+029u/fz4033siWLVsYOnQoL774osuOfbIWHUbUZ0RERJrCz88Pu93eoG1XrlzJzTffzBVXXEG/fv2Ii4tz9i9xl169epGSkkJKSorzvu3bt5OdnU3v3r2d93Xv3p17772X77//niuvvJJ33nnH+buEhATuuOMO5s6dy5/+9CfeeOMNt5W3RYcR9RkREZGm6NixI6tXr+bAgQNkZmbWWWPRrVs35s6dy6ZNm9i8eTPXXXedS2s4apKYmEi/fv24/vrr2bBhA2vWrGHatGlccMEFDB06lKKiImbOnMnSpUs5ePAgK1euZO3atfTq1QuAe+65h++++46kpCQ2bNjAjz/+6PydO7ToMBIWqJoRERFpvPvvvx+bzUbv3r2Jjo6us//Hs88+S2RkJKNHj2bixImMGzeOwYMHu7V8FouFL774gsjISM4//3wSExPp3Lkzn3zyCQA2m41jx44xbdo0unfvzjXXXMOECRN49NFHAbDb7cyYMYNevXoxfvx4unfvzssvv+y+8hoNHVjtRbm5uYSHh5OTk0NYWJjL9rtybybXv7ma7rEhfH/vBS7br4iI1K+4uJikpCQ6derU5KXnxfvq+js29PrdsmtG1GdERETE61p2GHEO7dVoGhEREW9p0WGksgNrUZmd0nL3diYSERGRmrXoMBIacGIMd26xmmpERES8oUWHEZvVQqi/2VSjfiMiIiLe0aLDCJwY3qu5RkRERLxDYURzjYiIiHiVwkhAxYgarU8jIiLiFS0+jISrZkRERMSrWnwYUZ8RERFpTsaMGcM999zj7WK4VIsPI1osT0REGssdgeDmm29m8uTJLt1nc9Hiw0jllPCaZ0RERMQ7WnwYCdeU8CIiZw7DgNIC79wauG7szTffzLJly3jhhRewWCxYLBYOHDgAwNatW5kwYQIhISHExsZy4403kpmZ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\n" + }, + "metadata": {} + } + ], + "source": [ + "### 학습 & 평가\n", + "\n", + "trainLosses = []\n", + "testLosses = []\n", + "\n", + "for epoch in tqdm(range(100)):\n", + " ## 학습(train)\n", + " runningLoss = 0.0\n", + "\n", + " model.train()\n", + "\n", + " for i, (batchX, batchY) in enumerate(loader):\n", + " optimizer.zero_grad()\n", + " yPred = model(batchX)\n", + " loss = lossFunc(yPred, batchY)\n", + " loss.backward()\n", + " optimizer.step()\n", + " runningLoss += loss.item()\n", + " trainLosses.append(runningLoss/i)\n", + "\n", + "\n", + " ## 평가(test)\n", + " model.eval()\n", + "\n", + " yPred = model(X_test)\n", + " testLoss = lossFunc(yPred, Y_test)\n", + " testLosses.append(testLoss.item())\n", + "\n", + "### 시각화\n", + "plt.plot(range(100), trainLosses, label = \"train loss\")\n", + "plt.plot(range(100), testLosses, label = \"test loss\")\n", + "plt.legend()" + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "7n_hza8Ttx27" + }, + "execution_count": null, + "outputs": [] + } + ], + "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.11.8" + }, + "colab": { + "provenance": [] + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file