{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import torch\n", "torch.set_printoptions(edgeitems=2, linewidth=75)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "t_c = torch.tensor([0.5, 14.0, 15.0, 28.0, 11.0,\n", " 8.0, 3.0, -4.0, 6.0, 13.0, 21.0])\n", "t_u = torch.tensor([35.7, 55.9, 58.2, 81.9, 56.3, 48.9,\n", " 33.9, 21.8, 48.4, 60.4, 68.4])\n", "t_un = 0.1 * t_u" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def model(t_u, w, b):\n", " return w * t_u + b" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def loss_fn(t_p, t_c):\n", " squared_diffs = (t_p - t_c)**2\n", " return squared_diffs.mean()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['ASGD',\n", " 'Adadelta',\n", " 'Adagrad',\n", " 'Adam',\n", " 'AdamW',\n", " 'Adamax',\n", " 'LBFGS',\n", " 'Optimizer',\n", " 'RMSprop',\n", " 'Rprop',\n", " 'SGD',\n", " 'SparseAdam',\n", " '__builtins__',\n", " '__cached__',\n", " '__doc__',\n", " '__file__',\n", " '__loader__',\n", " '__name__',\n", " '__package__',\n", " '__path__',\n", " '__spec__',\n", " 'lr_scheduler']" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import torch.optim as optim\n", "\n", "dir(optim)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "params = torch.tensor([1.0, 0.0], requires_grad=True)\n", "learning_rate = 1e-5\n", "optimizer = optim.SGD([params], lr=learning_rate)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([ 9.5483e-01, -8.2600e-04], requires_grad=True)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t_p = model(t_u, *params)\n", "loss = loss_fn(t_p, t_c)\n", "loss.backward()\n", "\n", "optimizer.step()\n", "\n", "params" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([1.7761, 0.1064], requires_grad=True)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "params = torch.tensor([1.0, 0.0], requires_grad=True)\n", "learning_rate = 1e-2\n", "optimizer = optim.SGD([params], lr=learning_rate)\n", "\n", "t_p = model(t_un, *params)\n", "loss = loss_fn(t_p, t_c)\n", "\n", "optimizer.zero_grad() # <1>\n", "loss.backward()\n", "optimizer.step()\n", "\n", "params" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def training_loop(n_epochs, optimizer, params, t_u, t_c):\n", " for epoch in range(1, n_epochs + 1):\n", " t_p = model(t_u, *params) \n", " loss = loss_fn(t_p, t_c)\n", " \n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", "\n", " if epoch % 500 == 0:\n", " print('Epoch %d, Loss %f' % (epoch, float(loss)))\n", " \n", " return params" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 500, Loss 7.860118\n", "Epoch 1000, Loss 3.828538\n", "Epoch 1500, Loss 3.092191\n", "Epoch 2000, Loss 2.957697\n", "Epoch 2500, Loss 2.933134\n", "Epoch 3000, Loss 2.928648\n", "Epoch 3500, Loss 2.927830\n", "Epoch 4000, Loss 2.927680\n", "Epoch 4500, Loss 2.927651\n", "Epoch 5000, Loss 2.927648\n" ] }, { "data": { "text/plain": [ "tensor([ 5.3671, -17.3012], requires_grad=True)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "params = torch.tensor([1.0, 0.0], requires_grad=True)\n", "learning_rate = 1e-2\n", "optimizer = optim.SGD([params], lr=learning_rate) # <1>\n", "\n", "training_loop(\n", " n_epochs = 5000, \n", " optimizer = optimizer,\n", " params = params, # <1> \n", " t_u = t_un,\n", " t_c = t_c)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 500, Loss 7.612903\n", "Epoch 1000, Loss 3.086700\n", "Epoch 1500, Loss 2.928578\n", "Epoch 2000, Loss 2.927646\n" ] }, { "data": { "text/plain": [ "tensor([ 0.5367, -17.3021], requires_grad=True)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "params = torch.tensor([1.0, 0.0], requires_grad=True)\n", "learning_rate = 1e-1\n", "optimizer = optim.Adam([params], lr=learning_rate) # <1>\n", "\n", "training_loop(\n", " n_epochs = 2000, \n", " optimizer = optimizer,\n", " params = params,\n", " t_u = t_u, # <2> \n", " t_c = t_c)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(tensor([9, 6, 5, 8, 4, 7, 0, 1, 3]), tensor([ 2, 10]))" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n_samples = t_u.shape[0]\n", "n_val = int(0.2 * n_samples)\n", "\n", "shuffled_indices = torch.randperm(n_samples)\n", "\n", "train_indices = shuffled_indices[:-n_val]\n", "val_indices = shuffled_indices[-n_val:]\n", "\n", "train_indices, val_indices # <1>" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "train_t_u = t_u[train_indices]\n", "train_t_c = t_c[train_indices]\n", "\n", "val_t_u = t_u[val_indices]\n", "val_t_c = t_c[val_indices]\n", "\n", "train_t_un = 0.1 * train_t_u\n", "val_t_un = 0.1 * val_t_u" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def training_loop(n_epochs, optimizer, params, train_t_u, val_t_u,\n", " train_t_c, val_t_c):\n", " for epoch in range(1, n_epochs + 1):\n", " train_t_p = model(train_t_u, *params) # <1>\n", " train_loss = loss_fn(train_t_p, train_t_c)\n", " \n", " val_t_p = model(val_t_u, *params) # <1>\n", " val_loss = loss_fn(val_t_p, val_t_c)\n", " \n", " optimizer.zero_grad()\n", " train_loss.backward() # <2>\n", " optimizer.step()\n", "\n", " if epoch <= 3 or epoch % 500 == 0:\n", " print(f\"Epoch {epoch}, Training loss {train_loss.item():.4f},\"\n", " f\" Validation loss {val_loss.item():.4f}\")\n", " \n", " return params" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1, Training loss 66.5811, Validation loss 142.3890\n", "Epoch 2, Training loss 38.8626, Validation loss 64.0434\n", "Epoch 3, Training loss 33.3475, Validation loss 39.4590\n", "Epoch 500, Training loss 7.1454, Validation loss 9.1252\n", "Epoch 1000, Training loss 3.5940, Validation loss 5.3110\n", "Epoch 1500, Training loss 3.0942, Validation loss 4.1611\n", "Epoch 2000, Training loss 3.0238, Validation loss 3.7693\n", "Epoch 2500, Training loss 3.0139, Validation loss 3.6279\n", "Epoch 3000, Training loss 3.0125, Validation loss 3.5756\n" ] }, { "data": { "text/plain": [ "tensor([ 5.1964, -16.7512], requires_grad=True)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "params = torch.tensor([1.0, 0.0], requires_grad=True)\n", "learning_rate = 1e-2\n", "optimizer = optim.SGD([params], lr=learning_rate)\n", "\n", "training_loop(\n", " n_epochs = 3000, \n", " optimizer = optimizer,\n", " params = params,\n", " train_t_u = train_t_un, # <1> \n", " val_t_u = val_t_un, # <1> \n", " train_t_c = train_t_c,\n", " val_t_c = val_t_c)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def training_loop(n_epochs, optimizer, params, train_t_u, val_t_u,\n", " train_t_c, val_t_c):\n", " for epoch in range(1, n_epochs + 1):\n", " train_t_p = model(train_t_u, *params)\n", " train_loss = loss_fn(train_t_p, train_t_c)\n", "\n", " with torch.no_grad(): # <1>\n", " val_t_p = model(val_t_u, *params)\n", " val_loss = loss_fn(val_t_p, val_t_c)\n", " assert val_loss.requires_grad == False # <2>\n", " \n", " optimizer.zero_grad()\n", " train_loss.backward()\n", " optimizer.step()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def calc_forward(t_u, t_c, is_train):\n", " with torch.set_grad_enabled(is_train):\n", " t_p = model(t_u, *params)\n", " loss = loss_fn(t_p, t_c)\n", " return loss" ] } ], "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.7.6" } }, "nbformat": 4, "nbformat_minor": 2 }