909 lines
319 KiB
Plaintext
909 lines
319 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Chapter 10 – Introduction to Artificial Neural Networks**"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"_This notebook contains all the sample code and solutions to the exercices in chapter 10._"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Setup"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"First, let's make sure this notebook works well in both python 2 and 3, import a few common modules, ensure MatplotLib plots figures inline and prepare a function to save the figures:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# To support both python 2 and python 3\n",
|
||
"from __future__ import division, print_function, unicode_literals\n",
|
||
"\n",
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import numpy.random as rnd\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# to make this notebook's output stable across runs\n",
|
||
"rnd.seed(42)\n",
|
||
"\n",
|
||
"# To plot pretty figures\n",
|
||
"%matplotlib inline\n",
|
||
"import matplotlib\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"plt.rcParams['axes.labelsize'] = 14\n",
|
||
"plt.rcParams['xtick.labelsize'] = 12\n",
|
||
"plt.rcParams['ytick.labelsize'] = 12\n",
|
||
"\n",
|
||
"# Where to save the figures\n",
|
||
"PROJECT_ROOT_DIR = \".\"\n",
|
||
"CHAPTER_ID = \"ann\"\n",
|
||
"\n",
|
||
"def save_fig(fig_id, tight_layout=True):\n",
|
||
" path = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID, fig_id + \".png\")\n",
|
||
" print(\"Saving figure\", fig_id)\n",
|
||
" if tight_layout:\n",
|
||
" plt.tight_layout()\n",
|
||
" plt.savefig(path, format='png', dpi=300)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Perceptrons"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sklearn.datasets import load_iris\n",
|
||
"iris = load_iris()\n",
|
||
"X = iris.data[:, (2, 3)] # petal length, petal width\n",
|
||
"y = (iris.target == 0).astype(np.int)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([1])"
|
||
]
|
||
},
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.linear_model import Perceptron\n",
|
||
"\n",
|
||
"per_clf = Perceptron(random_state=42)\n",
|
||
"per_clf.fit(X, y)\n",
|
||
"\n",
|
||
"y_pred = per_clf.predict([[2, 0.5]])\n",
|
||
"y_pred"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Saving figure perceptron_iris_plot\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\nYsSIbPHef/99Fi9eTKtWrfjqq68oXtxRgr7wwgs0aNCAIUOGcM8991ClShUA3n33XSpUqMD333+P\nr69vllhHjx7N+Hfp0qXZt28f1113XZZ9du3aRePGjRk2bBhfffWVS/eooKnoFpEiJTDQj4iIPkAf\nrLVuHxNcvXoFvv/eMUYtJSUlz3fZc5Jf1+Vp98fT8vEEjRvXYPPmyfTr9yaffBKTpe3QoV2MHx9C\n586v0rJlP90vEZE8DBs2jHfeeYfRo0fTq1cv/P2d9xbat28fa9eupXbt2lkKbnAU49OnT2f16tUc\nOHDAaVfr/FK/fn2XCu7MSpQokW2bt7c33t7eLh3fv39/9u/fz7Rp04iIiGDUqFEYY6hZsyZ33303\nAwYMoFy5chn7L1myhL179zJ69OgsBTfArbfeyj333MOiRYs4ceIEAQEBeZ5/zpw5GGOIjIzMKLgB\nKlasyDPPPMPw4cOZN28eL774Ykabj4+P09+Bmcee+/j4ZCu4AWrWrEmrVq1YsWLFRf1tlp9UdItI\nkeVpBUl+/VDPr+vytPvjafm40xVXlOSDD56lXbt6DBjwNidPns5oS04+w8cfP8WuXSvo0WMWAQFX\nuTFTERHPduWVVzJ06FCGDh3Kq6++6vRJK5AxxrdFixbZ2owxhIaG8tNPP7F9+/YCLbpDclpr1Ima\nNWtSt25d5s+fz759++jYsSMtW7akXr16WX6n7t27l9mzZ2fZduWVV2bpsj1+/HiGDBnCF198waZN\nm9iyZQtbt25l586dzJw5k6+++org4GDA0bXcGMOPP/7IqFGjsuV16NAhUlNT+fnnn2nQoEGe17F9\n+3b8/PycdvVu1aoV1tosY7AffPBB3njjDerUqcMDDzxAq1atuOWWW5y++fDf//6XCRMm8M0333Do\n0KEsT/+NMfz9999ce+21eeZY0FR0i4iIuIExhh492tCkyU107z6J7dt3Z2n/7rsljB59M717z6VG\njVZuylJExPMNGDCAGTNmMGnSJPr27et0n+PHjwPkWIClPzFN36+gnE8BWKxYMdasWcPIkSOJiori\nueeew1rL1VdfTf/+/Rk+fDjGGPbs2UNERESWorty5cpZim6AMmXK0L17d7p37w7An3/+Sf/+/fns\ns8947LHH+PbbbwHHWGlrLR9++GGOuRljOHnypEvXcfz4cYKCnK/S4ey+T58+nRtuuIHZs2czduxY\n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\n6BYREbkEXX/9taxePZahQ+/P1ushIeEvZsy4i08/fZazZ8+4KUMREZHLg4puERGRS5S3d3EiIrrx\n1VcRTicaXLVqCpGRt3Do0E9uyE5EROTyoKJb5BJn09eO8hCpqan5Fis5OTlf4pw+fTpf4iQlJeVL\nnLNnz+ZLHE977T0tn8tJy5Z12LJlKu3bZ1+rfd++bxk3rgEbNszWayQil6z33nsPLy8v3n//fXen\nIpchFd0il6CEhEReeultWrZ8jNtvD6dly8d46aW3SUhIdEs+Bw8e4bbbBlKjxr00atSZGjXu5bbb\nBnLw4JHzjvXtt79xww33U7VqRxo1uo+qVTtyww338+23v51XnPnz11K+fEeqVu1IkyYPUrVqR8qX\n78j8+WvPK86KFduoWNERJySkC1WrdqRixY6sWLHtvOKsX/8DQUGdqFq1I8HBjusLCurE+vU/nFcc\nT3vtPS2fy9lVV5UiKuoFpk9/DF9f7yxtSUmneP/93rz77kMkJh5zU4YiIq7Zu3cvXl5e3HXXXS4f\nY4wp0AlGv/nmG+6//34qVqyIr68vZcqUoWbNmnTr1u2iC/05c+boDYMiTkuGiVxiEhIS6dRpCGFh\n+xkzxmIMWAtxccvp1Ok7Fi6MLNT1mg8ePELz5o/Rr18yISGk5WOJjd1D8+aPERPzlsvra3/77W90\n6DCIZ54hUyyIjT1Lhw6DWLx4EvXrV80zzvz5axkyZCrPPXduHBgyxLEcWdeuLfOMs2LFNsLDI3j2\n2exxwsMjePfdEbRr1yDPOOvX/0DXri86uS5L164vMn/+WJo1q51nHE977T0tH3H80fnEE3fRtGkt\nunefxK5d+7K0b9nyEb//vonw8A+54YZb3JSliEj+u/fee7nlllu47rrr8j32e++9R3h4ON7e3tx1\n113ceOONGGP46aefWL58OTExMfTo0eOizqEVSYo2PekWucRERs4lLGw/ISGOIgccRVxISCphYQeY\nOHFeoebTs2cE/fol07gxWfJp0gT69k2mV68Il2N17jyUZ57BaawBAxztrhg0aGqucQYNmupSnN69\nI3KN07u3a9f20EPDc43z0EPDXYrjaa+9p+Uj/6pTpwobN77Ko4/enq3t8OE9vPpqc5YvH0dqaoob\nshORglKYQ0g8bbhKYGAg1atXJzAwMF/jJiYmMmDAAEqVKsX27dtZsGABEyZMYPz48SxcuJC//vqL\n2bNnX9Q5PO1eyvlT0S1yiYmJiSM42PkP5+DgVKKjNxdqPvHx8YRkH0YKOIrK+Ph4l2MZczbXWF5e\nro2F9vMj1zj+/s7bzuXrm3ucEiVci+PtbXON4+Pj2i9bT3vtPS0fycrf35fXXuvLxx8/z5VXlszS\nlpqawqJFLzJt2m38888BN2UoIvkhISGBYcOepmnT62nTphJNm17PsGFPk5CQUKTPda5evXrh5eXF\nnj17mDRpErVr16ZEiRL07t0byHlM97Zt27jvvvuoXLkyJUqU4JprriEkJIRx48a5dN4dO3aQkJBA\nq1atuOmmm7K1FytWjDZt2jg9dtGiRbRp04YyZcrg5+dHnTp1mDRpUpb5bx555JGMa0i/Ri8vL4oV\nK5YlVnx8POHh4Rnd2ytVqkSfPn3Yty9rjyaAQ4cOMWDAAKpXr46/vz+lS5emVq1a9O3bN8tr9csv\nvzBkyBAaNmzIVVddhZ+fHzVq1OCFF17g5MmTLt0fcVD3cpFLiLUWH59kcuqBZAz4+CRjrS2Ubkqp\nqamULGlzzcff35KamoqXV+7vASYnJxMYSK6xAgIc+xUvnvOPttOnT7sU5/Tp05TIpWpOSkpyKU5S\nUhI+Pj45xjl79qxLcc6ePYu3t7fznfC8197T8pGcdep0Cw0bVqNXrymsX78zS9tPP61hzJib6dlz\nNnXr3u2mDEXkQiUkJNC+/S2Ehe1izJjUTMN8XqN9+9UsXbox3578Fua5nEkfs92/f39iY2MJCwuj\nQ4cOXHPNNVnaM/vvf/9L06ZNKV68OPfccw+VK1fm6NGj7Ny5k7fffpthw4bled6yZcsCsHv37vP6\nnTZs2DDGjx9PxYoV6dy5M1dccQXR0dEMHjyYzZs38/HHHwPQqVMnjh07xqJFi+jYsSP16tXLuJ50\nv/zyC02bNuXw4cN06NCBWrVqsWPHDmbNmsXSpUtZv3491apVAxxP5m+99Vbi4+Np164d9957L0lJ\nSfz+++/MnTuXwYMHZ7xOCxYsYPbs2bRq1YpWrVqRmprKpk2bmDBhAtHR0URHR2cr/sU5Fd0ilxBj\nDElJxbHWeRFnLSQlFS+0IsfLy4uTJ03aLyHn+Zw8afIsuAGKFy9OQgK5XltCArkW3AAlSpRwKU5u\nBTeAj4+PS3FyK7gBvL29XYqTW8ENnvfae1o+krugoKtZsWI0r7zyKWPHfpLlKcvJk4d5/fUOtGzZ\nn86dJ+Lt7WIXDhFxu1deeZGwsF2EhPz7PZ0+zAd2MX78cMaOnVbkzpUTay3ff/8927dvp0KFCnnu\n/8EHH5CUlMSnn35K+/bts7T9888/Lp3zhhtuoGHDhmzdupUWLVrQs2dPmjRpQs2aNXP8++brr79m\n/Pjx3HnnnURFRWX5m+PJJ59k5syZLFy4kE6dOtGhQwf++eefjKLb2djwxx9/nMOHD/PWW28RHh6e\nsf3NN9/kySefpG/fvnz99dcArFq1ij179vDss8/y6quvZolz6tSpLH9v9OjRg0GDBmX722rMmDG8\n/PLLfPLJJ3Tt2tWl+3S5U/dykUtM8+bBxMU5/9aOi/MiNDSHfswFJCgoiNhY522bNkHlykEux7LW\nO9dY1uZemKZLTCTXOIkuTqx95kzucc6ccS3O2bMm1zhnz7pWmHraa+9p+UjuihcvxksvPciqVWOo\nVOmqbO1r185g/PgQDh7c6eRoEfFE69YtITjY+VKdwcGprFu3uEieKyfGGIYMGeJSwZ2ZszfaS5cu\n7fLxUVFRNGvWjG+++YZHH32UOnXqUKpUKW677TbmzJmTbbnUGTNmYIxh5syZ2c49fvx4AObPn+/S\nufft28fatWupVatWloIbHMX4TTfdxOrVqzlwIOtQIWfX7O/vn6Xovu6665w+zHjyySex1rJy5UqX\nchQ96Ra55AwZ0p1Onb4DDhAcnLl7lxfLllVk4cJuhZrPnDkjaN78MaxNpkmTf2fm3rQJ3nijODEx\nI1yOFRU1ng4dBjFgANliTZ0KS5aMdynOpEkDGTJkao5xJk0a6FKcWbNGEB4ekWOcWbNcu7YPPxxD\n164v5hjno4/GuBTH0157T8tHXNO0aS22bJnKE0+8xsKFG7O0HTjwPa+80oguXabSrNmj6qkg4sGs\ntfj6ns1jmM/ZfBnmU5jnyktwcLDL+3bp0oWpU6fSsWNHHnjgAW677TZCQ0MpX758lv0WLVrE9u3b\ns2xr2bIlLVq0ABwPGKKjo/nuu+9YuXIlcXFxbNiwgdWrV7Nq1So++OADli9fnlHQxsbGUrJkSd59\n991sOVlr8fPz48cff3TpGtLzSs8lM2MMoaGh/PTTTxlP/0NDQ7nuuusYP34827dvp3379rRo0YKa\nNWs6jT9r1izmzJnDjh07OHbsWMYbCMYYDh486FKOoqJb5JITGOjHwoWRTJw4j+HDN+Pjk0xSUnFC\nQ0NYuLBboS/RVL58GWJi3qJXrwjeeScef3/LqVOGoKAgYmJGuLxcGED9+lVZvHgSnTsP5c03MuMy\nSgAAGyJJREFUzxIQACdOQGqqN0uWjHdpuTD4dzmwQYOm4u9PRpxTpxwFtyvLhQG0a9eAd98dQe/e\nEZQo8W+c06cdBbcry4UBNGtWm/nzx/LQQ8N5802bEScpyfDRR2NcWi4MPO+197R8xHWlSwfw0UdD\nePfdFQwa9C6JiUkZbWfPJjJv3uPs3LmC7t3fpmRJ158GiUjhMcZw5ox3rsN8zpzxzpciuDDPlZdr\nr73W5X1DQkJYt24d48aNY/78+bz33ntYawkODmbChAm0bNkSgM8//zzbBGzGmGyFbt26dalbt27G\n/6Ojo+nWrRtr1qzh9ddfZ8CAAQAcOXKElJQUIiJyXuXk1KlTLl3D8ePHgZyvO32JtPT9SpUqRWxs\nLCNGjGDJkiUsX74cay2VKlVi6NCh9O3bN+PYp556itdee42goCDuuecerrvuOnx9fQEYOXIkZ1zt\n0icqukUuRYGBfkRE9AH6eMREVeXLl2HFCscyXK5Mmpab+vWrsnv3p0Dek6blpmvXlhnFdV6TpuWm\nXbsG7N//OZD3pGm5adasNvHxC4G8J03Ljae99p6Wj7jOGEOfPrdz66216N79VXbs2Jul/dtvo9iz\nZzPh4R9SrVozN2UpIrlp0eJu4uJeyzLOOl1cnBctW3YokufKzfn+nmnatCnLli3jzJkzxMbGsmTJ\nEl577TXat2/Pjh07qFKlCrNnz76gZb9CQ0MZPXo0vXv3ZvXq1RlFd6lSpfDy8uLPP/8875jnKlWq\nFAB//PGH0/ZDhw5l2Q+gYsWKzJo1K2MM/IoVK5g+fTr9+/enTJkyPPDAA/z111+8/vrr1KtXj40b\nN2YU2+nnGjly5EXnfjnRmG6RS5ynFTkXU3Cf60IL7nNdaMF9rgstuM91oQX3uTzttfe0fMQ1tWpV\nYsOGiTz55F3Z2v75Zx+TJrVg6dJRpKQkuyE7EcnNCy+MZdmymmze7EX6Us/WwubNXixbVpOhQ10b\nvuRp5yoIvr6+hIaGMnHiRIYNG0ZiYmLG5GMXIyAgINu2xo0bc/jwYX777TeXYhQrVgxrLSkpKdna\n0mczj46Odnps+vb0/TIzxlC3bl2ee+45PvzwQ6y1LF7sGHufPht7mzZtshTcuZ1LcqaiW0RERHJV\nooQPU6c+RlTUMMqWzbrkj7WpLF06kilTWnPkSLybMhQRZwIDA1m6dCPHjvXnpZeqEBFRgZdeqsKx\nY/3zfQmvwjxXftm0aZPTLtLpT4ddeVN+z549vPbaa5w4cSJb26lTp5g6dSrGGJo3b56x/emnn8Za\nS+/evTly5Ei24/74448sY7rLlHEMxXO25nalSpVo1aoVP/zwA7NmzcrSNnPmTHbt2kWbNm0yJpfb\nuXOn0yfs515z5cqVAdiwYQM2/V0UYP/+/QwbNkxvpJ8ndS8XERERl9x9dwhbtkylV68prFu3I0vb\nr7/GMGbMzXTv/g4NGnR2U4Yicq7AwMC0pbqmFfgwn8I814XIXDwCTJgwgTVr1hAaGsr1119PiRIl\n2LZtG6tWraJatWp06tQpz5jHjh3jqaeeYvDgwTRv3pzatWvj5+fHgQMHWLZsGUeOHKFRo0b0798/\n45jbb7+dl156iTFjxlCtWjXuuOMOKleuzOHDh/n111+JiYlh7Nix3HTTTQDccsst+Pn5MXXqVI4c\nOcLVV18NwIsvvgjAG2+8QfPmzXnsscdYsmRJxjrdS5Ys4dprr+X111/POPfXX3/N4MGDadq0KdWr\nV6ds2bLs3r2bxYsX4+fnR79+/QAoV64cnTt3ZsGCBTRq1Ig2bdpw6NAhli1bRps2bVx+Si8OKrpF\nRETEZRUqlOXLL0cxceICRo2aT0rKv+M3T506yltv3Ufz5o9z//2T8fHxd2OmInKuwiyCC/pcxphs\n58jrnOe2P/nkk1x55ZXExsYSHR2NtZagoCCGDx/OwIEDnXYNP1fNmjVZsGABX331FbGxscybN49/\n/vmHUqVKUbt2bTp37swTTzyRbQjaqFGjaNGiBdOnT2f16tUcPXqUsmXLcv311xMREUG3bv+u8FG6\ndGmioqIYOXIk77zzDomJiRhjMoru6tWrs2XLFkaNGsWXX37JF198wdVXX014eDgjRoygUqVKGbFu\nv/129u7dS3R0NAsXLuTEiRNUqFCBrl27Mnjw4IxCH2DOnDlcf/31REVFMWPGDIKCgnjuuecYPHgw\nUVFRHvemiicz577jczkzxjQAtsbGTnJ5FmQREZHL1aZNP9Kjx2T27MneVfG662rRp89HVKhQxw2Z\niVy64uO3MW5cQ7Zu3UqDBq6tkiEiOdu2bRsNGzZk2LCtBAXl/D2V/r0HNLTWbjufc2hMt4i45FJ+\ngy6/ri05WRNJyeWlSZObiIubwv33Z5+9/H//28krrwSzdu1rl/TPDxERkbyoe7mI5CghIZHIyLnE\nxMRlrLHcvHkwQ4Z0L/JrLOfXtX377W907jwUY84SGAgJCWCtN1FRrq8bLlKUXXFFSebOHUS7dvUZ\nMOAtTp36d1Ki5OQzfPRRf3buXEGPHrMICCjrxkxFRETcQ0W3iDiVkJBIp05DCAvbz5gxFmMcS3/E\nxS2nU6fvWLgwssgW3vl1bd9++xsdOgzimWcgJISMOLGxZ+nQYRCLF2uoilwejDH07NmGJk1u4uGH\nJ7F9++4s7d99t5gxY27mkUfmUqNGS/ckKSIi4ibqXi4iTkVGziUsbD8hIY6iFBxFZUhIKmFhB5g4\ncZ57E7wI+XVtnTsP5ZlnoHFjssRp0gQGDHC0i1xOatSoQEzMBAYM6JCt7ejRA0yd2ppFi4aTknLW\nDdmJiIi4h4puEXEqJiaO4GDn4zCDg1OJjt5cyBnln/y6NmPOEhLivK1JE/DyUmEhlx9fX28mTuzN\nokXDufrqK7K0WWtZvnwskya14O+/97gnQRERkUKmoltEsrHW4uOTTE4rQRgDPj7JRXJypPy6tuTk\nZAIDyTVOQIAmV5PL1513NmLLlim0aXNztrbduzcydmw9tmz52A2ZiYiIFC4V3SKSjTGGpKTi5FR3\nWgtJScWL5PqM+XVtxYsXT5s0Lec4CQmO/UQuV9ddV4Zly17mlVd6Urx4sSxtiYnHeOedB3n//XDO\nnDnppgxFREQKnopuEXGqefNg4uKc/4iIi/MiNDSHftVFQH5dm7XexMY6b9u0ydEucrnz8vJi0KBO\nREePp2rVctnaN2yYxbhxDYmP/9YN2YmIiBQ8Fd0i4tSQId1ZtqwCmzd7ZTzNtRY2b/Zi2bKKDB7c\nzb0JXoT8uraoqPFMnQobN5IlzsaNMHWqo11EHBo1upHNm6fQrVvLbG1//PETkZFNWLVqapEctiIi\nIpIb9XsUEacCA/1YuDCSiRPnMXz45oy1rENDQ1i4sFuRXS4M8u/a6tevyuLFk+jceShvvnmWgAA4\ncQJSU71ZskTrdIucKzDQj9mzB9Kmzc08/fRMTpw4ndGWnJzEp58+w65dX9Oz53sEBl7txkxFRETy\nj4puEclRYKAfERF9gD5Ya4vkGO6c5Ne11a9fld27PwUck6ZpDLdI3rp3b5WxpvfWrb9madux4wtG\nj67LI498QM2abd2UoYjn27Vrl7tTELkkFMb3kv46FBGXXEoF97ny69pUcIu4rlq161i37hVefvlD\nJk1amKXt+PFDTJ/ejnbthtChw2iKFdP8CCLpAgKuwtfXn+7du7s7FZFLhq+vPwEBVxVYfP2FKCIi\nIm7h4+PNK6/0pHXruvTuPY0//jia0Wat5auvJvDjj6vp02c+V1+t4RoiAGXKBPHyy7s4ceJvd6ci\ncskICLiKMmWCCiy+xxbdxhgfYDTQDSgDfAcMt9audOHY8sBU4DYck8WtAZ6x1v5ecBmLiIjIhbjt\ntvps3TqVPn2m8+WX27K07d0bx9ix9ena9Q0aNy66EziK5KcyZYIKtEAQkfzlybOXvw8MBOYCTwPJ\nwBfGmFtzO8gYUxJYCzQHxgAjgPrAWmNM6YJMWERERC7MNddcyeefD+fVV3vj7Z31mcDp0wnMnt2d\n2bN7cPp0gpsyFBERuTAeWXQbY0KALsBQa+1Qa+07QBtgLxCZx+H9gKpAmLV2krV2GtAOKA8MKsC0\nRTzSRx9FuzsFkXynr+tLk5eXF08/3YH16ydw443ls7XHxn7A2LEN2Lt3ixuyK1hxcfPdnYJIvtLX\ntMi/PLLoBu7D8WT77fQN1tozwLvALcaYCrkc2xmIs9Zm9E+z1v4ErMJRyItcVj7+OMbdKYjkO31d\nX9rq169KbOwkevZsk63tr79+JTLyVlaseJXU1FQ3ZFcwVKDIpUZf0yL/8tSiux7ws7X2xDnbN2dq\nz8Y4piCuCzh7C3wzUDWt+7mIiIh4sIAAP95++yk++GAQpUr5Z2lLSTnLggWDmTHjTo4dO+SmDEVE\nRFzjqUX3dcD/nGz/H2BwdBV3pgzgm8ux5HKsiIiIeJgHHmhOXNwUGjeuka1t584VjBlzMzt2LHdD\nZiIiIq7x1KLbDzjjZPvpTO05HccFHisiIiIe6Prrr2X16rEMHXo/jk5t/0pI+JMZM+7is88Gcfas\ns1//IiIi7uWpS4Yl4nhifa4SmdpzOo4LPDZjnx9/3J9XfiJFxvHjJ/n229/cnYZIvtLX9eWpU6cm\nVKp0FS+/PI+//z6epW3lysl8//0yOnZ8hbJlK7spwwuXmHiM+Phtee8oUkToa1ouNYcO7Ur/Z4nc\n9nPGWGvzN5t8YIxZAZS31v7fOdtbAyuBu621y5wcZ4BTwLvW2v7ntEUALwJXOBkrnr7PQ8C8/LkK\nERERERERucR0s9Z+eD4HeOqT7u1AS2NMwDkFchPAprVnY621xpjvgUZOmhsDu3MquNN8BXQD9vBv\nd3QRERERERG5vJUAquCoGc+Lpz7pDgE2Ac9ZayenbfMBdgB/WWubpm2rBPinLQmWfuwQ4BUgOH3Z\nMGNMjbRjI621LxbqxYiIiIiIiMhlyyOLbgBjzMdAR2Aq8CvQC8cT7NbW2m/S9lkLhFprvTIdFwB8\nCwQCr+JY7/sZHLOe17fWHi68qxAREREREZHLmad2Lwd4GBgNdAdKA98BYekFdxoLpGY+yFp7whjT\nApiCYwy3F7AGeFYFt4iIiIiIiBQmj33SLSIiIiIiIlLUeeo63SIiIiIiIiJFnopuHJO0GWMmGGP2\nG2NOGWM2GWPaujsvkQtljClpjBlljFlujDlsjEk1xvRwd14iF8IY08gYM8MYs8MYc8IYs9cY87Ex\n5kZ35yZyoYwxtYwxnxhjfjPGnDTG/GWMWWeMae/u3ETyizFmeNrfIN+5OxeRC2GMaZH2NXzuR0ra\n5N8u8eQx3YXpfaATjnHg6ZO2fWGMaWmt3eDOxEQu0FXAS8Be0pbgc2s2IhfneeBW4FMc83uUA54C\nthljGltrd7ozOZELVBkIAN4DDgL+QGdgsTHmMWvtO27MTeSiGWMq4Pj5ndtyvSJFxVRgyznbfnX1\n4Mt+THem5ckGWWunpG3zxbHE2B/W2mbuzE/kQhhjvIHS1to/jTENgTigl7X2fTenJnLejDFNgC3W\n2uRM26rh+Dn9ibVWvTjkkmCMMcA2wNdaW8vd+YhcDGPMR0BZHA/5ylpr67o5JZHzljZB9xrgPmvt\ngguNo+7lcB+OZcXeTt9grT0DvAvckvYunUiRYq09a6390915iOQHa+2mzAV32rZfcRTdNd2TlUj+\ns44nIfuAK92di8jFMMaEAvfiWLZX5JJgjAkwxhS7kGNVdEM94Gdr7bldXzZnahcREc9zLfC3u5MQ\nuRjGGH9jTFljzA3GmGeAO4GV7s5L5EIZY7yA6cDb1tod7s5HJJ/MBo4Dp40xq9N6krpMY7rhOuB/\nTrb/DzBA+cJNR0RE8mKM6Q5UAIa7OxeRizQJeDzt36lAFI45C0SKqr5AENDa3YmI5IMk4DPgCxxv\n9NcCngOijTG3Wmv/60oQFd3gB5xxsv10pnYREfEQxpibgBnANzgmwhQpyqbgmCSwPNAFKAb4ujUj\nkQtkjCkDjAIirLVH3J2PyMWy1m4ENmbatNQYE4VjYtdXgLtciaPu5ZCI819uJTK1i4iIBzDGXAMs\nA/4B7reX+2ygUuRZa3+21q621s611nbAMaP5UnfnJXKBxgKHcbwxKnJJstb+BiwCWqVNgJknFd2O\nbuTXOdmevu1gIeYiIiI5MMaUAr4CSgF3WGsPuTklkYIQBTTUOvRS1KStKvEojvHcFYwxlY0xVXA8\nyPJO+39pN6Yokp/2AT5ASVd2VtHtWMO4ujEm4JztTQCb1i4iIm6UtpTjEqAaEGat/cnNKYkUlPRh\nbVe4NQuR81cBx3xI04Hf0z52A42BGmn/fslt2Ynkr6rAaSeTcTulMd2OgfHPAY8BkwGMMT5AL2CT\ntfaA+1ITEZG0mXA/wfFmaAdr7eY8DhHxeMaYq621f52zrTjQE8fQtp1uSUzkwu0AOjnZPhbHsImn\ncRTeIkWGMeYqa+3f52y7Gbgbx3A3l1z2Rbe1drMx5lPgFWPMtcCvOAruysAj7sxN5GIYY/rhWOs1\nfa35DsaYSmn/nm6tTXBPZiLnbTKOX26LgauMMd0yN1pr57klK5GLMzNtyEQ0cAAoB3TD8UTwWWvt\nKXcmJ3K+rLWHcfycziJtKTxrrV1S+FmJXLSPjTGJwAbgT6A2jmEUJ4AXXA1iNAdNxpPt0UB3oDSO\n2eiGW2u1TqYUWcaY33Es2eHM9dba+MLMR+RCGWPWAKE5tVtrixViOiL5whjTBQgH6gBlgQRgK443\nRV1+eiLi6dJ+hpex1t7s7lxEzpcxpj+ON0Sr4ZhT5i9gJY4Z+l3uuaGiW0RERERERKSAaCI1ERER\nERERkQKioltERERERESkgKjoFhERERERESkgKrpFRERERERECoiKbhEREREREZECoqJbRERERERE\npICo6BYREREREREpICq6RURERERERAqIim4RERERERGRAqKiW0RE5DJgjEk1xqx2cd8WafuPKOi8\nCpIx5r206whydy4iInL5UtEtIiJyAYwxldMKuswfZ4wx8caYecaYOhcZXwVjHlx4c8CmfYiIiLhN\ncXcnICIiUsT9CsxN+3cA0AToCnQyxrSx1m68wLgqGEVERC4BKrpFREQuzq/W2ojMG4wxo4EXgbFA\n6wuMay42scuA7pGIiHg8dS8XERHJf/9J+xyceaMxxtsY86wxZqsx5oQx5rgxJtoYc/c5+/0O9Ej7\n755M3ddXZ9qnkzHmQ2PML8aYk8aYo2mx7i3ICzPGXG2MmZJ23tPGmL+MMZ8ZY2o72XePMWa3Maak\nMWaaMeZA2jH/NcZ0ziF+ZWPMx8aYw8aYBGPMWmNMc2PMyLR7EJq238vAahy9AdLbUo0xKU665Btj\nzNPGmF1p599jjBlhjFHRLiIiBU5PukVERPKfPeczxhgf4CugBfAt8A7gDYQBi4wx/a21r6ftPgV4\nBKgLTAWOpm3fk+kc44AzQAzwP+BqoAPwmTHmKWvta/l9UcaYG4B1QHlgBbAQuAboDNxujGltrY3L\ndIhNu8YVwJXAZ4A/8CDwsTHmDmvtykzxywMbgWuB5cB2oAbwNf8W2OnWAJWBXsDatI90R8nqVSAU\nWAp8CXQERqbl9tJ53gYREZHzoqJbREQk//VP+xybadvLOAq/UdbaUekbjTFDcBSQk4wxC6y1h6y1\n040x9Ukruq218U7Ocae1dk/mDcaYgTiK1tHGmHettafz75IA+ABHQXyHtfbrTOcdA2wF3gbqnXNM\neWAz0MJam5y2/3xgJfBs2ud0E9LiD7PWTsgUvxcwi0xFt7U2Ou1JdS9g7bld/DMxQH2gjrX2z0z5\n/gI8ZYwZlZ6XiIhIQVD3chERkYtTzRjzctpHpDFmHY6np4nAcHD0bQaeAH7LXHADWGtPAhGAL+By\n1/BzC+60baeA94ArOKdr+8UyxtQDbgHmZC640877K46Cu44xppaTw5/JXNhaa1cDezPnmNYT4D7g\nT2DyOfHfA366wNQtEJFecKfFOwwsAgJxPEkXEREpMHrSLSIicnGqAulLVp0F/sAxm/kEa+0Padtr\nAKWBA2ljkc91Tdrnm1w9qTHmauAF4A4c3az9MjVbHE+Y81OTtM/lcriGmzJ93plp+9EcntTvzxQT\nHPfIF9hirT3rZP8NQPXzSznDthzOD45u7yIiIgVGRbeIiMjF+cpae1ce+5RJ+1w77cMZC5R05YTG\nmNLAFqAi8A2OMc9HgRQc3bvvwVHA5qf0a7gr7SMn517DsRz2SyZrj7tSaZ//dLIvON7MuFDHczg/\nQLGLiCsiIpInFd0iIiIFL73oi7LWdsmHeH1wFNzDrbWvZG4wxjyPo+jOb+nX8FSmCd8KIv41ObRf\nWwDnFBERKXAa0y0iIlLwduEoKhsZY1x9spqS9tnZ/jekfV7spC30PHNzVfqkcLcUUPyfcMzG3tAY\n4+2kvYmTbbndIxEREY+goltERKSAWWtTgDeAKjhmKc/W08wYUzttnHa6I2mfKzkJuRfHrNzNzonx\nEHBnfuR8rrSlwGKBrsaYbE/rjcMFF/zW2iQcS4pdCww8J3ZPoKaTw3K7RyIiIh5B3ctFREQKx8s4\nlq56CggzxkTjGL9cHsfSYHVxPEX+K23/1cBzwNvGmCjgJLDXWjsXx9JdzwMzjDGtcRThdYE2QBSO\ndbMLQte0vD5KW55sG45Z2oPScr8KxzrcF+oFoC0w3hjTEsd65jVwrGW+HMekcamZ9v8ROAg8aIxJ\nwjE5mgWmW2sTLiIPERGRfKOiW0RE5MJZMq0dneuO1iYZY+4EwoEeOJYH88UxQdhO4HXg+0z7f2mM\nGQw8imM9a29gHTDXWnsg7alyJI5CuziOAvg2HDOZO1t6zOVcc9rfWrsnbf3wZ4GOONbITgH+l5bb\npznEye0cmePvN8Y0wbFedzscXeW3pv07/en68Uz7pxpjOqXt/yCOJcDA8aZEetF9PtcsIiKS74y1\n+l0kIiIins0Ysx5oDFyRth65iIhIkaAx3SIiIuIxjDHlnGzrBtwKfK2CW0REiho96RYRERGPYYz5\nG8dY7p38u+54SxzrfTez1v7gvuxERETOn4puERER8RjGmNHA3TgmZyuJY2K51cAYa+3P7sxNRETk\nQqjoFhERERERESkgGtMtIiIiIiIiUkBUdIuIiIiIiIgUEBXdIiIiIiIiIgVERbeIiIiIiIhIAVHR\nLSIiIiIiIlJAVHSLiIiIiIiIFBAV3SIiIiIiIiIFREW3iIiIiIiISAFR0S0iIiIiIiJSQP4fa6Ra\nJXGSUSQAAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x10e7aa080>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"a = -per_clf.coef_[0][0] / per_clf.coef_[0][1]\n",
|
||
"b = -per_clf.intercept_ / per_clf.coef_[0][1]\n",
|
||
"\n",
|
||
"axes = [0, 5, 0, 2]\n",
|
||
"\n",
|
||
"x0, x1 = np.meshgrid(\n",
|
||
" np.linspace(axes[0], axes[1], 500).reshape(-1, 1),\n",
|
||
" np.linspace(axes[2], axes[3], 200).reshape(-1, 1),\n",
|
||
" )\n",
|
||
"X_new = np.c_[x0.ravel(), x1.ravel()]\n",
|
||
"y_predict = per_clf.predict(X_new)\n",
|
||
"zz = y_predict.reshape(x0.shape)\n",
|
||
"\n",
|
||
"plt.figure(figsize=(10, 4))\n",
|
||
"plt.plot(X[y==0, 0], X[y==0, 1], \"bs\", label=\"Not Iris-Setosa\")\n",
|
||
"plt.plot(X[y==1, 0], X[y==1, 1], \"yo\", label=\"Iris-Setosa\")\n",
|
||
"\n",
|
||
"plt.plot([axes[0], axes[1]], [a * axes[0] + b, a * axes[1] + b], \"k-\", linewidth=3)\n",
|
||
"from matplotlib.colors import ListedColormap\n",
|
||
"custom_cmap = ListedColormap(['#9898ff', '#fafab0'])\n",
|
||
"\n",
|
||
"plt.contourf(x0, x1, zz, cmap=custom_cmap, linewidth=5)\n",
|
||
"plt.xlabel(\"Petal length\", fontsize=14)\n",
|
||
"plt.ylabel(\"Petal width\", fontsize=14)\n",
|
||
"plt.legend(loc=\"lower right\", fontsize=14)\n",
|
||
"plt.axis(axes)\n",
|
||
"\n",
|
||
"save_fig(\"perceptron_iris_plot\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Activation functions"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"def logit(z):\n",
|
||
" return 1 / (1 + np.exp(-z))\n",
|
||
"\n",
|
||
"def relu(z):\n",
|
||
" return np.maximum(0, z)\n",
|
||
"\n",
|
||
"def derivative(f, z, eps=0.000001):\n",
|
||
" return (f(z + eps) - f(z - eps))/(2 * eps)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Saving figure activation_functions_plot\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\nr70GLqaL5S1rt/Bl3y9Z8c6KStOa8bsZfNn3y7LXoqcXVbrs3NvmMm3ItEo/X/XpqgppTT1uaqXL\nrp+1ni/7fsnaqWsrXebb076tkF51+zHr2lmVfr70laUV0qrJfmxavKnSZb467KuytC7vdnm1+/Hj\n336s9POFDy+sEFtN9qMypWUe/apuP6or8+i0qtuPmpR59Ku6/ajJd/fybpc36O9uTalFSJorLi4O\nO4SMpvwPWUkJZSWQhhUhm5ZtIrd9bkIqCDZsgMsvh0cfLZ/Xs6cfHrdPn/ql/dG8j3jy6yd58bsX\nWbVx1VafT5g1gfP7nB93XR0D4VL+h2Y90CTO/Kb40WfWpzac1NF3Lnwqg9RZtMjfbHjiCdhc1utP\nMVOn+nl77+0fUy0oCD6KwNqitWxZuSVuegDrf1jP2qLyH3Sbl1TendCGeRtY/33l/05KVpdUSCuv\nW16ly0Y2RFhbtLbKTtvXfbeO4u/Kv1/V7UdOq8p/Km5evrlCbFl5lV+nle5HZHOk0mXWTllLyRof\n+2pWV7sfTbaL9y/a2/jzxgqx5e9Yed117H5sJSjzCrOq2Y/qyjw6vTb92lS67MafN7L2m8pjKy3z\nGqnFd3c1q1m7sPr9SNfvbk2l3y8LqeDWW28NO4SMpvwPWSRCWQmk4aMx/xvwPz7b+TPm3DSnypNi\ndRYsgEMOqVgJctFFvoPU+laCANzw3g08+tWjFSpBurTowqX7Xcp7577HswOfrXRdHQPhUv6H5mf8\n4zGxSuctrGrl448/noKCggqvgw46iHHjxlVYbuLEiRSU/cIq97vf/Y4xY8ZUmFdUVERBQQHLli2r\nMH/EiBFbtSCYP38+BQUFTJ8+vcL8++67j+HDh1eYV1xcTEFBAZMnTwbKv3Njx45l6NChW8V2xhln\nNIj9KNUQ9+Orr75qFPuR7uUxceJ0DjwQHnmktBLkPmA4b3Ik7/ABD1LI1KnFnHRSAZdeWr4flmu8\n/PHLle7HpGWTsFwre30448NK9+OlmS9hOeU3U7baD/PbeyLrCcZmjSUrt/yn21blESz78L8frrQ8\nvt74dYXYqt2PqNhiy8OyfBr3ZN3Dm9lv1mg/brvrtkrLY37W/LK4huUOq34/ssu3F/u9smyfzkgb\nyeTsyTXaj8q+V6cMOoVVOasq5Ft1+xH9Czv2+LBsY2PORm6wG/gm+5tq9yMrN6vS4+P0y06vEFdN\n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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x10f2437b8>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"z = np.linspace(-5, 5, 200)\n",
|
||
"\n",
|
||
"plt.figure(figsize=(11,4))\n",
|
||
"\n",
|
||
"plt.subplot(121)\n",
|
||
"plt.plot(z, np.sign(z), \"r-\", linewidth=2, label=\"Step\")\n",
|
||
"plt.plot(z, logit(z), \"g--\", linewidth=2, label=\"Logit\")\n",
|
||
"plt.plot(z, np.tanh(z), \"b-\", linewidth=2, label=\"Tanh\")\n",
|
||
"plt.plot(z, relu(z), \"m-.\", linewidth=2, label=\"ReLU\")\n",
|
||
"plt.grid(True)\n",
|
||
"plt.legend(loc=\"center right\", fontsize=14)\n",
|
||
"plt.title(\"Activation functions\", fontsize=14)\n",
|
||
"plt.axis([-5, 5, -1.2, 1.2])\n",
|
||
"\n",
|
||
"plt.subplot(122)\n",
|
||
"plt.plot(z, derivative(np.sign, z), \"r-\", linewidth=2, label=\"Step\")\n",
|
||
"plt.plot(0, 0, \"ro\", markersize=5)\n",
|
||
"plt.plot(0, 0, \"rx\", markersize=10)\n",
|
||
"plt.plot(z, derivative(logit, z), \"g--\", linewidth=2, label=\"Logit\")\n",
|
||
"plt.plot(z, derivative(np.tanh, z), \"b-\", linewidth=2, label=\"Tanh\")\n",
|
||
"plt.plot(z, derivative(relu, z), \"m-.\", linewidth=2, label=\"ReLU\")\n",
|
||
"plt.grid(True)\n",
|
||
"#plt.legend(loc=\"center right\", fontsize=14)\n",
|
||
"plt.title(\"Derivatives\", fontsize=14)\n",
|
||
"plt.axis([-5, 5, -0.2, 1.2])\n",
|
||
"\n",
|
||
"save_fig(\"activation_functions_plot\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"def heaviside(z):\n",
|
||
" return (z >= 0).astype(z.dtype)\n",
|
||
"\n",
|
||
"def sigmoid(z):\n",
|
||
" return 1/(1+np.exp(-z))\n",
|
||
"\n",
|
||
"def mlp_xor(x1, x2, activation=heaviside):\n",
|
||
" return activation(-activation(x1 + x2 - 1.5) + activation(x1 + x2 - 0.5) - 0.5)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nP9v0iO+hsUljU6hcNDbFlYfGpv54BA/A4xviFSTfyjxDcvPExjtAvzWz7nKSb8+G/j30pt4InAB8\nOvMYcYNGTzH/iOTUidkkdxFfmP57n4Z1fgG8lNluW5JuMo8Dx5Pc3+GRNIfxAX72efO4K/2lPKvJ\nz/yAQO+jXLm02FeQmzD2eEzGpr8360havx5D8i35BmBKhfI4MX1v3UEyIH8FuC9ddmigY3I0SSeo\nC9L3xpXpv08CXp2uc2n63I4N23X82aZHfI9ujh8am2LJQ2NTZHmgsanIXDQ2+fx5hg7A85tjHHAR\nyTm3z5HclHCPJus9DCxr+PdO6Zu61eOSguIdk/5S/hfJtOlt2Q9t4OfAi0223SH9xX4qfRPPI/NN\nZ4k/91x5jPIzv7lKubTY1ybg3KrlQfKN0yUk35KvST84Q/1nopc8DgV+DTwJPJ/m8bEQeaTxPNzm\n/b5jus73SFo675jZtqPPNj3ifGhs0tgU8pg02ZfGprB5aGyq8cPSH4yIiIiIiIjkVKWL5ERERERE\nRKKkwkpERERERKRHKqxERERERER6pMJKRERERESkRyqsREREREREeqTCSkREREREpEcqrERERERE\nRHqkwkpERERERKRHKqxERERERER6pMJKRERERESkRyqsREREREREeqTCSkREREREpEf/A1asW++h\ncRcQAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x110041240>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"x1s = np.linspace(-0.2, 1.2, 100)\n",
|
||
"x2s = np.linspace(-0.2, 1.2, 100)\n",
|
||
"x1, x2 = np.meshgrid(x1s, x2s)\n",
|
||
"\n",
|
||
"z1 = mlp_xor(x1, x2, activation=heaviside)\n",
|
||
"z2 = mlp_xor(x1, x2, activation=sigmoid)\n",
|
||
"\n",
|
||
"plt.figure(figsize=(10,4))\n",
|
||
"\n",
|
||
"plt.subplot(121)\n",
|
||
"plt.contourf(x1, x2, z1)\n",
|
||
"plt.plot([0, 1], [0, 1], \"gs\", markersize=20)\n",
|
||
"plt.plot([0, 1], [1, 0], \"y^\", markersize=20)\n",
|
||
"plt.title(\"Activation function: heaviside\", fontsize=14)\n",
|
||
"plt.grid(True)\n",
|
||
"\n",
|
||
"plt.subplot(122)\n",
|
||
"plt.contourf(x1, x2, z2)\n",
|
||
"plt.plot([0, 1], [0, 1], \"gs\", markersize=20)\n",
|
||
"plt.plot([0, 1], [1, 0], \"y^\", markersize=20)\n",
|
||
"plt.title(\"Activation function: sigmoid\", fontsize=14)\n",
|
||
"plt.grid(True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# FNN for MNIST"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## using tf.learn"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.\n",
|
||
"Extracting /tmp/data/train-images-idx3-ubyte.gz\n",
|
||
"Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.\n",
|
||
"Extracting /tmp/data/train-labels-idx1-ubyte.gz\n",
|
||
"Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.\n",
|
||
"Extracting /tmp/data/t10k-images-idx3-ubyte.gz\n",
|
||
"Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.\n",
|
||
"Extracting /tmp/data/t10k-labels-idx1-ubyte.gz\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from tensorflow.examples.tutorials.mnist import input_data\n",
|
||
"mnist = input_data.read_data_sets(\"/tmp/data/\")\n",
|
||
"X_train = mnist.train.images\n",
|
||
"X_test = mnist.test.images\n",
|
||
"y_train = mnist.train.labels.astype(\"int\")\n",
|
||
"y_test = mnist.test.labels.astype(\"int\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"WARNING:tensorflow:Using temporary folder as model directory: /var/folders/q8/bfgmsngx7t53p7g6hb5m2hlr0000gn/T/tmpjkj04vje\n",
|
||
"WARNING:tensorflow:Using default config.\n",
|
||
"WARNING:tensorflow:Setting feature info to TensorSignature(dtype=tf.float32, shape=TensorShape([Dimension(None), Dimension(784)]), is_sparse=False)\n",
|
||
"WARNING:tensorflow:Setting targets info to TensorSignature(dtype=tf.int64, shape=TensorShape([Dimension(None)]), is_sparse=False)\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"DNNClassifier(optimizer=None, feature_columns=[_RealValuedColumn(column_name='', dimension=784, default_value=None, dtype=tf.float32)], hidden_units=[300, 100], dropout=None)"
|
||
]
|
||
},
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import tensorflow as tf\n",
|
||
"\n",
|
||
"feature_columns = tf.contrib.learn.infer_real_valued_columns_from_input(X_train)\n",
|
||
"dnn_clf = tf.contrib.learn.DNNClassifier(hidden_units=[300, 100], n_classes=10,\n",
|
||
" feature_columns=feature_columns)\n",
|
||
"dnn_clf.fit(x=X_train, y=y_train, batch_size=50, steps=40000)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0.95809999999999995"
|
||
]
|
||
},
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.metrics import accuracy_score\n",
|
||
"\n",
|
||
"y_pred = dnn_clf.predict(X_test)\n",
|
||
"accuracy = accuracy_score(y_test, y_pred)\n",
|
||
"accuracy"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"1.2132487784965271"
|
||
]
|
||
},
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.metrics import log_loss\n",
|
||
"\n",
|
||
"y_pred_proba = dnn_clf.predict_proba(X_test)\n",
|
||
"log_loss(y_test, y_pred_proba)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"WARNING:tensorflow:Given features: Tensor(\"input:0\", shape=(?, 784), dtype=float32), required signatures: TensorSignature(dtype=tf.float32, shape=TensorShape([Dimension(None), Dimension(784)]), is_sparse=False).\n",
|
||
"WARNING:tensorflow:Given targets: Tensor(\"output:0\", shape=(?,), dtype=int64), required signatures: TensorSignature(dtype=tf.int64, shape=TensorShape([Dimension(None)]), is_sparse=False).\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'accuracy': 0.95810002, 'global_step': 40000, 'loss': 3.9885485}"
|
||
]
|
||
},
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"dnn_clf.evaluate(X_test, y_test)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"source": [
|
||
"## Using plain TensorFlow"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import tensorflow as tf\n",
|
||
"\n",
|
||
"def neuron_layer(X, n_neurons, name, activation=None):\n",
|
||
" with tf.name_scope(name):\n",
|
||
" n_inputs = int(X.get_shape()[1])\n",
|
||
" stddev = 1 / np.sqrt(n_inputs)\n",
|
||
" init = tf.truncated_normal((n_inputs, n_neurons), stddev=stddev)\n",
|
||
" W = tf.Variable(init, name=\"weights\")\n",
|
||
" b = tf.Variable(tf.zeros([n_neurons]), name=\"biases\")\n",
|
||
" Z = tf.matmul(X, W) + b\n",
|
||
" if activation==\"relu\":\n",
|
||
" return tf.nn.relu(Z)\n",
|
||
" else:\n",
|
||
" return Z"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"tf.reset_default_graph()\n",
|
||
"\n",
|
||
"n_inputs = 28*28 # MNIST\n",
|
||
"n_hidden1 = 300\n",
|
||
"n_hidden2 = 100\n",
|
||
"n_outputs = 10\n",
|
||
"learning_rate = 0.01\n",
|
||
"\n",
|
||
"X = tf.placeholder(tf.float32, shape=(None, n_inputs), name=\"X\")\n",
|
||
"y = tf.placeholder(tf.int64, shape=(None), name=\"y\")\n",
|
||
"\n",
|
||
"with tf.name_scope(\"dnn\"):\n",
|
||
" hidden1 = neuron_layer(X, n_hidden1, \"hidden1\", activation=\"relu\")\n",
|
||
" hidden2 = neuron_layer(hidden1, n_hidden2, \"hidden2\", activation=\"relu\")\n",
|
||
" logits = neuron_layer(hidden2, n_outputs, \"output\")\n",
|
||
"\n",
|
||
"with tf.name_scope(\"loss\"):\n",
|
||
" xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, y)\n",
|
||
" loss = tf.reduce_mean(xentropy, name=\"loss\")\n",
|
||
"\n",
|
||
"with tf.name_scope(\"train\"):\n",
|
||
" optimizer = tf.train.GradientDescentOptimizer(learning_rate)\n",
|
||
" training_op = optimizer.minimize(loss)\n",
|
||
"\n",
|
||
"with tf.name_scope(\"eval\"):\n",
|
||
" correct = tf.nn.in_top_k(logits, y, 1)\n",
|
||
" accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))\n",
|
||
" \n",
|
||
"init = tf.initialize_all_variables()\n",
|
||
"saver = tf.train.Saver()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0 Train accuracy: 0.66 Test accuracy: 0.6835\n",
|
||
"1 Train accuracy: 0.72 Test accuracy: 0.8216\n",
|
||
"2 Train accuracy: 0.92 Test accuracy: 0.8535\n",
|
||
"3 Train accuracy: 0.86 Test accuracy: 0.871\n",
|
||
"4 Train accuracy: 0.8 Test accuracy: 0.8833\n",
|
||
"5 Train accuracy: 0.9 Test accuracy: 0.8902\n",
|
||
"6 Train accuracy: 0.86 Test accuracy: 0.8948\n",
|
||
"7 Train accuracy: 0.84 Test accuracy: 0.8986\n",
|
||
"8 Train accuracy: 0.9 Test accuracy: 0.9036\n",
|
||
"9 Train accuracy: 0.86 Test accuracy: 0.9062\n",
|
||
"10 Train accuracy: 0.88 Test accuracy: 0.9098\n",
|
||
"11 Train accuracy: 0.96 Test accuracy: 0.9115\n",
|
||
"12 Train accuracy: 0.88 Test accuracy: 0.9133\n",
|
||
"13 Train accuracy: 0.92 Test accuracy: 0.9126\n",
|
||
"14 Train accuracy: 0.98 Test accuracy: 0.9154\n",
|
||
"15 Train accuracy: 0.92 Test accuracy: 0.9185\n",
|
||
"16 Train accuracy: 0.86 Test accuracy: 0.9198\n",
|
||
"17 Train accuracy: 0.94 Test accuracy: 0.9213\n",
|
||
"18 Train accuracy: 1.0 Test accuracy: 0.9214\n",
|
||
"19 Train accuracy: 0.86 Test accuracy: 0.9258\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"n_epochs = 20\n",
|
||
"batch_size = 50\n",
|
||
"\n",
|
||
"with tf.Session() as sess:\n",
|
||
" init.run()\n",
|
||
" for epoch in range(n_epochs):\n",
|
||
" for iteration in range(mnist.train.num_examples // batch_size):\n",
|
||
" X_batch, y_batch = mnist.train.next_batch(batch_size)\n",
|
||
" sess.run(training_op, feed_dict={X: X_batch, y: y_batch})\n",
|
||
" acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch})\n",
|
||
" acc_test = accuracy.eval(feed_dict={X: mnist.test.images, y: mnist.test.labels})\n",
|
||
" print(epoch, \"Train accuracy:\", acc_train, \"Test accuracy:\", acc_test)\n",
|
||
"\n",
|
||
" save_path = saver.save(sess, \"my_model_final.ckpt\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[7 2 1 0 4 1 4 9 6 9 0 6 9 0 1 5 9 7 3 4]\n",
|
||
"[7 2 1 0 4 1 4 9 5 9 0 6 9 0 1 5 9 7 3 4]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"with tf.Session() as sess:\n",
|
||
" saver.restore(sess, \"my_model_final.ckpt\")\n",
|
||
" X_new_scaled = mnist.test.images[:20]\n",
|
||
" Z = logits.eval(feed_dict={X: X_new_scaled})\n",
|
||
" print(np.argmax(Z, axis=1))\n",
|
||
" print(mnist.test.labels[:20])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from IPython.display import clear_output, Image, display, HTML\n",
|
||
"\n",
|
||
"def strip_consts(graph_def, max_const_size=32):\n",
|
||
" \"\"\"Strip large constant values from graph_def.\"\"\"\n",
|
||
" strip_def = tf.GraphDef()\n",
|
||
" for n0 in graph_def.node:\n",
|
||
" n = strip_def.node.add() \n",
|
||
" n.MergeFrom(n0)\n",
|
||
" if n.op == 'Const':\n",
|
||
" tensor = n.attr['value'].tensor\n",
|
||
" size = len(tensor.tensor_content)\n",
|
||
" if size > max_const_size:\n",
|
||
" tensor.tensor_content = b\"<stripped %d bytes>\"%size\n",
|
||
" return strip_def\n",
|
||
"\n",
|
||
"def show_graph(graph_def, max_const_size=32):\n",
|
||
" \"\"\"Visualize TensorFlow graph.\"\"\"\n",
|
||
" if hasattr(graph_def, 'as_graph_def'):\n",
|
||
" graph_def = graph_def.as_graph_def()\n",
|
||
" strip_def = strip_consts(graph_def, max_const_size=max_const_size)\n",
|
||
" code = \"\"\"\n",
|
||
" <script>\n",
|
||
" function load() {{\n",
|
||
" document.getElementById(\"{id}\").pbtxt = {data};\n",
|
||
" }}\n",
|
||
" </script>\n",
|
||
" <link rel=\"import\" href=\"https://tensorboard.appspot.com/tf-graph-basic.build.html\" onload=load()>\n",
|
||
" <div style=\"height:600px\">\n",
|
||
" <tf-graph-basic id=\"{id}\"></tf-graph-basic>\n",
|
||
" </div>\n",
|
||
" \"\"\".format(data=repr(str(strip_def)), id='graph'+str(np.random.rand()))\n",
|
||
"\n",
|
||
" iframe = \"\"\"\n",
|
||
" <iframe seamless style=\"width:1200px;height:620px;border:0\" srcdoc=\"{}\"></iframe>\n",
|
||
" \"\"\".format(code.replace('\"', '"'))\n",
|
||
" display(HTML(iframe))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"\n",
|
||
" <iframe seamless style=\"width:1200px;height:620px;border:0\" srcdoc=\"\n",
|
||
" <script>\n",
|
||
" function load() {\n",
|
||
" document.getElementById("graph0.4803896246349043").pbtxt = 'node {\\n name: "X"\\n op: "Placeholder"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n }\\n }\\n }\\n}\\nnode {\\n name: "y"\\n op: "Placeholder"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT64\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/truncated_normal/shape"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 2\\n }\\n }\\n tensor_content: "\\\\020\\\\003\\\\000\\\\000,\\\\001\\\\000\\\\000"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/truncated_normal/mean"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/truncated_normal/stddev"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.0357142873108387\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/truncated_normal/TruncatedNormal"\\n op: "TruncatedNormal"\\n input: "dnn/hidden1/truncated_normal/shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "seed"\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: "seed2"\\n value {\\n i: 0\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/truncated_normal/mul"\\n op: "Mul"\\n input: "dnn/hidden1/truncated_normal/TruncatedNormal"\\n input: "dnn/hidden1/truncated_normal/stddev"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/truncated_normal"\\n op: "Add"\\n input: "dnn/hidden1/truncated_normal/mul"\\n input: "dnn/hidden1/truncated_normal/mean"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/weights"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 784\\n }\\n dim {\\n size: 300\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/weights/Assign"\\n op: "Assign"\\n input: "dnn/hidden1/weights"\\n input: "dnn/hidden1/truncated_normal"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden1/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/weights/read"\\n op: "Identity"\\n input: "dnn/hidden1/weights"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden1/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/zeros"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n dim {\\n size: 300\\n }\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/biases"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 300\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/biases/Assign"\\n op: "Assign"\\n input: "dnn/hidden1/biases"\\n input: "dnn/hidden1/zeros"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden1/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/biases/read"\\n op: "Identity"\\n input: "dnn/hidden1/biases"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden1/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/MatMul"\\n op: "MatMul"\\n input: "X"\\n input: "dnn/hidden1/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/add"\\n op: "Add"\\n input: "dnn/hidden1/MatMul"\\n input: "dnn/hidden1/biases/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/Relu"\\n op: "Relu"\\n input: "dnn/hidden1/add"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/truncated_normal/shape"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 2\\n }\\n }\\n tensor_content: ",\\\\001\\\\000\\\\000d\\\\000\\\\000\\\\000"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/truncated_normal/mean"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/truncated_normal/stddev"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.05773502588272095\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/truncated_normal/TruncatedNormal"\\n op: "TruncatedNormal"\\n input: "dnn/hidden2/truncated_normal/shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "seed"\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: "seed2"\\n value {\\n i: 0\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/truncated_normal/mul"\\n op: "Mul"\\n input: "dnn/hidden2/truncated_normal/TruncatedNormal"\\n input: "dnn/hidden2/truncated_normal/stddev"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/truncated_normal"\\n op: "Add"\\n input: "dnn/hidden2/truncated_normal/mul"\\n input: "dnn/hidden2/truncated_normal/mean"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/weights"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 300\\n }\\n dim {\\n size: 100\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/weights/Assign"\\n op: "Assign"\\n input: "dnn/hidden2/weights"\\n input: "dnn/hidden2/truncated_normal"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden2/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/weights/read"\\n op: "Identity"\\n input: "dnn/hidden2/weights"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden2/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/zeros"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n dim {\\n size: 100\\n }\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/biases"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 100\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/biases/Assign"\\n op: "Assign"\\n input: "dnn/hidden2/biases"\\n input: "dnn/hidden2/zeros"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden2/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/biases/read"\\n op: "Identity"\\n input: "dnn/hidden2/biases"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden2/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/MatMul"\\n op: "MatMul"\\n input: "dnn/hidden1/Relu"\\n input: "dnn/hidden2/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/add"\\n op: "Add"\\n input: "dnn/hidden2/MatMul"\\n input: "dnn/hidden2/biases/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/Relu"\\n op: "Relu"\\n input: "dnn/hidden2/add"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/truncated_normal/shape"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 2\\n }\\n }\\n tensor_content: "d\\\\000\\\\000\\\\000\\\\n\\\\000\\\\000\\\\000"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/truncated_normal/mean"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/truncated_normal/stddev"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.10000000149011612\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/truncated_normal/TruncatedNormal"\\n op: "TruncatedNormal"\\n input: "dnn/output/truncated_normal/shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "seed"\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: "seed2"\\n value {\\n i: 0\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/truncated_normal/mul"\\n op: "Mul"\\n input: "dnn/output/truncated_normal/TruncatedNormal"\\n input: "dnn/output/truncated_normal/stddev"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/truncated_normal"\\n op: "Add"\\n input: "dnn/output/truncated_normal/mul"\\n input: "dnn/output/truncated_normal/mean"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/weights"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 100\\n }\\n dim {\\n size: 10\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/weights/Assign"\\n op: "Assign"\\n input: "dnn/output/weights"\\n input: "dnn/output/truncated_normal"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/output/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/weights/read"\\n op: "Identity"\\n input: "dnn/output/weights"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/output/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/zeros"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n dim {\\n size: 10\\n }\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/biases"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 10\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/biases/Assign"\\n op: "Assign"\\n input: "dnn/output/biases"\\n input: "dnn/output/zeros"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/output/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/biases/read"\\n op: "Identity"\\n input: "dnn/output/biases"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/output/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/MatMul"\\n op: "MatMul"\\n input: "dnn/hidden2/Relu"\\n input: "dnn/output/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "dnn/output/add"\\n op: "Add"\\n input: "dnn/output/MatMul"\\n input: "dnn/output/biases/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "loss/SparseSoftmaxCrossEntropyWithLogits/Shape"\\n op: "Shape"\\n input: "y"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT64\\n }\\n }\\n}\\nnode {\\n name: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits"\\n op: "SparseSoftmaxCrossEntropyWithLogits"\\n input: "dnn/output/add"\\n input: "y"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "Tlabels"\\n value {\\n type: DT_INT64\\n }\\n }\\n}\\nnode {\\n name: "loss/Const"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 0\\n }\\n }\\n }\\n}\\nnode {\\n name: "loss/loss"\\n op: "Mean"\\n input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits"\\n input: "loss/Const"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/Shape"\\n op: "Shape"\\n input: "loss/loss"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/Const"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 1.0\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/Fill"\\n op: "Fill"\\n input: "train/gradients/Shape"\\n input: "train/gradients/Const"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Reshape/shape"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Reshape"\\n op: "Reshape"\\n input: "train/gradients/Fill"\\n input: "train/gradients/loss/loss_grad/Reshape/shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Shape"\\n op: "Shape"\\n input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Tile"\\n op: "Tile"\\n input: "train/gradients/loss/loss_grad/Reshape"\\n input: "train/gradients/loss/loss_grad/Shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Shape_1"\\n op: "Shape"\\n input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Shape_2"\\n op: "Shape"\\n input: "loss/loss"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Const"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 0\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Prod"\\n op: "Prod"\\n input: "train/gradients/loss/loss_grad/Shape_1"\\n input: "train/gradients/loss/loss_grad/Const"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Const_1"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 0\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Prod_1"\\n op: "Prod"\\n input: "train/gradients/loss/loss_grad/Shape_2"\\n input: "train/gradients/loss/loss_grad/Const_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Maximum/y"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Maximum"\\n op: "Maximum"\\n input: "train/gradients/loss/loss_grad/Prod_1"\\n input: "train/gradients/loss/loss_grad/Maximum/y"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/floordiv"\\n op: "Div"\\n input: "train/gradients/loss/loss_grad/Prod"\\n input: "train/gradients/loss/loss_grad/Maximum"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Cast"\\n op: "Cast"\\n input: "train/gradients/loss/loss_grad/floordiv"\\n attr {\\n key: "DstT"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "SrcT"\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/truediv"\\n op: "Div"\\n input: "train/gradients/loss/loss_grad/Tile"\\n input: "train/gradients/loss/loss_grad/Cast"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/zeros_like"\\n op: "ZerosLike"\\n input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits:1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims/dim"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: -1\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims"\\n op: "ExpandDims"\\n input: "train/gradients/loss/loss_grad/truediv"\\n input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims/dim"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/mul"\\n op: "Mul"\\n input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims"\\n input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits:1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/add_grad/Shape"\\n op: "Shape"\\n input: "dnn/output/MatMul"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/add_grad/Shape_1"\\n op: "Shape"\\n input: "dnn/output/biases/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/add_grad/BroadcastGradientArgs"\\n op: "BroadcastGradientArgs"\\n input: "train/gradients/dnn/output/add_grad/Shape"\\n input: "train/gradients/dnn/output/add_grad/Shape_1"\\n}\\nnode {\\n name: "train/gradients/dnn/output/add_grad/Sum"\\n op: "Sum"\\n input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/mul"\\n input: "train/gradients/dnn/output/add_grad/BroadcastGradientArgs"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/add_grad/Reshape"\\n op: "Reshape"\\n input: "train/gradients/dnn/output/add_grad/Sum"\\n input: "train/gradients/dnn/output/add_grad/Shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/add_grad/Sum_1"\\n op: "Sum"\\n input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/mul"\\n input: "train/gradients/dnn/output/add_grad/BroadcastGradientArgs:1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/add_grad/Reshape_1"\\n op: "Reshape"\\n input: "train/gradients/dnn/output/add_grad/Sum_1"\\n input: "train/gradients/dnn/output/add_grad/Shape_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/add_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/dnn/output/add_grad/Reshape"\\n input: "^train/gradients/dnn/output/add_grad/Reshape_1"\\n}\\nnode {\\n name: "train/gradients/dnn/output/add_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/dnn/output/add_grad/Reshape"\\n input: "^train/gradients/dnn/output/add_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/output/add_grad/Reshape"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/add_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/output/add_grad/Reshape_1"\\n input: "^train/gradients/dnn/output/add_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/output/add_grad/Reshape_1"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/MatMul_grad/MatMul"\\n op: "MatMul"\\n input: "train/gradients/dnn/output/add_grad/tuple/control_dependency"\\n input: "dnn/output/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/MatMul_grad/MatMul_1"\\n op: "MatMul"\\n input: "dnn/hidden2/Relu"\\n input: "train/gradients/dnn/output/add_grad/tuple/control_dependency"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/MatMul_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/dnn/output/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/output/MatMul_grad/MatMul_1"\\n}\\nnode {\\n name: "train/gradients/dnn/output/MatMul_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/dnn/output/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/output/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/output/MatMul_grad/MatMul"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/output/MatMul_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/output/MatMul_grad/MatMul_1"\\n input: "^train/gradients/dnn/output/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/output/MatMul_grad/MatMul_1"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/Relu_grad/ReluGrad"\\n op: "ReluGrad"\\n input: "train/gradients/dnn/output/MatMul_grad/tuple/control_dependency"\\n input: "dnn/hidden2/Relu"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/add_grad/Shape"\\n op: "Shape"\\n input: "dnn/hidden2/MatMul"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/add_grad/Shape_1"\\n op: "Shape"\\n input: "dnn/hidden2/biases/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/add_grad/BroadcastGradientArgs"\\n op: "BroadcastGradientArgs"\\n input: "train/gradients/dnn/hidden2/add_grad/Shape"\\n input: "train/gradients/dnn/hidden2/add_grad/Shape_1"\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/add_grad/Sum"\\n op: "Sum"\\n input: "train/gradients/dnn/hidden2/Relu_grad/ReluGrad"\\n input: "train/gradients/dnn/hidden2/add_grad/BroadcastGradientArgs"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/add_grad/Reshape"\\n op: "Reshape"\\n input: "train/gradients/dnn/hidden2/add_grad/Sum"\\n input: "train/gradients/dnn/hidden2/add_grad/Shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/add_grad/Sum_1"\\n op: "Sum"\\n input: "train/gradients/dnn/hidden2/Relu_grad/ReluGrad"\\n input: "train/gradients/dnn/hidden2/add_grad/BroadcastGradientArgs:1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/add_grad/Reshape_1"\\n op: "Reshape"\\n input: "train/gradients/dnn/hidden2/add_grad/Sum_1"\\n input: "train/gradients/dnn/hidden2/add_grad/Shape_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/add_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/dnn/hidden2/add_grad/Reshape"\\n input: "^train/gradients/dnn/hidden2/add_grad/Reshape_1"\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/add_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden2/add_grad/Reshape"\\n input: "^train/gradients/dnn/hidden2/add_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden2/add_grad/Reshape"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/add_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden2/add_grad/Reshape_1"\\n input: "^train/gradients/dnn/hidden2/add_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden2/add_grad/Reshape_1"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/MatMul_grad/MatMul"\\n op: "MatMul"\\n input: "train/gradients/dnn/hidden2/add_grad/tuple/control_dependency"\\n input: "dnn/hidden2/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/MatMul_grad/MatMul_1"\\n op: "MatMul"\\n input: "dnn/hidden1/Relu"\\n input: "train/gradients/dnn/hidden2/add_grad/tuple/control_dependency"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/MatMul_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/dnn/hidden2/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/hidden2/MatMul_grad/MatMul_1"\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden2/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/hidden2/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden2/MatMul_grad/MatMul"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden2/MatMul_grad/MatMul_1"\\n input: "^train/gradients/dnn/hidden2/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden2/MatMul_grad/MatMul_1"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/Relu_grad/ReluGrad"\\n op: "ReluGrad"\\n input: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency"\\n input: "dnn/hidden1/Relu"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/add_grad/Shape"\\n op: "Shape"\\n input: "dnn/hidden1/MatMul"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/add_grad/Shape_1"\\n op: "Shape"\\n input: "dnn/hidden1/biases/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/add_grad/BroadcastGradientArgs"\\n op: "BroadcastGradientArgs"\\n input: "train/gradients/dnn/hidden1/add_grad/Shape"\\n input: "train/gradients/dnn/hidden1/add_grad/Shape_1"\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/add_grad/Sum"\\n op: "Sum"\\n input: "train/gradients/dnn/hidden1/Relu_grad/ReluGrad"\\n input: "train/gradients/dnn/hidden1/add_grad/BroadcastGradientArgs"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/add_grad/Reshape"\\n op: "Reshape"\\n input: "train/gradients/dnn/hidden1/add_grad/Sum"\\n input: "train/gradients/dnn/hidden1/add_grad/Shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/add_grad/Sum_1"\\n op: "Sum"\\n input: "train/gradients/dnn/hidden1/Relu_grad/ReluGrad"\\n input: "train/gradients/dnn/hidden1/add_grad/BroadcastGradientArgs:1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/add_grad/Reshape_1"\\n op: "Reshape"\\n input: "train/gradients/dnn/hidden1/add_grad/Sum_1"\\n input: "train/gradients/dnn/hidden1/add_grad/Shape_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/add_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/dnn/hidden1/add_grad/Reshape"\\n input: "^train/gradients/dnn/hidden1/add_grad/Reshape_1"\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/add_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden1/add_grad/Reshape"\\n input: "^train/gradients/dnn/hidden1/add_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden1/add_grad/Reshape"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/add_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden1/add_grad/Reshape_1"\\n input: "^train/gradients/dnn/hidden1/add_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden1/add_grad/Reshape_1"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/MatMul_grad/MatMul"\\n op: "MatMul"\\n input: "train/gradients/dnn/hidden1/add_grad/tuple/control_dependency"\\n input: "dnn/hidden1/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/MatMul_grad/MatMul_1"\\n op: "MatMul"\\n input: "X"\\n input: "train/gradients/dnn/hidden1/add_grad/tuple/control_dependency"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/MatMul_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/dnn/hidden1/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/hidden1/MatMul_grad/MatMul_1"\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/MatMul_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden1/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/hidden1/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden1/MatMul_grad/MatMul"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/MatMul_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden1/MatMul_grad/MatMul_1"\\n input: "^train/gradients/dnn/hidden1/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden1/MatMul_grad/MatMul_1"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/learning_rate"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.009999999776482582\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_dnn/hidden1/weights/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "dnn/hidden1/weights"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/hidden1/MatMul_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden1/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_dnn/hidden1/biases/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "dnn/hidden1/biases"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/hidden1/add_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden1/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_dnn/hidden2/weights/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "dnn/hidden2/weights"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden2/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_dnn/hidden2/biases/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "dnn/hidden2/biases"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/hidden2/add_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden2/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_dnn/output/weights/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "dnn/output/weights"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/output/MatMul_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/output/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_dnn/output/biases/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "dnn/output/biases"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/output/add_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/output/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent"\\n op: "NoOp"\\n input: "^train/GradientDescent/update_dnn/hidden1/weights/ApplyGradientDescent"\\n input: "^train/GradientDescent/update_dnn/hidden1/biases/ApplyGradientDescent"\\n input: "^train/GradientDescent/update_dnn/hidden2/weights/ApplyGradientDescent"\\n input: "^train/GradientDescent/update_dnn/hidden2/biases/ApplyGradientDescent"\\n input: "^train/GradientDescent/update_dnn/output/weights/ApplyGradientDescent"\\n input: "^train/GradientDescent/update_dnn/output/biases/ApplyGradientDescent"\\n}\\nnode {\\n name: "eval/InTopK"\\n op: "InTopK"\\n input: "dnn/output/add"\\n input: "y"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT64\\n }\\n }\\n attr {\\n key: "k"\\n value {\\n i: 1\\n }\\n }\\n}\\nnode {\\n name: "eval/Cast"\\n op: "Cast"\\n input: "eval/InTopK"\\n attr {\\n key: "DstT"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "SrcT"\\n value {\\n type: DT_BOOL\\n }\\n }\\n}\\nnode {\\n name: "eval/Const"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 0\\n }\\n }\\n }\\n}\\nnode {\\n name: "eval/Mean"\\n op: "Mean"\\n input: "eval/Cast"\\n input: "eval/Const"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "init"\\n op: "NoOp"\\n input: "^dnn/hidden1/weights/Assign"\\n input: "^dnn/hidden1/biases/Assign"\\n input: "^dnn/hidden2/weights/Assign"\\n input: "^dnn/hidden2/biases/Assign"\\n input: "^dnn/output/weights/Assign"\\n input: "^dnn/output/biases/Assign"\\n}\\nnode {\\n name: "save/Const"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "model"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/save/tensor_names"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n dim {\\n size: 6\\n }\\n }\\n string_val: "dnn/hidden1/biases"\\n string_val: "dnn/hidden1/weights"\\n string_val: "dnn/hidden2/biases"\\n string_val: "dnn/hidden2/weights"\\n string_val: "dnn/output/biases"\\n string_val: "dnn/output/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/save/shapes_and_slices"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n dim {\\n size: 6\\n }\\n }\\n string_val: ""\\n string_val: ""\\n string_val: ""\\n string_val: ""\\n string_val: ""\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/save"\\n op: "SaveSlices"\\n input: "save/Const"\\n input: "save/save/tensor_names"\\n input: "save/save/shapes_and_slices"\\n input: "dnn/hidden1/biases"\\n input: "dnn/hidden1/weights"\\n input: "dnn/hidden2/biases"\\n input: "dnn/hidden2/weights"\\n input: "dnn/output/biases"\\n input: "dnn/output/weights"\\n attr {\\n key: "T"\\n value {\\n list {\\n type: DT_FLOAT\\n type: DT_FLOAT\\n type: DT_FLOAT\\n type: DT_FLOAT\\n type: DT_FLOAT\\n type: DT_FLOAT\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/control_dependency"\\n op: "Identity"\\n input: "save/Const"\\n input: "^save/save"\\n attr {\\n key: "T"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@save/Const"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "dnn/hidden1/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice/tensor_name"\\n input: "save/restore_slice/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign"\\n op: "Assign"\\n input: "dnn/hidden1/biases"\\n input: "save/restore_slice"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden1/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_1/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "dnn/hidden1/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_1/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_1"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice_1/tensor_name"\\n input: "save/restore_slice_1/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign_1"\\n op: "Assign"\\n input: "dnn/hidden1/weights"\\n input: "save/restore_slice_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden1/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_2/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "dnn/hidden2/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_2/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_2"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice_2/tensor_name"\\n input: "save/restore_slice_2/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign_2"\\n op: "Assign"\\n input: "dnn/hidden2/biases"\\n input: "save/restore_slice_2"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden2/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_3/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "dnn/hidden2/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_3/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_3"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice_3/tensor_name"\\n input: "save/restore_slice_3/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign_3"\\n op: "Assign"\\n input: "dnn/hidden2/weights"\\n input: "save/restore_slice_3"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/hidden2/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_4/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "dnn/output/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_4/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_4"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice_4/tensor_name"\\n input: "save/restore_slice_4/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign_4"\\n op: "Assign"\\n input: "dnn/output/biases"\\n input: "save/restore_slice_4"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/output/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_5/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "dnn/output/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_5/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_5"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice_5/tensor_name"\\n input: "save/restore_slice_5/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign_5"\\n op: "Assign"\\n input: "dnn/output/weights"\\n input: "save/restore_slice_5"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@dnn/output/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_all"\\n op: "NoOp"\\n input: "^save/Assign"\\n input: "^save/Assign_1"\\n input: "^save/Assign_2"\\n input: "^save/Assign_3"\\n input: "^save/Assign_4"\\n input: "^save/Assign_5"\\n}\\n';\n",
|
||
" }\n",
|
||
" </script>\n",
|
||
" <link rel="import" href="https://tensorboard.appspot.com/tf-graph-basic.build.html" onload=load()>\n",
|
||
" <div style="height:600px">\n",
|
||
" <tf-graph-basic id="graph0.4803896246349043"></tf-graph-basic>\n",
|
||
" </div>\n",
|
||
" \"></iframe>\n",
|
||
" "
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"show_graph(tf.get_default_graph())"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Using `fully_connected` instead of `neuron_layer()`"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"tf.reset_default_graph()\n",
|
||
"\n",
|
||
"from tensorflow.contrib.layers import fully_connected\n",
|
||
"\n",
|
||
"n_inputs = 28*28 # MNIST\n",
|
||
"n_hidden1 = 300\n",
|
||
"n_hidden2 = 100\n",
|
||
"n_outputs = 10\n",
|
||
"learning_rate = 0.01\n",
|
||
"\n",
|
||
"X = tf.placeholder(tf.float32, shape=(None, n_inputs), name=\"X\")\n",
|
||
"y = tf.placeholder(tf.int64, shape=(None), name=\"y\")\n",
|
||
"\n",
|
||
"with tf.name_scope(\"dnn\"):\n",
|
||
" hidden1 = fully_connected(X, n_hidden1, scope=\"hidden1\")\n",
|
||
" hidden2 = fully_connected(hidden1, n_hidden2, scope=\"hidden2\")\n",
|
||
" logits = fully_connected(hidden2, n_outputs, activation_fn=None, scope=\"outputs\")\n",
|
||
"\n",
|
||
"with tf.name_scope(\"loss\"):\n",
|
||
" xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, y)\n",
|
||
" loss = tf.reduce_mean(xentropy, name=\"loss\")\n",
|
||
"\n",
|
||
"with tf.name_scope(\"train\"):\n",
|
||
" optimizer = tf.train.GradientDescentOptimizer(learning_rate)\n",
|
||
" training_op = optimizer.minimize(loss)\n",
|
||
"\n",
|
||
"with tf.name_scope(\"eval\"):\n",
|
||
" correct = tf.nn.in_top_k(logits, y, 1)\n",
|
||
" accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))\n",
|
||
" \n",
|
||
"init = tf.initialize_all_variables()\n",
|
||
"saver = tf.train.Saver()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0 Train accuracy: 0.8 Test accuracy: 0.7944\n",
|
||
"1 Train accuracy: 0.88 Test accuracy: 0.8531\n",
|
||
"2 Train accuracy: 0.82 Test accuracy: 0.8839\n",
|
||
"3 Train accuracy: 0.8 Test accuracy: 0.8931\n",
|
||
"4 Train accuracy: 0.84 Test accuracy: 0.9011\n",
|
||
"5 Train accuracy: 0.88 Test accuracy: 0.9051\n",
|
||
"6 Train accuracy: 0.9 Test accuracy: 0.9103\n",
|
||
"7 Train accuracy: 0.96 Test accuracy: 0.9146\n",
|
||
"8 Train accuracy: 0.92 Test accuracy: 0.9179\n",
|
||
"9 Train accuracy: 0.9 Test accuracy: 0.9215\n",
|
||
"10 Train accuracy: 0.9 Test accuracy: 0.9213\n",
|
||
"11 Train accuracy: 0.94 Test accuracy: 0.9233\n",
|
||
"12 Train accuracy: 0.94 Test accuracy: 0.9269\n",
|
||
"13 Train accuracy: 0.96 Test accuracy: 0.9265\n",
|
||
"14 Train accuracy: 0.92 Test accuracy: 0.9305\n",
|
||
"15 Train accuracy: 0.98 Test accuracy: 0.929\n",
|
||
"16 Train accuracy: 0.98 Test accuracy: 0.9325\n",
|
||
"17 Train accuracy: 0.94 Test accuracy: 0.9341\n",
|
||
"18 Train accuracy: 0.96 Test accuracy: 0.9331\n",
|
||
"19 Train accuracy: 0.94 Test accuracy: 0.9342\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"n_epochs = 20\n",
|
||
"n_batches = 50\n",
|
||
"\n",
|
||
"with tf.Session() as sess:\n",
|
||
" init.run()\n",
|
||
" for epoch in range(n_epochs):\n",
|
||
" for iteration in range(mnist.train.num_examples // batch_size):\n",
|
||
" X_batch, y_batch = mnist.train.next_batch(batch_size)\n",
|
||
" sess.run(training_op, feed_dict={X: X_batch, y: y_batch})\n",
|
||
" acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch})\n",
|
||
" acc_test = accuracy.eval(feed_dict={X: mnist.test.images, y: mnist.test.labels})\n",
|
||
" print(epoch, \"Train accuracy:\", acc_train, \"Test accuracy:\", acc_test)\n",
|
||
"\n",
|
||
" save_path = saver.save(sess, \"my_model_final.ckpt\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"\n",
|
||
" <iframe seamless style=\"width:1200px;height:620px;border:0\" srcdoc=\"\n",
|
||
" <script>\n",
|
||
" function load() {\n",
|
||
" document.getElementById("graph0.5695055486614764").pbtxt = 'node {\\n name: "X"\\n op: "Placeholder"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n }\\n }\\n }\\n}\\nnode {\\n name: "y"\\n op: "Placeholder"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT64\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/Shape"\\n op: "Shape"\\n input: "X"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/unpack"\\n op: "Unpack"\\n input: "dnn/hidden1/Shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "axis"\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: "num"\\n value {\\n i: 2\\n }\\n }\\n}\\nnode {\\n name: "hidden1/weights"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 784\\n }\\n dim {\\n size: 300\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "hidden1/weights/Initializer/random_uniform/shape"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 2\\n }\\n }\\n tensor_content: "\\\\020\\\\003\\\\000\\\\000,\\\\001\\\\000\\\\000"\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden1/weights/Initializer/random_uniform/min"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: -0.07439795136451721\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden1/weights/Initializer/random_uniform/max"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.07439795136451721\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden1/weights/Initializer/random_uniform/RandomUniform"\\n op: "RandomUniform"\\n input: "hidden1/weights/Initializer/random_uniform/shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "seed"\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: "seed2"\\n value {\\n i: 0\\n }\\n }\\n}\\nnode {\\n name: "hidden1/weights/Initializer/random_uniform/sub"\\n op: "Sub"\\n input: "hidden1/weights/Initializer/random_uniform/max"\\n input: "hidden1/weights/Initializer/random_uniform/min"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden1/weights/Initializer/random_uniform/mul"\\n op: "Mul"\\n input: "hidden1/weights/Initializer/random_uniform/RandomUniform"\\n input: "hidden1/weights/Initializer/random_uniform/sub"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden1/weights/Initializer/random_uniform"\\n op: "Add"\\n input: "hidden1/weights/Initializer/random_uniform/mul"\\n input: "hidden1/weights/Initializer/random_uniform/min"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden1/weights/Assign"\\n op: "Assign"\\n input: "hidden1/weights"\\n input: "hidden1/weights/Initializer/random_uniform"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "hidden1/weights/read"\\n op: "Identity"\\n input: "hidden1/weights"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/MatMul"\\n op: "MatMul"\\n input: "X"\\n input: "hidden1/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "hidden1/biases"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 300\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "hidden1/biases/Initializer/zeros"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/biases"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n dim {\\n size: 300\\n }\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden1/biases/Assign"\\n op: "Assign"\\n input: "hidden1/biases"\\n input: "hidden1/biases/Initializer/zeros"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "hidden1/biases/read"\\n op: "Identity"\\n input: "hidden1/biases"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/BiasAdd"\\n op: "BiasAdd"\\n input: "dnn/hidden1/MatMul"\\n input: "hidden1/biases/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "data_format"\\n value {\\n s: "NHWC"\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden1/Relu"\\n op: "Relu"\\n input: "dnn/hidden1/BiasAdd"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/Shape"\\n op: "Shape"\\n input: "dnn/hidden1/Relu"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/unpack"\\n op: "Unpack"\\n input: "dnn/hidden2/Shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "axis"\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: "num"\\n value {\\n i: 2\\n }\\n }\\n}\\nnode {\\n name: "hidden2/weights"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 300\\n }\\n dim {\\n size: 100\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "hidden2/weights/Initializer/random_uniform/shape"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 2\\n }\\n }\\n tensor_content: ",\\\\001\\\\000\\\\000d\\\\000\\\\000\\\\000"\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden2/weights/Initializer/random_uniform/min"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: -0.12247448414564133\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden2/weights/Initializer/random_uniform/max"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.12247448414564133\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden2/weights/Initializer/random_uniform/RandomUniform"\\n op: "RandomUniform"\\n input: "hidden2/weights/Initializer/random_uniform/shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "seed"\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: "seed2"\\n value {\\n i: 0\\n }\\n }\\n}\\nnode {\\n name: "hidden2/weights/Initializer/random_uniform/sub"\\n op: "Sub"\\n input: "hidden2/weights/Initializer/random_uniform/max"\\n input: "hidden2/weights/Initializer/random_uniform/min"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden2/weights/Initializer/random_uniform/mul"\\n op: "Mul"\\n input: "hidden2/weights/Initializer/random_uniform/RandomUniform"\\n input: "hidden2/weights/Initializer/random_uniform/sub"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden2/weights/Initializer/random_uniform"\\n op: "Add"\\n input: "hidden2/weights/Initializer/random_uniform/mul"\\n input: "hidden2/weights/Initializer/random_uniform/min"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden2/weights/Assign"\\n op: "Assign"\\n input: "hidden2/weights"\\n input: "hidden2/weights/Initializer/random_uniform"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "hidden2/weights/read"\\n op: "Identity"\\n input: "hidden2/weights"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/MatMul"\\n op: "MatMul"\\n input: "dnn/hidden1/Relu"\\n input: "hidden2/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "hidden2/biases"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 100\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "hidden2/biases/Initializer/zeros"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/biases"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n dim {\\n size: 100\\n }\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: "hidden2/biases/Assign"\\n op: "Assign"\\n input: "hidden2/biases"\\n input: "hidden2/biases/Initializer/zeros"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "hidden2/biases/read"\\n op: "Identity"\\n input: "hidden2/biases"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/BiasAdd"\\n op: "BiasAdd"\\n input: "dnn/hidden2/MatMul"\\n input: "hidden2/biases/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "data_format"\\n value {\\n s: "NHWC"\\n }\\n }\\n}\\nnode {\\n name: "dnn/hidden2/Relu"\\n op: "Relu"\\n input: "dnn/hidden2/BiasAdd"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/outputs/Shape"\\n op: "Shape"\\n input: "dnn/hidden2/Relu"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "dnn/outputs/unpack"\\n op: "Unpack"\\n input: "dnn/outputs/Shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "axis"\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: "num"\\n value {\\n i: 2\\n }\\n }\\n}\\nnode {\\n name: "outputs/weights"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 100\\n }\\n dim {\\n size: 10\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "outputs/weights/Initializer/random_uniform/shape"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 2\\n }\\n }\\n tensor_content: "d\\\\000\\\\000\\\\000\\\\n\\\\000\\\\000\\\\000"\\n }\\n }\\n }\\n}\\nnode {\\n name: "outputs/weights/Initializer/random_uniform/min"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: -0.23354968428611755\\n }\\n }\\n }\\n}\\nnode {\\n name: "outputs/weights/Initializer/random_uniform/max"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.23354968428611755\\n }\\n }\\n }\\n}\\nnode {\\n name: "outputs/weights/Initializer/random_uniform/RandomUniform"\\n op: "RandomUniform"\\n input: "outputs/weights/Initializer/random_uniform/shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/weights"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "seed"\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: "seed2"\\n value {\\n i: 0\\n }\\n }\\n}\\nnode {\\n name: "outputs/weights/Initializer/random_uniform/sub"\\n op: "Sub"\\n input: "outputs/weights/Initializer/random_uniform/max"\\n input: "outputs/weights/Initializer/random_uniform/min"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "outputs/weights/Initializer/random_uniform/mul"\\n op: "Mul"\\n input: "outputs/weights/Initializer/random_uniform/RandomUniform"\\n input: "outputs/weights/Initializer/random_uniform/sub"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "outputs/weights/Initializer/random_uniform"\\n op: "Add"\\n input: "outputs/weights/Initializer/random_uniform/mul"\\n input: "outputs/weights/Initializer/random_uniform/min"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "outputs/weights/Assign"\\n op: "Assign"\\n input: "outputs/weights"\\n input: "outputs/weights/Initializer/random_uniform"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "outputs/weights/read"\\n op: "Identity"\\n input: "outputs/weights"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/outputs/MatMul"\\n op: "MatMul"\\n input: "dnn/hidden2/Relu"\\n input: "outputs/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "outputs/biases"\\n op: "Variable"\\n attr {\\n key: "container"\\n value {\\n s: ""\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "shape"\\n value {\\n shape {\\n dim {\\n size: 10\\n }\\n }\\n }\\n }\\n attr {\\n key: "shared_name"\\n value {\\n s: ""\\n }\\n }\\n}\\nnode {\\n name: "outputs/biases/Initializer/zeros"\\n op: "Const"\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/biases"\\n }\\n }\\n }\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n dim {\\n size: 10\\n }\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: "outputs/biases/Assign"\\n op: "Assign"\\n input: "outputs/biases"\\n input: "outputs/biases/Initializer/zeros"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "outputs/biases/read"\\n op: "Identity"\\n input: "outputs/biases"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "dnn/outputs/BiasAdd"\\n op: "BiasAdd"\\n input: "dnn/outputs/MatMul"\\n input: "outputs/biases/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "data_format"\\n value {\\n s: "NHWC"\\n }\\n }\\n}\\nnode {\\n name: "loss/SparseSoftmaxCrossEntropyWithLogits/Shape"\\n op: "Shape"\\n input: "y"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT64\\n }\\n }\\n}\\nnode {\\n name: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits"\\n op: "SparseSoftmaxCrossEntropyWithLogits"\\n input: "dnn/outputs/BiasAdd"\\n input: "y"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "Tlabels"\\n value {\\n type: DT_INT64\\n }\\n }\\n}\\nnode {\\n name: "loss/Const"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 0\\n }\\n }\\n }\\n}\\nnode {\\n name: "loss/loss"\\n op: "Mean"\\n input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits"\\n input: "loss/Const"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/Shape"\\n op: "Shape"\\n input: "loss/loss"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/Const"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 1.0\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/Fill"\\n op: "Fill"\\n input: "train/gradients/Shape"\\n input: "train/gradients/Const"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Reshape/shape"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Reshape"\\n op: "Reshape"\\n input: "train/gradients/Fill"\\n input: "train/gradients/loss/loss_grad/Reshape/shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Shape"\\n op: "Shape"\\n input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Tile"\\n op: "Tile"\\n input: "train/gradients/loss/loss_grad/Reshape"\\n input: "train/gradients/loss/loss_grad/Shape"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Shape_1"\\n op: "Shape"\\n input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Shape_2"\\n op: "Shape"\\n input: "loss/loss"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Const"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 0\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Prod"\\n op: "Prod"\\n input: "train/gradients/loss/loss_grad/Shape_1"\\n input: "train/gradients/loss/loss_grad/Const"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Const_1"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 0\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Prod_1"\\n op: "Prod"\\n input: "train/gradients/loss/loss_grad/Shape_2"\\n input: "train/gradients/loss/loss_grad/Const_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Maximum/y"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Maximum"\\n op: "Maximum"\\n input: "train/gradients/loss/loss_grad/Prod_1"\\n input: "train/gradients/loss/loss_grad/Maximum/y"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/floordiv"\\n op: "Div"\\n input: "train/gradients/loss/loss_grad/Prod"\\n input: "train/gradients/loss/loss_grad/Maximum"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/Cast"\\n op: "Cast"\\n input: "train/gradients/loss/loss_grad/floordiv"\\n attr {\\n key: "DstT"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "SrcT"\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/loss_grad/truediv"\\n op: "Div"\\n input: "train/gradients/loss/loss_grad/Tile"\\n input: "train/gradients/loss/loss_grad/Cast"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/zeros_like"\\n op: "ZerosLike"\\n input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits:1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims/dim"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: -1\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims"\\n op: "ExpandDims"\\n input: "train/gradients/loss/loss_grad/truediv"\\n input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims/dim"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/mul"\\n op: "Mul"\\n input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims"\\n input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits:1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/outputs/BiasAdd_grad/BiasAddGrad"\\n op: "BiasAddGrad"\\n input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/mul"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "data_format"\\n value {\\n s: "NHWC"\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/outputs/BiasAdd_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/mul"\\n input: "^train/gradients/dnn/outputs/BiasAdd_grad/BiasAddGrad"\\n}\\nnode {\\n name: "train/gradients/dnn/outputs/BiasAdd_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/mul"\\n input: "^train/gradients/dnn/outputs/BiasAdd_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/mul"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/outputs/BiasAdd_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/outputs/BiasAdd_grad/BiasAddGrad"\\n input: "^train/gradients/dnn/outputs/BiasAdd_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/outputs/BiasAdd_grad/BiasAddGrad"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/outputs/MatMul_grad/MatMul"\\n op: "MatMul"\\n input: "train/gradients/dnn/outputs/BiasAdd_grad/tuple/control_dependency"\\n input: "outputs/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/outputs/MatMul_grad/MatMul_1"\\n op: "MatMul"\\n input: "dnn/hidden2/Relu"\\n input: "train/gradients/dnn/outputs/BiasAdd_grad/tuple/control_dependency"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/outputs/MatMul_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/dnn/outputs/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/outputs/MatMul_grad/MatMul_1"\\n}\\nnode {\\n name: "train/gradients/dnn/outputs/MatMul_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/dnn/outputs/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/outputs/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/outputs/MatMul_grad/MatMul"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/outputs/MatMul_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/outputs/MatMul_grad/MatMul_1"\\n input: "^train/gradients/dnn/outputs/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/outputs/MatMul_grad/MatMul_1"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/Relu_grad/ReluGrad"\\n op: "ReluGrad"\\n input: "train/gradients/dnn/outputs/MatMul_grad/tuple/control_dependency"\\n input: "dnn/hidden2/Relu"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/BiasAdd_grad/BiasAddGrad"\\n op: "BiasAddGrad"\\n input: "train/gradients/dnn/hidden2/Relu_grad/ReluGrad"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "data_format"\\n value {\\n s: "NHWC"\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/BiasAdd_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/dnn/hidden2/Relu_grad/ReluGrad"\\n input: "^train/gradients/dnn/hidden2/BiasAdd_grad/BiasAddGrad"\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/BiasAdd_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden2/Relu_grad/ReluGrad"\\n input: "^train/gradients/dnn/hidden2/BiasAdd_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden2/Relu_grad/ReluGrad"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/BiasAdd_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden2/BiasAdd_grad/BiasAddGrad"\\n input: "^train/gradients/dnn/hidden2/BiasAdd_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden2/BiasAdd_grad/BiasAddGrad"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/MatMul_grad/MatMul"\\n op: "MatMul"\\n input: "train/gradients/dnn/hidden2/BiasAdd_grad/tuple/control_dependency"\\n input: "hidden2/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/MatMul_grad/MatMul_1"\\n op: "MatMul"\\n input: "dnn/hidden1/Relu"\\n input: "train/gradients/dnn/hidden2/BiasAdd_grad/tuple/control_dependency"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/MatMul_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/dnn/hidden2/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/hidden2/MatMul_grad/MatMul_1"\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden2/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/hidden2/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden2/MatMul_grad/MatMul"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden2/MatMul_grad/MatMul_1"\\n input: "^train/gradients/dnn/hidden2/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden2/MatMul_grad/MatMul_1"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/Relu_grad/ReluGrad"\\n op: "ReluGrad"\\n input: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency"\\n input: "dnn/hidden1/Relu"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/BiasAdd_grad/BiasAddGrad"\\n op: "BiasAddGrad"\\n input: "train/gradients/dnn/hidden1/Relu_grad/ReluGrad"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "data_format"\\n value {\\n s: "NHWC"\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/BiasAdd_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/dnn/hidden1/Relu_grad/ReluGrad"\\n input: "^train/gradients/dnn/hidden1/BiasAdd_grad/BiasAddGrad"\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/BiasAdd_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden1/Relu_grad/ReluGrad"\\n input: "^train/gradients/dnn/hidden1/BiasAdd_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden1/Relu_grad/ReluGrad"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/BiasAdd_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden1/BiasAdd_grad/BiasAddGrad"\\n input: "^train/gradients/dnn/hidden1/BiasAdd_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden1/BiasAdd_grad/BiasAddGrad"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/MatMul_grad/MatMul"\\n op: "MatMul"\\n input: "train/gradients/dnn/hidden1/BiasAdd_grad/tuple/control_dependency"\\n input: "hidden1/weights/read"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/MatMul_grad/MatMul_1"\\n op: "MatMul"\\n input: "X"\\n input: "train/gradients/dnn/hidden1/BiasAdd_grad/tuple/control_dependency"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "transpose_a"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "transpose_b"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/MatMul_grad/tuple/group_deps"\\n op: "NoOp"\\n input: "^train/gradients/dnn/hidden1/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/hidden1/MatMul_grad/MatMul_1"\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/MatMul_grad/tuple/control_dependency"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden1/MatMul_grad/MatMul"\\n input: "^train/gradients/dnn/hidden1/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden1/MatMul_grad/MatMul"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/gradients/dnn/hidden1/MatMul_grad/tuple/control_dependency_1"\\n op: "Identity"\\n input: "train/gradients/dnn/hidden1/MatMul_grad/MatMul_1"\\n input: "^train/gradients/dnn/hidden1/MatMul_grad/tuple/group_deps"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@train/gradients/dnn/hidden1/MatMul_grad/MatMul_1"\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/learning_rate"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.009999999776482582\\n }\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_hidden1/weights/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "hidden1/weights"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/hidden1/MatMul_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_hidden1/biases/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "hidden1/biases"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/hidden1/BiasAdd_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_hidden2/weights/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "hidden2/weights"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_hidden2/biases/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "hidden2/biases"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/hidden2/BiasAdd_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_outputs/weights/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "outputs/weights"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/outputs/MatMul_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent/update_outputs/biases/ApplyGradientDescent"\\n op: "ApplyGradientDescent"\\n input: "outputs/biases"\\n input: "train/GradientDescent/learning_rate"\\n input: "train/gradients/dnn/outputs/BiasAdd_grad/tuple/control_dependency_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "train/GradientDescent"\\n op: "NoOp"\\n input: "^train/GradientDescent/update_hidden1/weights/ApplyGradientDescent"\\n input: "^train/GradientDescent/update_hidden1/biases/ApplyGradientDescent"\\n input: "^train/GradientDescent/update_hidden2/weights/ApplyGradientDescent"\\n input: "^train/GradientDescent/update_hidden2/biases/ApplyGradientDescent"\\n input: "^train/GradientDescent/update_outputs/weights/ApplyGradientDescent"\\n input: "^train/GradientDescent/update_outputs/biases/ApplyGradientDescent"\\n}\\nnode {\\n name: "eval/InTopK"\\n op: "InTopK"\\n input: "dnn/outputs/BiasAdd"\\n input: "y"\\n attr {\\n key: "T"\\n value {\\n type: DT_INT64\\n }\\n }\\n attr {\\n key: "k"\\n value {\\n i: 1\\n }\\n }\\n}\\nnode {\\n name: "eval/Cast"\\n op: "Cast"\\n input: "eval/InTopK"\\n attr {\\n key: "DstT"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "SrcT"\\n value {\\n type: DT_BOOL\\n }\\n }\\n}\\nnode {\\n name: "eval/Const"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 0\\n }\\n }\\n }\\n}\\nnode {\\n name: "eval/Mean"\\n op: "Mean"\\n input: "eval/Cast"\\n input: "eval/Const"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "keep_dims"\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: "init"\\n op: "NoOp"\\n input: "^hidden1/weights/Assign"\\n input: "^hidden1/biases/Assign"\\n input: "^hidden2/weights/Assign"\\n input: "^hidden2/biases/Assign"\\n input: "^outputs/weights/Assign"\\n input: "^outputs/biases/Assign"\\n}\\nnode {\\n name: "save/Const"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "model"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/save/tensor_names"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n dim {\\n size: 6\\n }\\n }\\n string_val: "hidden1/biases"\\n string_val: "hidden1/weights"\\n string_val: "hidden2/biases"\\n string_val: "hidden2/weights"\\n string_val: "outputs/biases"\\n string_val: "outputs/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/save/shapes_and_slices"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n dim {\\n size: 6\\n }\\n }\\n string_val: ""\\n string_val: ""\\n string_val: ""\\n string_val: ""\\n string_val: ""\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/save"\\n op: "SaveSlices"\\n input: "save/Const"\\n input: "save/save/tensor_names"\\n input: "save/save/shapes_and_slices"\\n input: "hidden1/biases"\\n input: "hidden1/weights"\\n input: "hidden2/biases"\\n input: "hidden2/weights"\\n input: "outputs/biases"\\n input: "outputs/weights"\\n attr {\\n key: "T"\\n value {\\n list {\\n type: DT_FLOAT\\n type: DT_FLOAT\\n type: DT_FLOAT\\n type: DT_FLOAT\\n type: DT_FLOAT\\n type: DT_FLOAT\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/control_dependency"\\n op: "Identity"\\n input: "save/Const"\\n input: "^save/save"\\n attr {\\n key: "T"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@save/Const"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "hidden1/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice/tensor_name"\\n input: "save/restore_slice/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign"\\n op: "Assign"\\n input: "hidden1/biases"\\n input: "save/restore_slice"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_1/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "hidden1/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_1/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_1"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice_1/tensor_name"\\n input: "save/restore_slice_1/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign_1"\\n op: "Assign"\\n input: "hidden1/weights"\\n input: "save/restore_slice_1"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden1/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_2/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "hidden2/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_2/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_2"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice_2/tensor_name"\\n input: "save/restore_slice_2/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign_2"\\n op: "Assign"\\n input: "hidden2/biases"\\n input: "save/restore_slice_2"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_3/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "hidden2/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_3/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_3"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice_3/tensor_name"\\n input: "save/restore_slice_3/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign_3"\\n op: "Assign"\\n input: "hidden2/weights"\\n input: "save/restore_slice_3"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@hidden2/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_4/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "outputs/biases"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_4/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_4"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice_4/tensor_name"\\n input: "save/restore_slice_4/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign_4"\\n op: "Assign"\\n input: "outputs/biases"\\n input: "save/restore_slice_4"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/biases"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_5/tensor_name"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: "outputs/weights"\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_5/shape_and_slice"\\n op: "Const"\\n attr {\\n key: "dtype"\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: "value"\\n value {\\n tensor {\\n dtype: DT_STRING\\n tensor_shape {\\n }\\n string_val: ""\\n }\\n }\\n }\\n}\\nnode {\\n name: "save/restore_slice_5"\\n op: "RestoreSlice"\\n input: "save/Const"\\n input: "save/restore_slice_5/tensor_name"\\n input: "save/restore_slice_5/shape_and_slice"\\n attr {\\n key: "dt"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "preferred_shard"\\n value {\\n i: -1\\n }\\n }\\n}\\nnode {\\n name: "save/Assign_5"\\n op: "Assign"\\n input: "outputs/weights"\\n input: "save/restore_slice_5"\\n attr {\\n key: "T"\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: "_class"\\n value {\\n list {\\n s: "loc:@outputs/weights"\\n }\\n }\\n }\\n attr {\\n key: "use_locking"\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: "validate_shape"\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: "save/restore_all"\\n op: "NoOp"\\n input: "^save/Assign"\\n input: "^save/Assign_1"\\n input: "^save/Assign_2"\\n input: "^save/Assign_3"\\n input: "^save/Assign_4"\\n input: "^save/Assign_5"\\n}\\n';\n",
|
||
" }\n",
|
||
" </script>\n",
|
||
" <link rel="import" href="https://tensorboard.appspot.com/tf-graph-basic.build.html" onload=load()>\n",
|
||
" <div style="height:600px">\n",
|
||
" <tf-graph-basic id="graph0.5695055486614764"></tf-graph-basic>\n",
|
||
" </div>\n",
|
||
" \"></iframe>\n",
|
||
" "
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"show_graph(tf.get_default_graph())"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"source": [
|
||
"# Exercise solutions"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Coming soon**"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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.5.1"
|
||
},
|
||
"nav_menu": {
|
||
"height": "264px",
|
||
"width": "369px"
|
||
},
|
||
"toc": {
|
||
"navigate_menu": true,
|
||
"number_sections": true,
|
||
"sideBar": true,
|
||
"threshold": 6,
|
||
"toc_cell": false,
|
||
"toc_section_display": "block",
|
||
"toc_window_display": false
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 0
|
||
}
|