{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Nonlinear regression for inverse dynamics\n", "\n", "In this question, we fit a model which can predict what torques a robot needs to apply in order to make its arm reach a desired point in space. The data was collected from a SARCOS robot arm with $7$ degrees of freedom. The input vector $x \\in \\mathbb{R}^{21}$ encodes the desired position, velocity and accelaration of the $7$ joints. The output vector $y \\in \\mathbb{R}^7$ encodes the torques that should be applied to the joints to reach that point. The mapping from $x$ to $y$ is highly nonlinear.\n", "\n", "We can find the data at [http://www.gaussianprocess.org/gpml/data/](http://www.gaussianprocess.org/gpml/data/). Obviously the first step is to read this data." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
x1x2x3x4x5x6x7x8x9x10...x19x20x21y1y2y3y4y5y6y7
00.019478-0.1342180.0274391.5164010.3009360.0582590.150134-0.266791-0.237134-0.091272...11.6959561.210212-22.11928950.292652-36.97189720.93717047.821712-0.424812-0.9075538.090739
10.017279-0.1370770.0269991.5325170.3013440.0582590.128653-0.153640-0.3352790.006449...14.6433691.015070-17.04868844.104164-28.85184516.23019443.194073-0.228739-1.2358177.762475
20.016336-0.1408780.0272501.5496700.3023180.0590270.104104-0.047313-0.4187320.106274...15.4676280.910548-11.41552637.354858-20.80934312.37997539.3860170.244491-1.7008807.289678
30.016273-0.1453070.0290721.5668550.3076280.0590270.0803210.053238-0.4609630.188013...10.3092030.921360-5.77205830.676065-13.9638167.70294036.478813-0.182062-2.1433706.410800
40.017279-0.1500510.0310831.5844160.3141620.0590270.0588400.133810-0.4622640.263975...2.8680961.059957-0.49154225.920128-11.1784795.64393434.773911-1.031687-2.3557765.792892
\n", "

5 rows × 28 columns

\n", "
" ], "text/plain": [ " x1 x2 x3 x4 x5 x6 x7 \\\n", "0 0.019478 -0.134218 0.027439 1.516401 0.300936 0.058259 0.150134 \n", "1 0.017279 -0.137077 0.026999 1.532517 0.301344 0.058259 0.128653 \n", "2 0.016336 -0.140878 0.027250 1.549670 0.302318 0.059027 0.104104 \n", "3 0.016273 -0.145307 0.029072 1.566855 0.307628 0.059027 0.080321 \n", "4 0.017279 -0.150051 0.031083 1.584416 0.314162 0.059027 0.058840 \n", "\n", " x8 x9 x10 ... x19 x20 x21 \\\n", "0 -0.266791 -0.237134 -0.091272 ... 11.695956 1.210212 -22.119289 \n", "1 -0.153640 -0.335279 0.006449 ... 14.643369 1.015070 -17.048688 \n", "2 -0.047313 -0.418732 0.106274 ... 15.467628 0.910548 -11.415526 \n", "3 0.053238 -0.460963 0.188013 ... 10.309203 0.921360 -5.772058 \n", "4 0.133810 -0.462264 0.263975 ... 2.868096 1.059957 -0.491542 \n", "\n", " y1 y2 y3 y4 y5 y6 y7 \n", "0 50.292652 -36.971897 20.937170 47.821712 -0.424812 -0.907553 8.090739 \n", "1 44.104164 -28.851845 16.230194 43.194073 -0.228739 -1.235817 7.762475 \n", "2 37.354858 -20.809343 12.379975 39.386017 0.244491 -1.700880 7.289678 \n", "3 30.676065 -13.963816 7.702940 36.478813 -0.182062 -2.143370 6.410800 \n", "4 25.920128 -11.178479 5.643934 34.773911 -1.031687 -2.355776 5.792892 \n", "\n", "[5 rows x 28 columns]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%matplotlib inline\n", "\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "import time\n", "from util import read_all_sarcos_data, TARGET_COLUMN\n", "\n", "training_data, test_data = read_all_sarcos_data()\n", "training_data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's standardize our data by making each column have mean $0$ and unit variance." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Linear Regression\n", "\n", "Now, the first order of business is to fit a standard linear regression. I'll just use the `sklearn` implementation." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn import preprocessing\n", "def standardize_data(data):\n", " feature_column_names = [column_name for column_name in all_data.columns if 'x' in column_name]\n", " features = data[feature_column_names]\n", " # only care about the first output for this problem\n", " target = data[TARGET_COLUMN]\n", " X = features.as_matrix()\n", " Y = target.as_matrix()\n", " X_scaled = preprocessing.scale(X, axis = 0, with_mean = True, with_std = True, copy = True)\n", " # only standardize inputs\n", " # Y_scaled = preprocessing.scale(Y, axis = 0, with_mean = True, with_std = True, copy = True)\n", " return X_scaled, Y\n", "# standardize together and separate\n", "all_data = pd.concat([training_data, test_data], axis = 0)\n", "standardize_data(all_data)\n", "X, Y = standardize_data(all_data)\n", "X_scaled, Y_scaled = X[:len(training_data)], Y[:len(training_data)]\n", "X_scaled_test, Y_scaled_test = X[len(training_data):], Y[len(training_data):]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.6/site-packages/scipy/linalg/basic.py:1018: RuntimeWarning: internal gelsd driver lwork query error, required iwork dimension not returned. This is likely the result of LAPACK bug 0038, fixed in LAPACK 3.2.2 (released July 21, 2010). Falling back to 'gelss' driver.\n", " warnings.warn(mesg, RuntimeWarning)\n" ] }, { "data": { "text/plain": [ "0.92494581827142286" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn import linear_model\n", "## since data is already normalized\n", "linearRegressor = linear_model.LinearRegression(fit_intercept = True, normalize = False)\n", "linearRegressor.fit(X_scaled, Y_scaled)\n", "linearRegressor.score(X_scaled_test, Y_scaled_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "According to the problem, we should be able to get a standardized mean squared error (SMSE) of 0.075. We define\n", "\n", "\\begin{equation}\n", "SMSE = \\left(\\frac{1}{N_{test}}\\sum_{i=1}^{N_{test}}\\left(y_i - \\hat{y}_i\\right)^2\\right)/\\sigma^2,\n", "\\end{equation}\n", "\n", "where \n", "\n", "\\begin{equation}\n", "\\sigma^2 = \\frac{1}{N_{train}}\\sum_{i=1}^{N_{train}}\\left(y_i - \\bar{y}\\right)^2.\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MSE: 31.0857592861\n", "SMSE: 0.0742260930\n" ] } ], "source": [ "def compute_mse(prediction, labels):\n", " return (sum((labels - prediction)**2)/len(prediction))\n", "def compute_model_mse(model, X, y):\n", " predicted_y = model.predict(X)\n", " return compute_mse(predicted_y, y)\n", "def log_mse(mse):\n", " print('MSE: {:.10f}'.format(mse))\n", " print('SMSE: {:.10f}'.format(mse/np.var(Y_scaled, ddof = 0)))\n", "\n", "test_mse = compute_model_mse(linearRegressor, X_scaled_test, Y_scaled_test)\n", "\n", "log_mse(test_mse)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looks like we got the correct result. Yay! \n", "\n", "## Radial Basis Function Network\n", "\n", "Next, we'll try using a radial basis function (RBF) network. First, we need to do some K-means clustering. We'll pick the number of clusters with the qualitative kink, knee, or elbow method (three different names for the same method). The book says to use cross-validation, but that's nonsense since the book itself says that using cross-validation is not possible for non-probablistic methods. I guess we could use a Gaussian Mixture Model if we want to do cross-validation?\n", "\n", "We'll fit the model with various values of $k$ and look at the reconstruction error." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time elapsed: 963.612736572999\n" ] }, { "data": { "text/plain": [ "[93511.741947211151,\n", " 65971.803182832591,\n", " 52906.722708804191,\n", " 45695.425134108205,\n", " 40914.984232328658,\n", " 37248.225253985787,\n", " 34558.310657963739,\n", " 32687.881212347915,\n", " 30928.954367901584,\n", " 29095.062690792329,\n", " 28426.793310216104,\n", " 26914.31468947696,\n", " 25975.490225306414,\n", " 25435.360392172126,\n", " 24836.868461234892,\n", " 24133.903034204865,\n", " 23626.584694583617,\n", " 23060.447629759739,\n", " 22521.141339972521,\n", " 21986.600362484041,\n", " 21708.632679338189,\n", " 21322.262079304437,\n", " 20787.919953330376,\n", " 20624.359384467432,\n", " 20029.795155720603,\n", " 19853.067069977682,\n", " 19440.537303560875,\n", " 19233.056525067761,\n", " 18875.450036315928,\n", " 18604.189801324806,\n", " 18443.502619621235,\n", " 18096.416501089247,\n", " 17887.377666428139,\n", " 17637.052858147334,\n", " 17348.111435998861,\n", " 17166.150898743901]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn import cluster\n", "from joblib import Parallel, delayed\n", "\n", "k_range = np.arange(1, 107, 3)\n", "def score_k(k):\n", " kMeansModel = cluster.KMeans(n_clusters = k, init = 'k-means++', algorithm = 'elkan', precompute_distances = True)\n", " kMeansModel.fit(X_scaled)\n", " return -kMeansModel.score(X_scaled_test)\n", "start = time.perf_counter() ## time how long it takes\n", "reconstruction_error = Parallel(n_jobs = 2, backend='threading')(delayed(score_k)(k) for k in k_range)\n", "print('Time elapsed: ' + str(time.perf_counter() - start))\n", "reconstruction_error" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot the reconstruction error to find the kink." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.6/site-packages/matplotlib/figure.py:397: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n", " \"matplotlib is currently using a non-GUI backend, \"\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "reconstruction_error = np.array(reconstruction_error, dtype = np.float64)\n", "fig = plt.figure(figsize=(10,6))\n", "ax = plt.gca()\n", "ax.plot(k_range, reconstruction_error, '.k-')\n", "ax.grid(True)\n", "ax.set_ylabel('Reconstruction error')\n", "ax.set_xlabel('$k$ - the number of clusters')\n", "ax.set_title('Test Data Reconstruction Error versus $k$')\n", "ax.get_yaxis().set_major_formatter(\n", " matplotlib.ticker.FuncFormatter(lambda y, pos : format(int(y), ',')))\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Qualitatively, $100$ looks good to me. Now, let's fit our RBF network, which is a super simple [neural network](https://en.wikipedia.org/wiki/Radial_basis_function_network). We have 1 hidden layer of 100 units with the RBF activation function, and we run a linear regression on that hidden layer. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "n_clusters = 100\n", "kMeansModel = cluster.KMeans(n_clusters = n_clusters, init = 'k-means++', algorithm = 'elkan', precompute_distances = True)\n", "kMeansModel.fit(X_scaled)\n", "prototypes = kMeansModel.cluster_centers_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The RBF kerneal is\n", "\n", "\\begin{equation}\n", "\\kappa(\\mathbf{x}, \\mathbf{x}^\\prime) = \\exp\\left(-\\frac{\\lVert\\mathbf{x}-\\mathbf{x}^\\prime\\rVert^2}{2\\sigma^2}\\right),\n", "\\end{equation}\n", "\n", "so we'll perform our linear regression with design matrix $\\Phi$, where rows of $\\Phi$ are\n", "\n", "\\begin{equation}\n", "\\phi(\\mathbf{x}) = \\begin{pmatrix}\n", "\\kappa(\\mathbf{x}, \\boldsymbol\\mu_1) & \\kappa(\\mathbf{x}, \\boldsymbol\\mu_2) & \\cdots \n", "& \\kappa(\\mathbf{x}, \\boldsymbol\\mu_{k})\n", "\\end{pmatrix},\n", "\\end{equation}\n", "\n", "where the $\\boldsymbol\\mu_j$ for $j = 1,2,\\ldots,k$ are our cluster centers. $\\sigma^2$ is parameter called *bandwidth* that we'll have to find with cross-validation." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
bandwidthmean_test_scoremean_train_scorestd_test_scorestd_train_score
01-267.152902-265.93242515.2796173.813405
12-188.522188-187.64807711.1682592.790824
24-122.894823-122.1124006.0913271.522200
38-72.431290-71.8581922.4800180.620141
416-40.163809-39.8254440.7670830.193418
532-25.264711-25.0573330.2279400.056388
664-20.167603-20.0042920.0977390.025807
7128-18.716779-18.5680640.1928180.049968
8256-18.422612-18.2773550.2282300.058791
9512-18.432984-18.2879040.2388130.061415
\n", "
" ], "text/plain": [ " bandwidth mean_test_score mean_train_score std_test_score \\\n", "0 1 -267.152902 -265.932425 15.279617 \n", "1 2 -188.522188 -187.648077 11.168259 \n", "2 4 -122.894823 -122.112400 6.091327 \n", "3 8 -72.431290 -71.858192 2.480018 \n", "4 16 -40.163809 -39.825444 0.767083 \n", "5 32 -25.264711 -25.057333 0.227940 \n", "6 64 -20.167603 -20.004292 0.097739 \n", "7 128 -18.716779 -18.568064 0.192818 \n", "8 256 -18.422612 -18.277355 0.228230 \n", "9 512 -18.432984 -18.287904 0.238813 \n", "\n", " std_train_score \n", "0 3.813405 \n", "1 2.790824 \n", "2 1.522200 \n", "3 0.620141 \n", "4 0.193418 \n", "5 0.056388 \n", "6 0.025807 \n", "7 0.049968 \n", "8 0.058791 \n", "9 0.061415 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn import model_selection\n", "\n", "class RBFNetwork:\n", " \"\"\"\n", " Implements RBFNetwork as a special case of linear regression.\n", " \"\"\"\n", " def __init__(self, mu, sigma2):\n", " self.linearRegressor = linear_model.LinearRegression(fit_intercept = True, normalize = False)\n", " self.mu = mu\n", " self.sigma2 = sigma2\n", " \n", " def fit(self, X, y):\n", " Phi = self.rbf_transform(X, self.mu, self.sigma2)\n", " linearRegressor.fit(Phi, y)\n", " return self\n", " \n", " def predict(self, X):\n", " Phi = self.rbf_transform(X, self.mu, self.sigma2)\n", " return linearRegressor.predict(Phi)\n", " \n", " def score(self, X, y):\n", " predicted_y = self.predict(X)\n", " return -(sum((y - predicted_y)**2)/len(y))[0] \n", " \n", " def get_params(self, deep = True):\n", " return {'mu': self.mu, 'sigma2': self.sigma2}\n", " \n", " def set_params(self, **params):\n", " if 'mu' in params:\n", " self.mu = params['mu']\n", " if 'sigma2' in params:\n", " self.sigma2 = params['sigma2']\n", " return self\n", " \n", " @staticmethod\n", " def rbf(x1, x2, sigma2):\n", " deltaX = (x1 - x2)\n", " distX = sum(deltaX*deltaX)\n", " return np.exp(-distX/2/sigma2)\n", " \n", " @staticmethod\n", " def phi(x, mu, sigma2):\n", " return np.apply_along_axis(func1d = RBFNetwork.rbf, axis = 1, arr = mu, x2 = x, sigma2 = sigma2)\n", " \n", " @staticmethod\n", " def rbf_transform(X, mu, sigma2):\n", " return np.apply_along_axis(func1d = RBFNetwork.phi, axis = 1, arr = X, mu = mu, sigma2 = sigma2)\n", "\n", "\n", "bandwidths = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]\n", "gridSearchCV = model_selection.GridSearchCV(RBFNetwork(mu = prototypes, sigma2 = 1024),\n", " param_grid = {'sigma2': bandwidths},\n", " cv = model_selection.KFold(n_splits = 5, shuffle = True, random_state = 2016),\n", " n_jobs = 1) ## parallel jobs are broken for a reason that I don't feel like debugging\n", "gridSearchCV.fit(X_scaled, Y_scaled)\n", "cv_results = pd.DataFrame({'bandwidth': bandwidths,\n", " 'mean_test_score': gridSearchCV.cv_results_['mean_test_score'],\n", " 'std_test_score': gridSearchCV.cv_results_['std_test_score'],\n", " 'mean_train_score': gridSearchCV.cv_results_['mean_train_score'],\n", " 'std_train_score': gridSearchCV.cv_results_['std_train_score']})\n", "cv_results" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.6/site-packages/matplotlib/figure.py:397: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n", " \"matplotlib is currently using a non-GUI backend, \"\n" ] }, { "data": { "image/png": "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\n1YZytaFcbShXG9OnTw9sLJ0hK6s2bsQPvI/plfpRvl0n7rgjvFLS0tLC23kEU642lKsN5WpDudpQ\nrjaUqw3laiM9PT2wsdRlMZ8iqsvi3r34Vq34v/+kcdmxyfzz4yhOPDHsokRERERESofk5GSio6NB\nXRalUIYMIeOjT+i8/z0mz9dkTEREREQkLJqQlTV//zv+yScZUm4Mre9uQbt2YRckIiIiIlJ2qalH\nWbJjB/6WW/hX1OUsafwAJeUez9TU1LBLiEjK1YZytaFcbShXG8rVhnK1oVxt7Ny5M7CxNCErK7yH\nvn3Z/UMaPfbOYPacclSpEnZRmeLi4sIuISIpVxvK1YZytaFcbShXG8rVhnK1MXLkyMDG0oSsrJgx\nA+bP59b0KfQfXZ/mzcMu6DfDhw8Pu4SIpFxtKFcbytWGcrWhXG0oVxvK1UafPn0CG0tdFvOpVHdZ\n/PJLfPPzmeev48WYl1mxAsppKi4iIiIiUijqsij5t28f/qab+I7aDKo4kXenazImIiIiIlJSaEIW\n6R5/HP+vD+iSsYan51XjlFPCLkhERERERA7QuZJItnYt/vHHeeKYoTS5tRXXXx92QXmbNm1a2CVE\nJOVqQ7naUK42lKsN5WpDudpQrjYSEhICG0sTskj100/4Xr34uGorZpz0CBMnhl3Q4SUnF+myWzkM\n5WpDudpQrjaUqw3lakO52lCuNlJSUgIbS0098qnUNfW45Rb2zEvg7L0bmLXmNC6+OOyCREREREQi\ng5p6yJG9+irMmkUfN5NeQzQZExEREREpqTQhizRbt+L79WPpsTfy2dm9mDYk7IJERERERORwNCGL\nJPv3w803s+PX6vTzz/OPVxzH6DssIiIiIlJiqalHJBk3Dv/OO3TbNYuRE2tw5plhF5Q/sbGxYZcQ\nkZSrDeVqQ7naUK42lKsN5WpDudoYOHBgYGNpQhYpPvgAP3Qo4ys9xAldLyMuLuyC8m/AgAFhlxCR\nlKsN5WpDudpQrjaUqw3lakO52ujevXtgY6nLYj6V6C6Lu3bhL7iAz7+tTpuq75L8SUVOOCHsokRE\nREREIpO6LEpOAwfy65b/0mnvEqYu0GRMRERERKS00ISstEtIgBdf5J5j/kr7exvTpk3YBYmIiIiI\nSH7pHrLS7Jtv8Hfcwd+rdWZNkzsYPTrsggonISEh7BIiknK1oVxtKFcbytWGcrWhXG0oVxurVq0K\n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\nrjndfvvt/O1vf6N3796sWLGCmJgY9u3bx6effsrf/vY31qxZw9lnn82jjz5KcnIy7dq1o0GDBmzb\nto3Jkydz+umnc9FFFwGZnRmrVq3Ks88+S4UKFYiKiuLiiy+mfv36ee67T58+OOfo0qULjRs3Jj09\nnXfeeYf58+fTqFEjevXqBUCTJk0YOnQoI0eO5PPPP6dTp05UrVqVL7/8kkWLFnHffffRv39/AKKj\no1m8eDEPPfQQ559/PscddxzXXHNN8YRpYP369cEN5r3Xko8FaAH42bOTvASrU6dOYZcQkZSrDeVq\nQ7naUK42lKuN7LkmJSV5wCclHf33rqQk7yHzTwuW4w8YMMCXL1/+sO/v27fPjx492p9zzjm+cuXK\nvlatWv6iiy7yo0eP9rt27fLee//mm2/6zp07+5NPPtlXrlzZ169f3996663+q6++yjHWwoUL/dln\nn+0rVqzoy5Ur5+fOnXvY/b7++uu+d+/evkmTJr569eq+cuXKvnHjxv7+++/3P/zwwyHbz5s3z7du\n3dpXq1bNV69e3Z9zzjl+4MCBftOmTQe3+emnn/yNN97oa9as6cuVK+ebNm1a0LiKTX5+/i699FIP\neKCFL+I8w/k8bsCTQznnWgBJs2cncZPOkAUqLS0tz+dmSNEoVxvK1YZytaFcbShXG9lzTU5OJjo6\nmqSkJFq0OPLvXcnJmfd4JSXBUTYtFOvxpeTJz8/f2rVrD5zRjfbeJxdlf7pkUUKn/6nZUK42lKsN\n5WpDudpQrjaOlmt8fN637KenQ6NG8NBDULnyoe/36JG5HI31+BJZqlSpEthYmpCJiIiISIlnPfHR\nxErCoi6LIiIiIiIiIdGETEI3aNCgsEuISMrVhnK1oVxtKFcbytWGcpXSZPz48YGNpQmZhK5BgwZh\nlxCRlKsN5WpDudpQrjaUqw3lKqVJ3bp1AxtLXRbzSV0WRURERIpHQbosigQtPz9/B7YhgC6LOkMm\nIiIiIiISEk3IREREREREQqIJmYQuJSUl7BIiknK1oVxtKFcbytWGcrWhXKU02bx5c2BjaUImoRs8\neHDYJUQk5WpDudpQrjaUqw3lakO5SmkyceLEwMbSg6EldM8++2zYJUQk5WpDudpQrjaUqw3lauOo\nucbHZy65pafDli3QsCFUrnzo+/l94rP1+BJRBg8ezOrVqwMZSxMyCZ3a3NpQrjaUqw3lakO52lCu\nNo6a6+EmPsnJEB2dOZkqSkdG6/FD8Nlnn9G0aVNeffVVunfvXqDP7tmzhypVqjBmzBidvcxDvXr1\nAhtLlyyKiIiIiBSDcuXKHXUpX758YGdeAJxzRfpsUT5fFNu3b2fAgAE0adKEqKgo6tSpQ0xMDI88\n8gh79uwp8HjvvPMOI0aMIC0tzaDaotEZMhERERGRYjB79uwcr2fMmMHKlSuZPXs22Z8N3LRp00D2\n17hxY3bv3k3FihUL/NlKlSqxe/duKlSoEEgtBfH9999zwQUXsHfvXuLi4mjUqBGpqakkJSXxl7/8\nhXvvvZfatWsXaMzVq1czcuRI7rzzTqKioowqLxxNyCR0Y8eO5cEHHwy7jIijXG0oVxvK1YZytaFc\nbZSFXHv27Jnj9bp161i5ciU98nkPWnp6OpXzuo/tCAozGQvis0Xxwgsv8O2335KcnEzz5s1zvLdz\n506qVatW4DGzT3iDMH369MDG0iWLErqSeOo4EihXG8rVhnK1oVxtKFcbyjWnxMREypUrx6JFi3jw\nwQc5+eSTOfbYY9m7dy+pqakMHDiQc889l2OPPZYaNWrQqVMnPv300xxjfPbZZ5QrV4558+YdXHfj\njTdy4okn8vXXX9OxY0eqVatGnTp1ePTRR3N8ds+ePZQrV45x48YdXPfQQw9Rrlw5vv76a3r16kWN\nGjU4/vjj6du3L3v37s3x+bS0NPr3788JJ5xA9erVue6669iyZcshY+Zl06ZNVK5c+ZDJGEDNmjU5\n5pic55TWrl1LmzZtOO644zj22GO58soref/99w++//DDDzN06FAA6tate/DS0O3btx+xjiNJT08v\n9Gdz0xmyApo0CebOPXS9GuwU3ogRI8IuISIpVxvK1YZytaFcbShXG4XK9bvvIC4u8+u4OFixAgp4\nKVuo4+fDkCFDqFq1Kg8++CC7du2ifPnyfPbZZyxfvpzrrruOhg0bsm3bNl544QUuv/xyPv30U2rV\nqnXY8Zxz7Nu3jzZt2nD55Zfz1FNPsXz5csaMGUOjRo249dZbj/hZ5xxdunShUaNGjB07lvfff5+p\nU6dy0kknMWzYsIPb9ujRg6VLlxIXF0d0dDQrV66kS5cu+bonrWHDhqSnpzNv3ryjNiNZvnw5nTt3\nJiYmhpEjRwIwdepULr/8ct577z2aNWtGjx49+PLLL1mwYAGTJ0+mevXqANSoUeOotRxOv379ePHF\nFwv9+ew0ISugyZNLXYMdERERkch07bWwYUPm1xs2QNu28NJLwY0fF5dz/G7dYM2a4MYLaDwfAAAW\nP0lEQVTPB+89a9euzXFWqGXLlmzcuDHHdj169OCcc85hxowZ3H///Ucc8+eff2bo0KHcd999APTt\n25dzzz2XadOmHXFCdqCeSy655OBzuPr27cu3337LtGnTDk7I1q1bx5IlS3jkkUd4/PHHgcwJTM+e\nPfnoo4+Oesx9+vRh0qRJ3HjjjYwcOZLLL7+cSy+9lGuuuSbH5YoZGRnceeeddOjQgYULFx5c/8c/\n/pEmTZowdOhQEhISaNasGc2bN2fBggV069atwPefWdOETERERERKp23bcr7esCGzRX1x7a8YxMXF\nHXKJXvZ7u/bv38+PP/5IjRo1OO2000hOTs7XuH369MnxunXr1ixduvSon3PO0bdv3xzrfv/735OY\nmMi+ffuoUKECy5cvxznHnXfemWO7u+++m1dfffWo+zjppJP4+OOPGTFiBK+99hrPP/88kydPplKl\nSowYMeJgG/7333+fLVu2MG7cOH744YeDn/fec8UVV5CQkHDUfZUEmpBJ6FJTU494al0KR7naUK42\nlKsN5WpDudooVK716sGmTb+9bt7c7gzZgf0Vs1NPPfWQdRkZGTz11FNMmTKFLVu2kJGRAWROls48\n88yjjlmjRg2OPfbYHOtq1qzJzp0781VT7mfG1axZE+89//vf/zjxxBPZsmULlSpV4uSTT86xXX5q\nO+Ckk05iypQpTJkyhf/85z8kJiYyZswYHn74YU455RR69uzJ559/DsANN9xwyOcPXF65Z88eKlWq\nlO/95ld+s8oPTcgkdHFxcSxevDjsMiKOcrWhXG0oVxvK1YZytVGoXBcuzLxMccOGzMlY0Pd4rViR\nc/xsl8UVlypVqhyybujQoTzxxBP069ePK664gpo1a1KuXDnuvPPOg5OzIylfvnye6/PbibCony+o\nRo0a0ahRI9q2bUvTpk155ZVX6NmzJxkZGTjnmDhx4mEfFWDVKfLA/WpB0IRMQjd8+PCwS4hIytWG\ncrWhXG0oVxvK1Uahcq1dO/OMWHR05p9B3xtkPX4hLViwgPbt2zN58uQc63fs2MEZZ5wRUlW/adiw\nIXv27OG///1vjrNkB85oFVbjxo2pWrUq27IuHT3jjDPw3nPcccfxhz/84YifDfoB13369AnsAd5q\n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\n7ThwTQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(10, 6))\n", "ax = fig.gca()\n", "test_error_bars = ax.errorbar(cv_results['bandwidth'], cv_results['mean_test_score'], cv_results['std_test_score'],\n", " linestyle='-', marker='.', color='b', capsize=5)\n", "train_error_bars = ax.errorbar(cv_results['bandwidth'], cv_results['mean_train_score'], cv_results['std_train_score'],\n", " linestyle='-', marker='.', color='r', capsize=5)\n", "ax.grid(True)\n", "ax.legend([test_error_bars, train_error_bars], ['Test Set', 'Training Set'], loc='lower right')\n", "ax.set_xscale('log', basex = 2)\n", "ax.set_xlabel('Bandwidth ($\\sigma^2$)')\n", "ax.set_ylabel('Score (negative MSE)')\n", "ax.set_title('Score versus Bandwidth')\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It looks like the best model has a bandwidth of about $2^{8}$. Let's compute its SMSE." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.042844306703931787" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rBFNetwork = RBFNetwork(mu = prototypes, sigma2 = 2**8)\n", "rBFNetwork.fit(X_scaled, Y_scaled)\n", "-rBFNetwork.score(X_scaled_test, Y_scaled_test)/np.var(Y_scaled, ddof=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Seems that we can only get down to an SMSE of 0.043. The next step is to try a neural network. This has more parameters to choose. In particular, we're interested in the number of hidden units, layers, and the L2 regularization parameter." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Neural Networks with TensorFlow\n", "\n", "Since I work at Google, I thought that I would demonstrate constructing a neural network in [TensorFlow](https://www.tensorflow.org/). Since I'm doing this with the intent of learning the details of the models, I'm going to eschew the high-level APIs and construct the graph mostly by hand. Much of the code is imported from [`sarco_train.py`](https://github.com/ppham27/MLaPP-solutions/blob/master/chap16/sarco_train.py).\n", "\n", "First, we'll set up our features which need to normalized. We make it so that the input has mean 0 and variance 1." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import tensorflow as tf\n", "from sarco_train import create_feature_columns\n", "\n", "feature_columns = create_feature_columns(pd.concat([training_data, test_data]))\n", "\n", "def get_feature_data(data, feature_columns):\n", " graph = tf.Graph()\n", " with graph.as_default():\n", " features = {column: tf.constant(column_data, dtype=tf.float32)\n", " for column, column_data in data.to_dict('list').items()}\n", " input_layer = tf.feature_column.input_layer(\n", " features=features, feature_columns=feature_columns)\n", " with tf.Session(graph=graph) as sess:\n", " input_data = sess.run(input_layer)\n", " return input_data, data[TARGET_COLUMN].astype(np.float32)\n", "\n", "training_input_data, training_target_data = get_feature_data(training_data, feature_columns)\n", "test_input_data, test_target_data = get_feature_data(test_data, feature_columns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Building the Graph\n", "\n", "Everything in TensorFlow is a graph. We build build it layer by layer.\n", "\n", "### Input Layer\n", "\n", "Here, we extract the features from the training data and test data and apply the feature columns to the two datasets.\n", "\n", "### Inference Layer\n", "\n", "Now, we can think about the inference layer. To keep things rather simple, I'll only use two layers. The weights and biases are initialize with noise, ReLU is used as the activation function. The first layer has 70 units, and the second layer has 50 units. Since we have an input of 21 features, the total number of weight parameters in a fully connected network are $21 \\times 70 + 70 \\times 50 + 50 \\times 1$, and we have also have $70 + 50 + 1$ bias parameters. The number of units was chosen arbitrarily. I was too lazy to implement and cross validation strategy.\n", "\n", "### Loss Layer\n", "\n", "For loss, we minimize mean squared error. This is we'll compare models." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sarco_train import inference, HIDDEN1_UNITS, HIDDEN2_UNITS\n", "\n", "eval_graph = tf.Graph()\n", "with eval_graph.as_default(): \n", " input = tf.placeholder(dtype=tf.float32, shape=(None, len(feature_columns)))\n", " prediction = inference(input, HIDDEN1_UNITS, HIDDEN2_UNITS)\n", " \n", " labels = tf.placeholder(dtype=tf.float32, shape=(None,))\n", " mse = tf.losses.mean_squared_error(labels=labels, predictions=prediction, reduction=tf.losses.Reduction.MEAN)\n", " \n", " tf.summary.scalar('mse', mse)\n", " \n", " summary_op = tf.summary.merge_all()\n", "# Reset evaluation process\n", "last_checkpoint_summarized = None" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training the Model\n", "\n", "Training the model is done in [`sarco_train.py`](https://github.com/ppham27/MLaPP-solutions/blob/master/chap16/sarco_train.py). The script was run with the command:\n", "\n", "`python3 sarco_train.py --restart --log_level=INFO --log_dir /Users/phillypham/tmp/sarco/logs`\n", "\n", "Input is fetched from a queue to avoid blocking the thread doing the training. 1024 examples are processed in each training step. In addition to minimize mean squared error, we add $L^1$ and $L^2$ regularization to deal with the large number of parameters. The scale parameter for $L^1$ was $1.0$. The scale parameter for $L^2$ is $14.0$. The variation of gradient descent that we'll use is [Adam Optimizer](https://arxiv.org/abs/1412.6980) with a learning rate of $0.01$.\n", "\n", "While the training script is running, this code runs in a separate process to periodically evaluate the model. We calculate mean squared error against the entire training set and entire test set. We can see these plotted by running `tensorboard --logdir=/Users/phillypham/tmp/sarco/logs` and visiting [TensorBoard](http://localhost:6006).\n", "\n", "Since we're using a [Monitored Session](https://www.tensorflow.org/versions/master/api_docs/python/tf/train/MonitoredSession), we can continue training from where left off by running\n", "\n", "`python3 sarco_train.py --log_level=INFO --log_dir /Users/phillypham/tmp/sarco/logs`\n", "\n", "and restarting the evaluation code below." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-1\n", "INFO:tensorflow:Writing summary for step 1\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-1678\n", "INFO:tensorflow:Writing summary for step 1678\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-3364\n", "INFO:tensorflow:Writing summary for step 3364\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-5052\n", "INFO:tensorflow:Writing summary for step 5052\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-6742\n", "INFO:tensorflow:Writing summary for step 6742\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-8430\n", "INFO:tensorflow:Writing summary for step 8430\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-10121\n", "INFO:tensorflow:Writing summary for step 10121\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-11806\n", "INFO:tensorflow:Writing summary for step 11806\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-13495\n", "INFO:tensorflow:Writing summary for step 13495\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-15180\n", "INFO:tensorflow:Writing summary for step 15180\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-16860\n", "INFO:tensorflow:Writing summary for step 16860\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-18540\n", "INFO:tensorflow:Writing summary for step 18540\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-20217\n", "INFO:tensorflow:Writing summary for step 20217\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-21918\n", "INFO:tensorflow:Writing summary for step 21918\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-23602\n", "INFO:tensorflow:Writing summary for step 23602\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-25280\n", "INFO:tensorflow:Writing summary for step 25280\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-26960\n", "INFO:tensorflow:Writing summary for step 26960\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-28642\n", "INFO:tensorflow:Writing summary for step 28642\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-30323\n", "INFO:tensorflow:Writing summary for step 30323\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-32005\n", "INFO:tensorflow:Writing summary for step 32005\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-33683\n", "INFO:tensorflow:Writing summary for step 33683\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-35363\n", "INFO:tensorflow:Writing summary for step 35363\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-37045\n", "INFO:tensorflow:Writing summary for step 37045\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-38732\n", "INFO:tensorflow:Writing summary for step 38732\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-40423\n", "INFO:tensorflow:Writing summary for step 40423\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-42118\n", "INFO:tensorflow:Writing summary for step 42118\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-43804\n", "INFO:tensorflow:Writing summary for step 43804\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-45490\n", "INFO:tensorflow:Writing summary for step 45490\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-47172\n", "INFO:tensorflow:Writing summary for step 47172\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-48858\n", "INFO:tensorflow:Writing summary for step 48858\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-50543\n", "INFO:tensorflow:Writing summary for step 50543\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-52230\n", "INFO:tensorflow:Writing summary for step 52230\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-53916\n", "INFO:tensorflow:Writing summary for step 53916\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-55598\n", "INFO:tensorflow:Writing summary for step 55598\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-57287\n", "INFO:tensorflow:Writing summary for step 57287\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-58973\n", "INFO:tensorflow:Writing summary for step 58973\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-60658\n", "INFO:tensorflow:Writing summary for step 60658\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-62341\n", "INFO:tensorflow:Writing summary for step 62341\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-64022\n", "INFO:tensorflow:Writing summary for step 64022\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-65707\n", "INFO:tensorflow:Writing summary for step 65707\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-67391\n", "INFO:tensorflow:Writing summary for step 67391\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-69078\n", "INFO:tensorflow:Writing summary for step 69078\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-70766\n", "INFO:tensorflow:Writing summary for step 70766\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-72450\n", "INFO:tensorflow:Writing summary for step 72450\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-74140\n", "INFO:tensorflow:Writing summary for step 74140\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-75830\n", "INFO:tensorflow:Writing summary for step 75830\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-77519\n", "INFO:tensorflow:Writing summary for step 77519\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-79229\n", "INFO:tensorflow:Writing summary for step 79229\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-80912\n", "INFO:tensorflow:Writing summary for step 80912\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-82598\n", "INFO:tensorflow:Writing summary for step 82598\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-84285\n", "INFO:tensorflow:Writing summary for step 84285\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-85968\n", "INFO:tensorflow:Writing summary for step 85968\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-87651\n", "INFO:tensorflow:Writing summary for step 87651\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-89335\n", "INFO:tensorflow:Writing summary for step 89335\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-91024\n", "INFO:tensorflow:Writing summary for step 91024\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-92710\n", "INFO:tensorflow:Writing summary for step 92710\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-94397\n", "INFO:tensorflow:Writing summary for step 94397\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-96088\n", "INFO:tensorflow:Writing summary for step 96088\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-97777\n", "INFO:tensorflow:Writing summary for step 97777\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-99478\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Writing summary for step 99478\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-101169\n", "INFO:tensorflow:Writing summary for step 101169\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-102850\n", "INFO:tensorflow:Writing summary for step 102850\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-104538\n", "INFO:tensorflow:Writing summary for step 104538\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-106225\n", "INFO:tensorflow:Writing summary for step 106225\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-107909\n", "INFO:tensorflow:Writing summary for step 107909\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-109595\n", "INFO:tensorflow:Writing summary for step 109595\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-111286\n", "INFO:tensorflow:Writing summary for step 111286\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-112972\n", "INFO:tensorflow:Writing summary for step 112972\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-114656\n", "INFO:tensorflow:Writing summary for step 114656\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-116338\n", "INFO:tensorflow:Writing summary for step 116338\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-118021\n", "INFO:tensorflow:Writing summary for step 118021\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-119704\n", "INFO:tensorflow:Writing summary for step 119704\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-121389\n", "INFO:tensorflow:Writing summary for step 121389\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-123079\n", "INFO:tensorflow:Writing summary for step 123079\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-124769\n", "INFO:tensorflow:Writing summary for step 124769\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-126468\n", "INFO:tensorflow:Writing summary for step 126468\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-128166\n", "INFO:tensorflow:Writing summary for step 128166\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-129857\n", "INFO:tensorflow:Writing summary for step 129857\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-131561\n", "INFO:tensorflow:Writing summary for step 131561\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-133266\n", "INFO:tensorflow:Writing summary for step 133266\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-134949\n", "INFO:tensorflow:Writing summary for step 134949\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-136636\n", "INFO:tensorflow:Writing summary for step 136636\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-138333\n", "INFO:tensorflow:Writing summary for step 138333\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-140023\n", "INFO:tensorflow:Writing summary for step 140023\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-141702\n", "INFO:tensorflow:Writing summary for step 141702\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-143392\n", "INFO:tensorflow:Writing summary for step 143392\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-145086\n", "INFO:tensorflow:Writing summary for step 145086\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-146778\n", "INFO:tensorflow:Writing summary for step 146778\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-148474\n", "INFO:tensorflow:Writing summary for step 148474\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-150174\n", "INFO:tensorflow:Writing summary for step 150174\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-151871\n", "INFO:tensorflow:Writing summary for step 151871\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-153556\n", "INFO:tensorflow:Writing summary for step 153556\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-155239\n", "INFO:tensorflow:Writing summary for step 155239\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-156921\n", "INFO:tensorflow:Writing summary for step 156921\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-158602\n", "INFO:tensorflow:Writing summary for step 158602\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-160279\n", "INFO:tensorflow:Writing summary for step 160279\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-161977\n", "INFO:tensorflow:Writing summary for step 161977\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-163659\n", "INFO:tensorflow:Writing summary for step 163659\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-165343\n", "INFO:tensorflow:Writing summary for step 165343\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-167032\n", "INFO:tensorflow:Writing summary for step 167032\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-168715\n", "INFO:tensorflow:Writing summary for step 168715\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-170392\n", "INFO:tensorflow:Writing summary for step 170392\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-172072\n", "INFO:tensorflow:Writing summary for step 172072\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-173748\n", "INFO:tensorflow:Writing summary for step 173748\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-175438\n", "INFO:tensorflow:Writing summary for step 175438\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-177123\n", "INFO:tensorflow:Writing summary for step 177123\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-178806\n", "INFO:tensorflow:Writing summary for step 178806\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-180493\n", "INFO:tensorflow:Writing summary for step 180493\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-182177\n", "INFO:tensorflow:Writing summary for step 182177\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-183862\n", "INFO:tensorflow:Writing summary for step 183862\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-185550\n", "INFO:tensorflow:Writing summary for step 185550\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-187241\n", "INFO:tensorflow:Writing summary for step 187241\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-188939\n", "INFO:tensorflow:Writing summary for step 188939\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-190640\n", "INFO:tensorflow:Writing summary for step 190640\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-192328\n", "INFO:tensorflow:Writing summary for step 192328\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-194023\n", "INFO:tensorflow:Writing summary for step 194023\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-195718\n", "INFO:tensorflow:Writing summary for step 195718\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-197414\n", "INFO:tensorflow:Writing summary for step 197414\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-199109\n", "INFO:tensorflow:Writing summary for step 199109\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-200812\n", "INFO:tensorflow:Writing summary for step 200812\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-202527\n", "INFO:tensorflow:Writing summary for step 202527\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-204216\n", "INFO:tensorflow:Writing summary for step 204216\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-205901\n", "INFO:tensorflow:Writing summary for step 205901\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-207596\n", "INFO:tensorflow:Writing summary for step 207596\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-209288\n", "INFO:tensorflow:Writing summary for step 209288\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-210977\n", "INFO:tensorflow:Writing summary for step 210977\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-212672\n", "INFO:tensorflow:Writing summary for step 212672\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-214366\n", "INFO:tensorflow:Writing summary for step 214366\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-216059\n", "INFO:tensorflow:Writing summary for step 216059\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-217750\n", "INFO:tensorflow:Writing summary for step 217750\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-219444\n", "INFO:tensorflow:Writing summary for step 219444\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-221136\n", "INFO:tensorflow:Writing summary for step 221136\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-222833\n", "INFO:tensorflow:Writing summary for step 222833\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-224524\n", "INFO:tensorflow:Writing summary for step 224524\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-226225\n", "INFO:tensorflow:Writing summary for step 226225\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-227929\n", "INFO:tensorflow:Writing summary for step 227929\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-229629\n", "INFO:tensorflow:Writing summary for step 229629\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-231323\n", "INFO:tensorflow:Writing summary for step 231323\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-233027\n", "INFO:tensorflow:Writing summary for step 233027\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-234729\n", "INFO:tensorflow:Writing summary for step 234729\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-236423\n", "INFO:tensorflow:Writing summary for step 236423\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-238118\n", "INFO:tensorflow:Writing summary for step 238118\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-239812\n", "INFO:tensorflow:Writing summary for step 239812\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-241514\n", "INFO:tensorflow:Writing summary for step 241514\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-243209\n", "INFO:tensorflow:Writing summary for step 243209\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-244904\n", "INFO:tensorflow:Writing summary for step 244904\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-246592\n", "INFO:tensorflow:Writing summary for step 246592\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-248282\n", "INFO:tensorflow:Writing summary for step 248282\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-249971\n", "INFO:tensorflow:Writing summary for step 249971\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-251664\n", "INFO:tensorflow:Writing summary for step 251664\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-253358\n", "INFO:tensorflow:Writing summary for step 253358\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-255057\n", "INFO:tensorflow:Writing summary for step 255057\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-256742\n", "INFO:tensorflow:Writing summary for step 256742\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-258426\n", "INFO:tensorflow:Writing summary for step 258426\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-260111\n", "INFO:tensorflow:Writing summary for step 260111\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-261796\n", "INFO:tensorflow:Writing summary for step 261796\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-263477\n", "INFO:tensorflow:Writing summary for step 263477\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-265166\n", "INFO:tensorflow:Writing summary for step 265166\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-266868\n", "INFO:tensorflow:Writing summary for step 266868\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-268547\n", "INFO:tensorflow:Writing summary for step 268547\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-270228\n", "INFO:tensorflow:Writing summary for step 270228\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-271914\n", "INFO:tensorflow:Writing summary for step 271914\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-273596\n", "INFO:tensorflow:Writing summary for step 273596\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-275275\n", "INFO:tensorflow:Writing summary for step 275275\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-276956\n", "INFO:tensorflow:Writing summary for step 276956\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-278637\n", "INFO:tensorflow:Writing summary for step 278637\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-280318\n", "INFO:tensorflow:Writing summary for step 280318\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-282002\n", "INFO:tensorflow:Writing summary for step 282002\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-283699\n", "INFO:tensorflow:Writing summary for step 283699\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-285401\n", "INFO:tensorflow:Writing summary for step 285401\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-287103\n", "INFO:tensorflow:Writing summary for step 287103\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-288801\n", "INFO:tensorflow:Writing summary for step 288801\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-290504\n", "INFO:tensorflow:Writing summary for step 290504\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-292212\n", "INFO:tensorflow:Writing summary for step 292212\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-293921\n", "INFO:tensorflow:Writing summary for step 293921\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-295627\n", "INFO:tensorflow:Writing summary for step 295627\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-297332\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Writing summary for step 297332\n", "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-298176\n", "INFO:tensorflow:Writing summary for step 298176\n", "INFO:tensorflow:Training stopped.\n" ] } ], "source": [ "from sarco_train import CHECKPOINT_INTERVAL_SECS\n", "\n", "CHECKPOINT_DIR = '/Users/phillypham/tmp/sarco/logs'\n", "EVAL_DIR = CHECKPOINT_DIR + '/eval'\n", "\n", "with eval_graph.as_default():\n", " saver = tf.train.Saver(tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES))\n", " \n", " training_writer = tf.summary.FileWriter(EVAL_DIR + '/training', eval_graph)\n", " test_writer = tf.summary.FileWriter(EVAL_DIR + '/test', eval_graph)\n", " with tf.Session() as sess: \n", " def write_summary(step):\n", " def write_mse(writer, features, target):\n", " summary = sess.run(summary_op, feed_dict={input: features, labels: target})\n", " writer.add_summary(summary, step)\n", " writer.flush()\n", " tf.logging.info('Writing summary for step {:d}'.format(step))\n", " write_mse(test_writer, test_input_data, test_target_data)\n", " write_mse(training_writer, training_input_data, training_target_data)\n", " while True:\n", " checkpoint_state = tf.train.get_checkpoint_state(CHECKPOINT_DIR)\n", " checkpoint_path = checkpoint_state.model_checkpoint_path\n", " # Stop running when no more new checkpoints are being generated.\n", " if checkpoint_path == last_checkpoint_summarized:\n", " break\n", " saver.restore(sess, checkpoint_state.model_checkpoint_path)\n", " global_step = int(checkpoint_state.model_checkpoint_path.split('/')[-1].split('-')[-1]) \n", " write_summary(global_step)\n", " last_checkpoint_summarized = checkpoint_path\n", " time.sleep(CHECKPOINT_INTERVAL_SECS)\n", " tf.logging.info('Training stopped.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Monitoring the training process\n", "\n", "In TensorBoard, I've been summarizing loss and the mean squared error on checkpoints as the model is training. Here's the loss plotted.\n", "\n", "![Batch Loss](nn_batch_loss.png)\n", "\n", "You can see that the model has more or less by converged 50,000 training steps. Because we're sampling batches of data, there's a lot of noise.\n", "\n", "The loss includes the regularization penalty, so when evaluating the model on the test data, it may be more helpful to look at mean squared error. The various mean squared errors are:\n", "- **Orange**: Batch that we're training on\n", "- **Blue**: The test set\n", "- **Purple**: The training set\n", "\n", "![MSE](nn_mse_all.png)\n", "\n", "## Selecting a model\n", "\n", "Of course, this isn't very helpful because of how noisy the MSE of the training batch set is. It's more helpful to look at just the MSEs from the evaluation process.\n", "\n", "![Evaluation MSEs](nn_mse_eval.png)\n", "\n", "After the model converged, there's a lot of random noise. We may possibly be overfitting by training this long. The MSE on the training and test set stay pretty close together, however. It looks like the lowest MSE is obtained by the model at step 188,939. Let's calculate the SMSE for this model." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from /Users/phillypham/tmp/sarco/logs/model.ckpt-188939\n", "MSE: 9.1203241348\n", "SMSE: 0.0217773683\n" ] } ], "source": [ "SELECTED_MODEL = CHECKPOINT_DIR + '/model.ckpt-188939'\n", "\n", "with eval_graph.as_default():\n", " with tf.Session() as sess:\n", " saver.restore(sess, SELECTED_MODEL)\n", " test_mse = sess.run(mse, feed_dict={input: test_input_data, labels: test_target_data})\n", " log_mse(test_mse)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nice. Neural networks achieve the best standarded mean squared error. Of course, training this model took the longest, and the details of why it works are already obscure after only two layers." ] } ], "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.1" } }, "nbformat": 4, "nbformat_minor": 1 }