{ "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)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "t_c = torch.tensor([0.5, 14.0, 15.0, 28.0, 11.0, 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, 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", " '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.860116\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.927679\n", "Epoch 4500, Loss 2.927652\n", "Epoch 5000, Loss 2.927647\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.612901\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([ 8, 0, 3, 6, 4, 1, 2, 5, 10]), tensor([9, 7]))" ] }, "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": [ "t_u_train = t_u[train_indices]\n", "t_c_train = t_c[train_indices]\n", "\n", "t_u_val = t_u[val_indices]\n", "t_c_val = t_c[val_indices]\n", "\n", "t_un_train = 0.1 * t_u_train\n", "t_un_val = 0.1 * t_u_val" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def training_loop(n_epochs, optimizer, params, t_u_train, t_u_val, t_c_train, t_c_val):\n", " for epoch in range(1, n_epochs + 1):\n", " t_p_train = model(t_un_train, *params) # <1>\n", " loss_train = loss_fn(t_p_train, t_c_train)\n", "\n", " t_p_val = model(t_un_val, *params) # <1>\n", " loss_val = loss_fn(t_p_val, t_c_val)\n", " \n", " optimizer.zero_grad()\n", " loss_train.backward() # <2>\n", " optimizer.step()\n", "\n", " if epoch <= 3 or epoch % 500 == 0:\n", " print('Epoch {}, Training loss {}, Validation loss {}'.format(\n", " epoch, float(loss_train), float(loss_val)))\n", " \n", " return params" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1, Training loss 88.59708404541016, Validation loss 43.31699752807617\n", "Epoch 2, Training loss 34.42190933227539, Validation loss 35.03486633300781\n", "Epoch 3, Training loss 27.57990264892578, Validation loss 40.214229583740234\n", "Epoch 500, Training loss 9.516923904418945, Validation loss 9.02982234954834\n", "Epoch 1000, Training loss 4.543173789978027, Validation loss 2.596876621246338\n", "Epoch 1500, Training loss 3.1108808517456055, Validation loss 2.9066450595855713\n", "Epoch 2000, Training loss 2.6984243392944336, Validation loss 4.1561737060546875\n", "Epoch 2500, Training loss 2.579646348953247, Validation loss 5.138668537139893\n", "Epoch 3000, Training loss 2.5454416275024414, Validation loss 5.755766868591309\n" ] }, { "data": { "text/plain": [ "tensor([ 5.6473, -18.7334], 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", " t_u_train = t_un_train, # <1> \n", " t_u_val = t_un_val, # <1> \n", " t_c_train = t_c_train,\n", " t_c_val = t_c_val)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def training_loop(n_epochs, optimizer, params, t_u_train, t_u_val, t_c_train, t_c_val):\n", " for epoch in range(1, n_epochs + 1):\n", " t_p_train = model(t_un_train, *params)\n", " loss_train = loss_fn(t_p_train, t_c_train)\n", "\n", " with torch.no_grad(): # <1>\n", " t_p_val = model(t_un_val, *params)\n", " loss_val = loss_fn(t_p_val, t_c_val)\n", " assert loss_val.requires_grad == False # <2>\n", " \n", " optimizer.zero_grad()\n", " loss_train.backward()\n", " optimizer.step()" ] }, { "cell_type": "code", "execution_count": 18, "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.6.6" } }, "nbformat": 4, "nbformat_minor": 2 }