661 lines
18 KiB
Plaintext
661 lines
18 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": [],
|
||
"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": [],
|
||
"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": [],
|
||
"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": [],
|
||
"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": [],
|
||
"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": [],
|
||
"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": [],
|
||
"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": [],
|
||
"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": [],
|
||
"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": [],
|
||
"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(len(mnist.test.labels)//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": [],
|
||
"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": [],
|
||
"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": [],
|
||
"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(len(mnist.test.labels)//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": [],
|
||
"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
|
||
}
|