264 lines
54 KiB
Text
264 lines
54 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Build and train a neural network"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/home/lln/Documentos/recreate_pytorch/PyNorch\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"%cd ../"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import norch\n",
|
|
"import norch.nn as nn\n",
|
|
"import norch.optim as optim\n",
|
|
"from norch.utils.data.dataloader import DataLoader\n",
|
|
"from norch.norchvision import transforms as T\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import random\n",
|
|
"random.seed(1)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Visualizing data"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABiIAAAMfCAYAAABb/s9vAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/EklEQVR4nO3deZzWdb3///csLDMgyiruIAgmoJGpSa6puB21UjPzuGXlinv2a/WXJ8tOVqbmwsmsTu6apZUtZKgFKIg7KghisSmgyL7MzPX7o1N9+9X55ot8cc013O+3m380Pa7r8xZwrpl5zmeoq1QqlQIAAAAAAJCgvtoHAAAAAAAAOi5DBAAAAAAAkMYQAQAAAAAApDFEAAAAAAAAaQwRAAAAAABAGkMEAAAAAACQxhABAAAAAACkMUQAAAAAAABpDBEAAAAAAEAaQwQAAAAAAJDGEEHNevzxx8shhxxSevToUTbZZJMyevTo8uSTT1b7WADUmPHjx5e6urp/+M+kSZOqfTwAasRzzz1Xjj322LL99tuX5ubm0qdPn7LPPvuU+++/v9pHA6DGLF++vFx66aXlkEMOKb169Sp1dXXle9/7XrWPBf+SxmofANbH1KlTy1577VW22Wabcumll5a2trZy3XXXlX333bc89thjZejQodU+IgA15txzzy277bbb37xt8ODBVToNALXmlVdeKcuWLSsnn3xy2XLLLcvKlSvLPffcU4488shy4403lk984hPVPiIANWLRokXlsssuK9tuu23ZZZddyvjx46t9JPiX1VUqlUq1DwFRhx9+eJk4cWKZMWNG6d27dymllPnz55chQ4aU0aNHl3vuuafKJwSgVowfP77sv//+5a677irHHHNMtY8DQAfS2tpadt1117J69erywgsvVPs4ANSINWvWlDfeeKP079+/TJkypey2227l5ptvLqecckq1jwbrzY9moiY98sgj5cADD/zLCFFKKVtssUXZd999y09/+tOyfPnyKp4OgFq1bNmy0tLSUu1jANBBNDQ0lG222aYsWbKk2kcBoIZ06dKl9O/fv9rHgLeVIYKatGbNmtLU1PR3b29ubi5r164tzz77bBVOBUAtO/XUU0uPHj1K165dy/7771+mTJlS7SMBUINWrFhRFi1aVGbOnFm++c1vlgceeKAccMAB1T4WAEBV+TsiqElDhw4tkyZNKq2traWhoaGUUsratWvLo48+WkopZe7cudU8HgA1pHPnzuXoo48uhx12WOnTp0+ZNm1aufLKK8vee+9dJkyYUEaOHFntIwJQQy666KJy4403llJKqa+vLx/84AfLtddeW+VTAQBUlyGCmnTWWWeVM888s5x22mnlkksuKW1tbeVLX/pSmT9/fimllFWrVlX5hADUilGjRpVRo0b95X8feeSR5Zhjjik777xz+fSnP11+8YtfVPF0ANSa888/vxxzzDFl3rx55c477yytra1l7dq11T4WAEBV+dFM1KQzzjijfOYznym33nprGTZsWBkxYkSZOXNmueSSS0oppXTv3r3KJwSglg0ePLgcddRR5be//W1pbW2t9nEAqCE77rhjOfDAA8tJJ530l7+/7ogjjiiVSqXaRwMAqBpDBDXr8ssvL6+++mp55JFHytNPP10mT55c2traSimlDBkypMqnA6DWbbPNNmXt2rVlxYoV1T4KADXsmGOOKZMnTy7Tp0+v9lEAAKrGj2aipvXs2bPstddef/nf48aNK1tvvXXZcccdq3gqADqCWbNmla5du7rLDoB/yZ9/bOybb75Z5ZMAAFSPOyLoMO64444yefLkcv7555f6en+0AXhrFi5c+Hdve+qpp8p9991XRo8e7TUFgLfktdde+7u3rVu3rvzgBz8oTU1NZaeddqrCqQAA2gd3RFCTHn744XLZZZeV0aNHl969e5dJkyaVm2++uRxyyCHlvPPOq/bxAKghxx13XGlqaiqjRo0q/fr1K9OmTStjx44tzc3N5Yorrqj28QCoEaeffnpZunRp2WeffcpWW21VFixYUG655ZbywgsvlK9//evusAMg5Nprry1Lliwp8+bNK6WUcv/995c5c+aUUkoZM2ZM2XTTTat5PAirq/gbs6hBM2fOLGeddVaZOnVqWbZsWRk4cGA5+eSTy4UXXlg6d+5c7eMBUEOuvvrqcsstt5SXXnqpLF26tPTt27cccMAB5dJLLy2DBw+u9vEAqBG33357uemmm8ozzzxTFi9eXDbZZJOy6667ljFjxpQjjzyy2scDoMYMGDCgvPLKK//w/3v55ZfLgAEDNuyB4F9kiAAAAAAAANL4occAAAAAAEAaQwQAAAAAAJDGEAEAAAAAAKQxRAAAAAAAAGkMEQAAAAAAQBpDBAAAAAAAkMYQAQAA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g0499dTSo0eP0rVr17L//vuXKVOmVPtIsN78aCY6jF/+8pdl8eLFfiwTAGE33HBDeeWVV8q4ceOqfRQAatSMGTNKS0tLOeqoo8ppp51WvvKVr5Tx48eXa665pixZsqTcdttt1T4iADWic+fO5eijjy6HHXZY6dOnT5k2bVq58sory957710mTJhQRo4cWe0jQlhdpVKpVPsQ8Hb4yEc+Uu6+++4yf/780rt372ofB4AasXjx4jJkyJDymc98plx00UWllFL222+/smjRovLss89W+XQA1IpBgwaVWbNmlTPOOKNcf/31f3n7GWecUW688cYyffr0ssMOO1TxhADUspdeeqnsvPPOZZ999im/+MUvqn0cCPOjmegQli9fXn7yk5+Ugw8+2AgBQMjnPve50qtXrzJmzJhqHwWAGtbU1FRKKeX444//m7f/+e+vmzhx4gY/EwAdx+DBg8tRRx1Vfvvb35bW1tZqHwfCDBF0CD/+8Y/LypUr/VgmAEJmzJhRxo4dW84999wyb968Mnv27DJ79uyyevXqsm7dujJ79uzy+uuvV/uYANSALbfcspRSyuabb/43b+/Xr18ppZQ33nhjg58JgI5lm222KWvXri0rVqyo9lEgzBBBh3DLLbeU7t27lyOPPLLaRwGghsydO7e0tbWVc889twwcOPAv/zz66KNl+vTpZeDAgeWyyy6r9jEBqAG77rprKeVPry3/p3nz5pVSSunbt+8GPxMAHcusWbNK165dS/fu3at9FAjzl1VT8xYuXFjGjRtXjj/++NLc3Fzt4wBQQ4YPH17uvffev3v75z73ubJs2bLyrW99qwwaNKgKJwOg1nzoQx8qV1xxRbnpppvK+973vr+8/Tvf+U5pbGws++23X/UOB0BNWbhw4d8N2E899VS57777yqGHHlrq631vObXHEEHNu+OOO0pLS4sfywRAWJ8+fcr73//+v3v7VVddVUop//D/A4B/ZOTIkeWjH/1o+e53v1taWlrKvvvuW8aPH1/uuuuu8ulPf/ovP7oJAP6Z4447rjQ1NZVRo0aVfv36lWnTppWxY8eW5ubmcsUVV1T7eLBe6iqVSqXah4B/xZ577llmzZpV5s2bVxoaGqp9HAA6gP32268sWrSoPPvss9U+CgA1ZN26deXLX/5yufnmm8u8efPKdtttV84+++xy/vnnV/toANSQ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",
|
|
"text/plain": [
|
|
"<Figure size 2000x1000 with 8 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"train_data, test_data = norch.norchvision.datasets.MNIST.splits()\n",
|
|
"input_sample, target_sample = train_data[0]\n",
|
|
"\n",
|
|
"fig = plt.figure(figsize = (20, 10))\n",
|
|
"columns = 4\n",
|
|
"rows = 2\n",
|
|
"\n",
|
|
"for i in range(1, columns * rows + 1):\n",
|
|
" # Choose a random image\n",
|
|
" image_index = random.randint(0, len(train_data))\n",
|
|
" image, label = train_data[image_index]\n",
|
|
"\n",
|
|
" fig.add_subplot(rows, columns, i)\n",
|
|
" plt.imshow(np.array(image).reshape(28, 28))\n",
|
|
" plt.title(label)\n",
|
|
" plt.axis('off')\n",
|
|
" \n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Training "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"BATCH_SIZE = 32\n",
|
|
"device = \"cuda\" #cpu\n",
|
|
"epochs = 10\n",
|
|
"\n",
|
|
"transform = T.Compose(\n",
|
|
" [\n",
|
|
" T.ToTensor(),\n",
|
|
" T.Reshape([-1, 784, 1])\n",
|
|
" ]\n",
|
|
")\n",
|
|
"\n",
|
|
"target_transform = T.Compose(\n",
|
|
" [\n",
|
|
" T.ToTensor()\n",
|
|
" ]\n",
|
|
")\n",
|
|
"\n",
|
|
"train_data, test_data = norch.norchvision.datasets.MNIST.splits(transform=transform, target_transform=target_transform)\n",
|
|
"train_loader = DataLoader(train_data, batch_size = BATCH_SIZE)\n",
|
|
"\n",
|
|
"class MyModel(nn.Module):\n",
|
|
" def __init__(self):\n",
|
|
" super(MyModel, self).__init__()\n",
|
|
" self.fc1 = nn.Linear(784, 30)\n",
|
|
" self.sigmoid1 = nn.Sigmoid()\n",
|
|
" self.fc2 = nn.Linear(30, 10)\n",
|
|
" self.sigmoid2 = nn.Sigmoid()\n",
|
|
"\n",
|
|
" def forward(self, x):\n",
|
|
" out = self.fc1(x)\n",
|
|
" out = self.sigmoid1(out)\n",
|
|
" out = self.fc2(out)\n",
|
|
" out = self.sigmoid2(out)\n",
|
|
" \n",
|
|
" return out\n",
|
|
"\n",
|
|
"model = MyModel().to(device)\n",
|
|
"criterion = nn.CrossEntropyLoss()\n",
|
|
"optimizer = optim.SGD(model.parameters(), lr=0.01)\n",
|
|
"loss_list = []\n",
|
|
"\n",
|
|
"for epoch in range(epochs): \n",
|
|
" \n",
|
|
" avg_loss = 0 \n",
|
|
" num_steps = 0\n",
|
|
" \n",
|
|
" for idx, batch in enumerate(train_loader):\n",
|
|
"\n",
|
|
" inputs, target = batch\n",
|
|
"\n",
|
|
" inputs = inputs.to(device)\n",
|
|
" target = target.to(device)\n",
|
|
"\n",
|
|
" outputs = model(inputs)\n",
|
|
" \n",
|
|
" loss = criterion(outputs, target)\n",
|
|
" \n",
|
|
" optimizer.zero_grad()\n",
|
|
" \n",
|
|
" loss.backward()\n",
|
|
"\n",
|
|
" optimizer.step()\n",
|
|
"\n",
|
|
" avg_loss += loss[0]\n",
|
|
" num_steps += 1\n",
|
|
"\n",
|
|
" avg_loss = avg_loss / num_steps\n",
|
|
" print(f'Epoch [{epoch + 1}/{epochs}], Loss: {avg_loss:.4f}')\n",
|
|
" loss_list.append(avg_loss)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"MyModel(\n",
|
|
" (fc1): Linear(input_dim=784, output_dim=30, bias=True)\n",
|
|
" (sigmoid1): Sigmoid()\n",
|
|
" (fc2): Linear(input_dim=30, output_dim=10, bias=True)\n",
|
|
" (sigmoid2): Sigmoid()\n",
|
|
")"
|
|
]
|
|
},
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"model"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Check loss"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAHWCAYAAABACtmGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRR0lEQVR4nO3deVxVZeLH8e8FZHEBdwQlccs1EbWMzFbK1Mit3PdpWrTSnGbSSk1bbB8zTcsp9zVTM3PJTMvKxtRw0kwzN1LBzARERYX7++P8uEmgF67Ac5fP+/U6Lw6Hc+HLGSb58jznOTa73W4XAAAAAOCS/EwHAAAAAAB3R3ECAAAAACcoTgAAAADgBMUJAAAAAJygOAEAAACAExQnAAAAAHCC4gQAAAAATlCcAAAAAMAJihMAAAAAOEFxAgAfMWDAAEVHR7v02meffVY2m61oA3mZ6Oho3X333aZjGHXgwAHZbDa99tprpqMAQJGjOAGAYTabrUDbhg0bTEc1YsCAASpbtqzpGG4hp5hcanvppZdMRwQArxVgOgAA+LrZs2fnen/WrFlau3ZtnuMNGza8oq8zbdo0ZWdnu/TaZ555RiNGjLiir4+i07NnT7Vv3z7P8djYWANpAMA3UJwAwLA+ffrkev/bb7/V2rVr8xz/q9OnT6t06dIF/jqlSpVyKZ8kBQQEKCCAfzLcRfPmzZ3+fAAAihZT9QDAA9xyyy1q0qSJtm7dqptuukmlS5fWU089JUn66KOP1KFDB0VGRiooKEh16tTRc889p6ysrFyf46/3OF18P8q7776rOnXqKCgoSNdee62+++67XK/N7x4nm82mRx55RMuWLVOTJk0UFBSkxo0ba/Xq1Xnyb9iwQS1btlRwcLDq1Kmjd955p8jvm/rggw/UokULhYSEqHLlyurTp48OHz6c65zk5GQNHDhQNWrUUFBQkCIiItSxY0cdOHDAcc6WLVvUtm1bVa5cWSEhIapVq5YGDRpU4ByffvqpmjVrpuDgYDVq1EhLlixxfGzfvn2y2Wz697//ned133zzjWw2m+bPn1/4bz4fOfdcXS7Pxbnuu+8+VaxYUaVLl9b111+vTz75JM95Z8+e1bPPPqurr75awcHBioiIUJcuXfTLL7/kOdfZzxQAeBr+fAgAHuL3339Xu3bt1KNHD/Xp00fh4eGSpBkzZqhs2bIaPny4ypYtq88//1yjR49WWlqaXn31Vaefd968eUpPT9eDDz4om82mV155RV26dNG+ffucjlJ99dVXWrJkiQYPHqxy5cpp4sSJ6tq1qw4dOqRKlSpJkr7//nvdddddioiI0NixY5WVlaVx48apSpUqV35R/t+MGTM0cOBAXXvttRo/frxSUlL05ptv6uuvv9b333+v8uXLS5K6du2qnTt36tFHH1V0dLSOHTumtWvX6tChQ47377zzTlWpUkUjRoxQ+fLldeDAgXzLRn5+/vlnde/eXQ899JD69++v6dOn67777tPq1at1xx13qHbt2mrdurXmzp2rxx9/PNdr586dq3Llyqljx45Ov87p06d1/PjxPMfLly+fa2TQWR5JSklJ0Q033KDTp0/rscceU6VKlTRz5kzdc889Wrx4sTp37ixJysrK0t13361169apR48eGjp0qNLT07V27Vrt2LFDderUcXzdK/mZAgC3ZQcAuJUhQ4bY//qf55tvvtkuyT516tQ8558+fTrPsQcffNBeunRp+9mzZx3H+vfvb69Zs6bj/f3799sl2StVqmQ/ceKE4/hHH31kl2T/+OOPHcfGjBmTJ5Mke2BgoH3v3r2OY9u3b7dLsr/11luOYwkJCfbSpUvbDx8+7Dj2888/2wMCAvJ8zvz079/fXqZMmUt+/Ny5c/aqVavamzRpYj9z5ozj+IoVK+yS7KNHj7bb7Xb7H3/8YZdkf/XVVy/5uZYuXWqXZP/uu++c5vqrmjVr2iXZP/zwQ8ex1NRUe0REhD02NtZx7J133rFLsu/atSvX91C5cmV7//79L/s1cv43u9S2adOmQucZNmyYXZJ948aNjmPp6en2WrVq2aOjo+1ZWVl2u91uf//99+2S7G+88UaeXNnZ2bnyFeRnCgA8DVP1AMBDBAUFaeDAgXmOh4SEOPbT09N1/PhxtWnTRqdPn9ZPP/3k9PN2795dFSpUcLzfpk0bSdb0LWfi4+NzjTQ0bdpUoaGhjtdmZWXps88+U6dOnRQZGek4r27dumrXrp3Tz18QW7Zs0bFjxzR48GAFBwc7jnfo0EENGjRwTDkLCQlRYGCgNmzYoD/++CPfz5UzMrVixQqdP3++0FkiIyMdIzSSFBoaqn79+un7779XcnKyJKlbt24KDg7W3LlzHeetWbNGx48fL/B9Sw888IDWrl2bZ2vUqFGh86xcuVLXXXedbrzxRsd5ZcuW1QMPPKADBw7oxx9/lCR9+OGHqly5sh599NE8ef465fJKfqYAwF1RnADAQ1SvXl2BgYF5ju/cuVOdO3dWWFiYQkNDVaVKFccv4KmpqU4/71VXXZXr/ZxfeC9VLi732pzX57z22LFjOnPmjOrWrZvnvPyOueLgwYOSpPr16+f5WIMGDRwfDwoK0ssvv6xVq1YpPDxcN910k1555RVHgZCkm2++WV27dtXYsWNVuXJldezYUdOnT1dmZmaBstStWzdPibj66qslyXEfVfny5ZWQkKB58+Y5zpk7d66qV6+u2267rUBfp169eoqPj8+zhYaGFjrPwYMH8712Oas45ly/X375RfXr1y/QIiFX8jMFAO6K4gQAHuLikaUcJ0+e1M0336zt27dr3Lhx+vjjj7V27Vq9/PLLklSg5cf9/f3zPW6324v1tSYMGzZMe/bs0fjx4xUcHKxRo0apYcOG+v777yVZIyeLFy/Wpk2b9Mgjj+jw4cMaNGiQWrRooVOnThVZjn79+mnfvn365ptvlJ6eruXLl6tnz57y8/OOf5Y97ecCAArCO/4LDQA+asOGDfr99981Y8YMDR06VHfffbfi4+NzTZMyqWrVqgoODtbevXvzfCy/Y66oWbOmJGn37t15PrZ7927Hx3PUqVNH//jHP/Tpp59qx44dOnfunF5//fVc51x//fV64YUXtGXLFs2dO1c7d+7UggULnGbZu3dvnnKwZ88eScq1ouFdd92lKlWqaO7cuVq6dKlOnz6tvn37Fuj7LYyC5KlZs2a+1y5nmmfO9atTp452797t0hRGAPAGFCcA8GA5f9m/+Jfjc+fO6e233zYVKRd/f3/Fx8dr2bJlOnLkiOP43r17tWrVqiL5Gi1btlTVqlU1derUXFPqVq1apV27dqlDhw6SrJXozp49m+u1derUUbly5Ryv++OPP/IUjWbNmklSgabrHTlyREuXLnW8n5aWplmzZqlZs2aqVq2a43hAQIB69uypRYsWacaMGbrmmmvUtGnTwn3jBVCQPO3bt9fmzZu1adMmx3kZGRl69913FR0d7bhvqmvXrjp+/LgmTZqU5+swkgTAF7AcOQB4sBtuuEEVKlRQ//799dhjj8lms2n27Nlu9Yvss88+q08//VStW7fWww8/rKysLE2aNElNmjRRYmJigT7H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T5eRlJSkoUOHau3atXn+sohLu/iv1U2bNlWrVq1Us2ZNLVq0SH/7298MJnN/2dnZatmypV588UVJUmxsrHbs2KGpU6dSnArovffeU7t27RQZGWk6ittbtGiR5s6dq3nz5qlx48ZKTEzUsGHDFBkZyc+bE7Nnz9agQYNUvXp1+fv7q3nz5urZs6e2bt1qOhqKEVP14JEeeeQRrVixQuvXr1eNGjVMx/EIgYGBqlu3rlq0aKHx48crJiZGb775pulYbm3r1q06duyYmjdvroCAAAUEBOiLL77QxIkTFRAQoKysLNMRPUL58uV19dVXa+/evaajuL2IiIg8f8xo2LAhUx0L6ODBg/rss890//33m47iEf75z39qxIgR6tGjh6655hr17dtXjz/+uMaPH286mturU6eOvvjiC506dUpJSUnavHmzzp8/r9q1a5uO5jGqVasmSUpJScl1PCUlxfExd0Nxgkex2+165JFHtHTpUn3++eeqVauW6UgeKzs7W5mZmaZjuLXbb79dP/zwgxITEx1by5Yt1bt3byUmJsrf3990RI9w6tQp/fLLL4qIiDAdxe21bt06zyMW9uzZo5o1axpK5FmmT5+uqlWrqkOHDqajeITTp0/Lzy/3r4L+/v7Kzs42lMjzlClTRhEREfrjjz+0Zs0adezY0XQkj1GrVi1Vq1ZN69atcxxLS0vTf//7X7e9B5upeoacOnUq119f9+/fr8TERFWsWFFXXXWVwWTubciQIZo3b54++ugjlStXzjEHNiwsTCEhIYbTua+RI0eqXbt2uuqqq5Senq558+Zpw4YNWrNmjelobq1cuXJ57p8rU6aMKlWqxH11l/HEE08oISFBNWvW1JEjRzRmzBj5+/urZ8+epqO5vccff1w33HCDXnzxRXXr1k2bN2/Wu+++q3fffdd0NLeXnZ2t6dOnq3///goI4NebgkhISNALL7ygq666So0bN9b333+vN954Q4MGDTIdze2tWbNGdrtd9evX1969e/XPf/5TDRo00MCBA01HcyvOft8dNmyYnn/+edWrV0+1atXSqFGjFBkZqU6dOpkLfTmml/XzVevXr7dLyrP179/fdDS3lt81k2SfPn266WhubdCgQfaaNWvaAwMD7VWqVLHffvvt9k8//dR0LI/EcuTOde/e3R4REWEPDAy0V69e3d69e3f73r17TcfyGB9//LG9SZMm9qCgIHuDBg3s7777rulIHmHNmjV2Sfbdu3ebjuIx0tLS7EOHDrVfddVV9uDgYHvt2rXtTz/9tD0zM9N0NLe3cOFCe+3ate2BgYH2atWq2YcMGWI/efKk6Vhux9nvu9nZ2fZRo0bZw8PD7UFBQfbbb7/drf8/bLPbeTw0AAAAAFwO9zgBAAAAgBMUJwAAAABwguIEAAAAAE5QnAAAAADACYoTAAAAADhBcQIAAAAAJyhOAAAAAOAExQkAAAAAnKA4AQBQCDabTcuWLTMdAwBQwihOAACPMWDAANlstjzbXXfdZToaAMDLBZgOAABAYdx1112aPn16rmNBQUGG0gAAfAUjTgAAjxIUFKRq1arl2ipUqCDJmkY3ZcoUtWvXTiEhIapdu7YWL16c6/U//PCDbrvtNoWEhKhSpUp64IEHdOrUqVznvP/++2rcuLGCgoIUERGhRx55JNfHjx8/rs6dO6t06dKqV6+eli9fXrzfNADAOIoTAMCrjBo1Sl27dtX27dvVu3dv9ejRQ7t27ZIkZWRkqG3btqpQoYK+++47ffDBB/rss89yFaMpU6ZoyJAheuCBB/TDDz9o+fLlqlu3bq6vMXbsWHXr1k3/+9//1L59e/Xu3VsnTpwo0e8TAFCybHa73W46BAAABTFgwADNmTNHwcHBuY4/9dRTeuqpp2Sz2fTQQw9pypQpjo9df/31at68ud5++21NmzZNTz75pJKSklSmTBlJ0sqVK5WQkKAjR44oPDxc1atX18CBA/X888/nm8Fms+mZZ57Rc889J8kqY2XLltWqVau41woAvBj3OAEAPMqtt96aqxhJUsWKFR37cXFxuT4WFxenxMRESdKuXbsUExPjKE2S1Lp1a2VnZ2v37t2y2Ww6cuSIbr/99stmaNq0qWO/TJkyCg0N1bFjx1z9lgAAHoDiBADwKGXKlMkzda6ohISEFOi8UqVK5XrfZrMpOzu7OCIBANwE9zgBALzKt99+m+f9hg0bSpIaNmyo7du3KyMjw/Hxr7/+Wn5+fqpfv77KlSun6OhorVu3rkQzAwDcHyNOAACPkpmZqeTk5FzHAgICVLlyZUnSBx98oJYtW+rGG2/U3LlztXnzZr333nuSpN69e2vMmDHq37+/nn32Wf3222969NFH1bdvX4WHh0uSnn32WT300EOqWrWq2rVrp/T0dH399dd69NFHS/YbBQC4FYoTAMCjrF69WhEREbmO1a9fXz/99JMka8W7BQsWaPDgwYqIiND8+fPVqFEjSVLp0qW1Zs0aDR06VNdee61Kly6trl276o033nB8rv79++vs2bP697//rSeeeEKVK1fWvffeW3LfIADALbGqHgDAa9hsNi1dulSdOnUyHQUA4GW4xwkAAAAAnKA4AQAAAIAT3OMEAPAazD4HABQXRpwAAAAAwAmKEwAAAAA4QXECAAAAACcoTgAAAADgBMUJAAAAAJygOAEAAACAExQnAAAAAHCC4gQAAAAATvwfNybdWQxhs64AAAAASUVORK5CYII=",
|
|
"text/plain": [
|
|
"<Figure size 1000x500 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"epochs_list = range(1, len(loss_list) + 1)\n",
|
|
"\n",
|
|
"plt.figure(figsize=(10, 5))\n",
|
|
"\n",
|
|
"plt.plot(epochs_list, loss_list, 'b', marker='o')\n",
|
|
"plt.title('Training Loss by Epoch')\n",
|
|
"plt.xlabel('Epoch')\n",
|
|
"plt.ylabel('Loss')\n",
|
|
"plt.xticks(epochs_list)\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"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": 2
|
|
}
|