{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# CS 20 : TensorFlow for Deep Learning Research\n", "## Lecture 03 : Linear and Logistic Regression\n", "### Linear Regression with huber loss by high-level" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Setup" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.12.0\n" ] } ], "source": [ "from __future__ import absolute_import, division, print_function\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import tensorflow as tf\n", "%matplotlib inline\n", "\n", "print(tf.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load and Pre-process data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<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>Country</th>\n", " <th>Birth rate</th>\n", " <th>Life expectancy</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>Vietnam</td>\n", " <td>1.822</td>\n", " <td>74.828244</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>Vanuatu</td>\n", " <td>3.869</td>\n", " <td>70.819488</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>Tonga</td>\n", " <td>3.911</td>\n", " <td>72.150659</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>Timor-Leste</td>\n", " <td>5.578</td>\n", " <td>61.999854</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>Thailand</td>\n", " <td>1.579</td>\n", " <td>73.927659</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Country Birth rate Life expectancy\n", "0 Vietnam 1.822 74.828244\n", "1 Vanuatu 3.869 70.819488\n", "2 Tonga 3.911 72.150659\n", "3 Timor-Leste 5.578 61.999854\n", "4 Thailand 1.579 73.927659" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.read_table('../data/lecture03/example_with_placeholder/birth_life_2010.txt')\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(190,) (190,)\n" ] } ], "source": [ "x = data.loc[:,'Birth rate'].values\n", "y = data.loc[:,'Life expectancy'].values\n", "print(x.shape, y.shape)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(133,) (133,)\n", "(57,) (57,)\n" ] } ], "source": [ "# split train and validation\n", "tr_indices = np.random.choice(range(x.shape[0]), size = int(x.shape[0] * .7), replace=False)\n", "x_tr = x[tr_indices]\n", "y_tr = y[tr_indices]\n", "\n", "x_val = np.delete(x, tr_indices, axis = 0)\n", "y_val = np.delete(y, tr_indices, axis = 0)\n", "\n", "print(x_tr.shape, y_tr.shape)\n", "print(x_val.shape, y_val.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Define the graph of Simple Linear Regression" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# create placeholders for X (birth rate) and Y (life expectancy)\n", "X = tf.placeholder(dtype = tf.float32, shape = [None])\n", "Y = tf.placeholder(dtype = tf.float32, shape = [None])\n", "\n", "# create weight and bias, initialized to 0 \n", "w = tf.get_variable(name = 'weight', initializer = tf.constant(.0))\n", "b = tf.get_variable(name = 'bias', initializer = tf.constant(.0))\n", "\n", "# construct model to predict Y\n", "yhat = X * w + b\n", "\n", "# use the square error as huber loss function\n", "\n", "huber_loss = tf.losses.huber_loss(labels = Y, predictions = yhat, delta = 14.)\n", "huber_loss_summ = tf.summary.scalar(name = 'huber_loss', tensor = huber_loss) # for tensorboard\n", "\n", "# using gradient descent with learning rate of 0.01 to minimize loss\n", "opt = tf.train.GradientDescentOptimizer(learning_rate=.01)\n", "training_op = opt.minimize(huber_loss)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Training" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "23\n" ] } ], "source": [ "epochs = 100\n", "batch_size = 8\n", "total_step = int(x.shape[0] / batch_size)\n", "print(total_step)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "train_writer = tf.summary.FileWriter(logdir = '../graphs/lecture03/linreg_huber_high_tf_placeholder/train',\n", " graph = tf.get_default_graph())\n", "val_writer = tf.summary.FileWriter(logdir = '../graphs/lecture03/linreg_huber_high_tf_placeholder/val',\n", " graph = tf.get_default_graph())" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "epoch : 0, tr_loss : 692.88, val_loss : 663.27\n", "epoch : 10, tr_loss : 277.13, val_loss : 293.82\n", "epoch : 20, tr_loss : 248.73, val_loss : 251.21\n", "epoch : 30, tr_loss : 192.79, val_loss : 185.59\n", "epoch : 40, tr_loss : 128.23, val_loss : 122.80\n", "epoch : 50, tr_loss : 93.26, val_loss : 74.94\n", "epoch : 60, tr_loss : 49.64, val_loss : 40.08\n", "epoch : 70, tr_loss : 30.26, val_loss : 19.89\n", "epoch : 80, tr_loss : 20.98, val_loss : 19.67\n", "epoch : 90, tr_loss : 19.37, val_loss : 11.75\n" ] } ], "source": [ "sess_config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))\n", "sess = tf.Session(config = sess_config)\n", "sess.run(tf.global_variables_initializer())\n", "\n", "tr_loss_hist = []\n", "val_loss_hist = []\n", "\n", "for epoch in range(epochs):\n", " avg_tr_loss = 0\n", " avg_val_loss = 0\n", " \n", " for step in range(total_step):\n", " batch_indices = np.random.choice(range(x_tr.shape[0]),\n", " size = batch_size, replace = False)\n", " val_indices = np.random.choice(range(x_val.shape[0]),\n", " size = batch_size, replace = False)\n", " batch_xs = x_tr[batch_indices]\n", " batch_ys = y_tr[batch_indices]\n", " val_xs = x_val[val_indices]\n", " val_ys = y_val[val_indices]\n", " \n", " _, tr_loss = sess.run(fetches = [training_op, huber_loss],\n", " feed_dict = {X : batch_xs, Y : batch_ys})\n", " tr_loss_summ = sess.run(huber_loss_summ, feed_dict = {X : batch_xs, Y : batch_ys})\n", "\n", " val_loss, val_loss_summ = sess.run(fetches = [huber_loss, huber_loss_summ],\n", " feed_dict = {X : val_xs, Y: val_ys})\n", " avg_tr_loss += tr_loss / total_step\n", " avg_val_loss += val_loss / total_step\n", " \n", " train_writer.add_summary(tr_loss_summ, global_step = epoch)\n", " val_writer.add_summary(val_loss_summ, global_step = epoch)\n", " \n", " tr_loss_hist.append(avg_tr_loss)\n", " val_loss_hist.append(avg_val_loss)\n", " \n", " if epoch % 10 == 0:\n", " print('epoch : {:3}, tr_loss : {:.2f}, val_loss : {:.2f}'.format(epoch, avg_tr_loss, avg_val_loss))\n", "\n", "train_writer.close()\n", "val_writer.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualization" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<matplotlib.legend.Legend at 0x121c081d0>" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(tr_loss_hist, label = 'train')\n", "plt.plot(val_loss_hist, label = 'validation')\n", "plt.legend()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<matplotlib.legend.Legend at 0x123c7bda0>" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "w_out, b_out = sess.run([w, b])\n", "plt.plot(data.iloc[:,1], data.iloc[:,2], 'bo', label='Real data')\n", "plt.plot(data.iloc[:,1], data.iloc[:,1] * w_out + b_out, 'r', label='Predicted data')\n", "plt.legend()" ] } ], "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" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }