{ "cells": [ { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import tensorflow as tf\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from tensorflow.examples.tutorials.mnist import input_data\n", "mnist = input_data.read_data_sets(\"./mnist/data/\", one_hot=True)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 0001 Avg. cost = 0.427\n", "Epoch: 0002 Avg. cost = 0.164\n", "Epoch: 0003 Avg. cost = 0.116\n", "Epoch: 0004 Avg. cost = 0.090\n", "Epoch: 0005 Avg. cost = 0.074\n", "Epoch: 0006 Avg. cost = 0.060\n", "Epoch: 0007 Avg. cost = 0.052\n", "Epoch: 0008 Avg. cost = 0.048\n", "Epoch: 0009 Avg. cost = 0.041\n", "Epoch: 0010 Avg. cost = 0.039\n", "Epoch: 0011 Avg. cost = 0.033\n", "Epoch: 0012 Avg. cost = 0.033\n", "Epoch: 0013 Avg. cost = 0.028\n", "Epoch: 0014 Avg. cost = 0.028\n", "Epoch: 0015 Avg. cost = 0.025\n", "최적화 완료\n", "정확도: 0.9818\n" ] } ], "source": [ "X = tf.placeholder(tf.float32, [None, 784]) # input\n", "Y = tf.placeholder(tf.float32, [None, 10]) # output\n", "\n", "keep_prob = tf.placeholder(tf.float32)\n", "\n", "W1 = tf.Variable(tf.random_normal([784, 256], stddev=0.01))\n", "L1 = tf.nn.relu(tf.matmul(X, W1))\n", "L1 = tf.nn.dropout(L1, keep_prob)\n", "\n", "W2 = tf.Variable(tf.random_normal([256, 256], stddev=0.01))\n", "L2 = tf.nn.relu(tf.matmul(L1, W2))\n", "L2 = tf.nn.dropout(L2, keep_prob)\n", "\n", "W3 = tf.Variable(tf.random_normal([256, 10], stddev=0.01))\n", "model = tf.matmul(L2, W3)\n", "\n", "cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=model, labels=Y))\n", "optimizer = tf.train.AdamOptimizer(0.001).minimize(cost)\n", "\n", "init = tf.global_variables_initializer()\n", "sess = tf.Session()\n", "sess.run(init)\n", "\n", "batch_size = 100\n", "total_batch = int(mnist.train.num_examples / batch_size)\n", "\n", "for epoch in range(15):\n", " total_cost = 0\n", " for i in range(total_batch):\n", " batch_xs, batch_ys = mnist.train.next_batch(batch_size)\n", " \n", " _, cost_val = sess.run([optimizer, cost], feed_dict={X: batch_xs, Y:batch_ys, keep_prob: 0.8})\n", " total_cost += cost_val\n", " print(\"Epoch:\", \"%04d\" % (epoch + 1), \n", " \"Avg. cost =\", \"{:.3f}\".format(total_cost/total_batch))\n", "\n", "print(\"최적화 완료\")\n", "is_correct = tf.equal(tf.argmax(model, 1), tf.argmax(Y, 1))\n", "accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))\n", "print(\"정확도:\", sess.run(accuracy, feed_dict={X:mnist.test.images, Y:mnist.test.labels, keep_prob: 1}))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "labels = sess.run(model, feed_dict={X:mnist.test.images, Y:mnist.test.labels, keep_prob:1})" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\ngIMPPhiAwYMHA9CjRw8AGjRoECawHJgzZw4ARx99NAB77bUXAGeeeSaQqtmsi/nz55d//t///heA\n/fffH4BGjRrV6bUlbhMmTACS988LL7wAwOeff571+dttt13559OnTwdg6dL01sG//fZbjqMUZcgi\nIpEomgz5hx9+AJJM2Jx77rkAnHbaaQCsvfbahQ0sB2w+b8cddwSSTHaTTTYBcpcZ77ZbsvXevHnz\nAMpXSbVs2bJO36NQ/ve//wFw2WWXAfDhhx8CMHHiRECZ/pdffgnAkCFDABg2bBgAixcvBqCmG1J8\n+qk2GAlBGbKISCSKJkO2Oc9vv/027fHjjjsOgMaNGxc8prqwDBWSOWO7Cvj73/8OJPPjdXXttdcC\nMG3atPLHLHMqlsx41KhRAPTundpaMbM6wDLn3/3ud4UNLDLffJPa1X7QoEGr9e+33357IKmoqE++\n+OILIHnvjRs3Dkjm09dYI5Wfnn322UByD6eQ7xFlyCIikdCALCISieinLKzUxi67M5100kkAOFfj\nFqxReOutt8o/t0sm06dPn5x8jw8++ACAAQMGAHDYYYeVf+2YY47JyffIN7sE79WrF5Bcbmb+vO3m\n7u233w7ARhttVKgQC8r+/zYl0b59eyApX1xzzTUBWH/99QFo0qQJAAsXLgRgv/32A5IpiT333BOA\nXXfdFUhuiq+77rp5/F8Uxvvvvw8kNzjHjh0LwNy5c1f571599VUguUFsJYB2rAH+9a9/AcnxzhVl\nyCIikYg+Q37vvfeA9IwSoGHDVOgHHHBAwWOqC1v88eijj1b62ogRIwDYeOMab0KRlWXG++67b9rj\nhx9+ePnn6623Xp2+R6FYdm83PKsyevRoAJ5++mkguflnmXOuM5lCWrRoUfnn9jN99913ARg/fnza\nc9u1awfA22+/DSQlk3YT9A9/+AOQ3MCqT2yssIx4zJgxQPqCKEiOQYcOHYDkGN18880A7L777gC8\n9tprQHLuPfXUU+WvYcvG7QZgrtS/n4qISJGKPkO2eZ9MmdlfsbjooouApIwLkgUbRx11VE6+x+TJ\nkwGYPXs2AKeeeioAJ554Yk5evxBmzEjteHPPPfekPW6ZiS2a+c9//pP2dcuGLLM+4YQTANh0003z\nF2yeLFu2DIDjjz++/DHLjK+44goAunTpkvXfZi4m2nLLLfMQYRzOOussICljy5wjtmO08847A3D9\n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\nxP8DdvZVBkBS420AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure()\n", "for i in range(10):\n", " subplot = fig.add_subplot(2, 5, i+1)\n", " subplot.set_xticks([])\n", " subplot.set_yticks([])\n", " subplot.set_title('%d' % np.argmax(labels[i]))\n", " subplot.imshow(mnist.test.images[i].reshape((28,28)), cmap=plt.cm.gray_r)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# CNN" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Extracting ./mnist/data/train-images-idx3-ubyte.gz\n", "Extracting ./mnist/data/train-labels-idx1-ubyte.gz\n", "Extracting ./mnist/data/t10k-images-idx3-ubyte.gz\n", "Extracting ./mnist/data/t10k-labels-idx1-ubyte.gz\n" ] } ], "source": [ "import tensorflow as tf\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from tensorflow.examples.tutorials.mnist import input_data\n", "mnist = input_data.read_data_sets(\"./mnist/data/\", one_hot=True)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "X = tf.placeholder(tf.float32, [None, 28, 28, 1])\n", "Y = tf.placeholder(tf.float32, [None, 10])\n", "\n", "keep_prob = tf.placeholder(tf.float32)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 0001 Avg. cost = 0.335\n", "Epoch: 0002 Avg. cost = 0.098\n", "Epoch: 0003 Avg. cost = 0.070\n", "Epoch: 0004 Avg. cost = 0.053\n", "Epoch: 0005 Avg. cost = 0.044\n", "Epoch: 0006 Avg. cost = 0.037\n", "Epoch: 0007 Avg. cost = 0.030\n", "Epoch: 0008 Avg. cost = 0.028\n", "Epoch: 0009 Avg. cost = 0.025\n", "Epoch: 0010 Avg. cost = 0.021\n", "Epoch: 0011 Avg. cost = 0.017\n", "Epoch: 0012 Avg. cost = 0.016\n", "Epoch: 0013 Avg. cost = 0.016\n", "Epoch: 0014 Avg. cost = 0.014\n", "Epoch: 0015 Avg. cost = 0.013\n", "최적화 완료\n", "정확도: 0.9898\n" ] } ], "source": [ "W1 = tf.Variable(tf.random_normal([3,3,1,32], stddev=0.01))\n", "L1 = tf.nn.conv2d(X, W1, strides=[1,1,1,1], padding='SAME') # SAME : 외곽에서 한칸 밖으로 움직임\n", "L1 = tf.nn.relu(L1)\n", "L1 = tf.nn.max_pool(L1, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')\n", "\n", "W2 = tf.Variable(tf.random_normal([3,3,32,64], stddev=0.01))\n", "L2 = tf.nn.conv2d(L1, W2, strides=[1,1,1,1], padding='SAME')\n", "L2 = tf.nn.relu(L2)\n", "L2 = tf.nn.max_pool(L2, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')\n", "\n", "W3 = tf.Variable(tf.random_normal([7*7*64, 256], stddev=0.01))\n", "L3 = tf.reshape(L2, [-1, 7*7*64])\n", "L3 = tf.matmul(L3, W3)\n", "L3 = tf.nn.relu(L3)\n", "L3 = tf.nn.dropout(L3, keep_prob)\n", "\n", "W4 = tf.Variable(tf.random_normal([256, 10], stddev=0.01))\n", "model = tf.matmul(L3, W4)\n", "\n", "cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=model, labels=Y))\n", "optimizer = tf.train.AdamOptimizer(0.001).minimize(cost)\n", "\n", "init = tf.global_variables_initializer()\n", "sess = tf.Session()\n", "sess.run(init)\n", "\n", "batch_size = 100\n", "total_batch = int(mnist.train.num_examples / batch_size)\n", "\n", "for epoch in range(15):\n", " total_cost = 0\n", " for i in range(total_batch):\n", " batch_xs, batch_ys = mnist.train.next_batch(batch_size)\n", " batch_xs = batch_xs.reshape(-1, 28, 28, 1)\n", " \n", " _, cost_val = sess.run([optimizer, cost], feed_dict={X: batch_xs, Y:batch_ys, keep_prob: 0.8})\n", " total_cost += cost_val\n", " print(\"Epoch:\", \"%04d\" % (epoch + 1), \n", " \"Avg. cost =\", \"{:.3f}\".format(total_cost/total_batch))\n", "\n", "print(\"최적화 완료\")\n", "is_correct = tf.equal(tf.argmax(model, 1), tf.argmax(Y, 1))\n", "accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))\n", "print(\"정확도:\", sess.run(accuracy, feed_dict={X:mnist.test.images.reshape(-1, 28, 28, 1),\n", " Y:mnist.test.labels, keep_prob: 1}))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# highlevel api를 사용하면 더 빠르게 만들 수 있음\n", "L1 = tf.layers.conv2d(X, 32, [3,3])\n", "L1 = tf.layers.max_pooling2d(L1, [2,2], [2,2])\n", "\n", "\n", "# fully connected layer\n", "L3 = tf.contrib.layers.flatten(L2)\n", "L3 = tf.layers.dense(L3, 256, activation=tf.nn.relu)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# AutoEncoder" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Extracting ./mnist/data/train-images-idx3-ubyte.gz\n", "Extracting ./mnist/data/train-labels-idx1-ubyte.gz\n", "Extracting ./mnist/data/t10k-images-idx3-ubyte.gz\n", "Extracting ./mnist/data/t10k-labels-idx1-ubyte.gz\n" ] } ], "source": [ "mnist = input_data.read_data_sets(\"./mnist/data/\", one_hot=True)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": true }, "outputs": [], "source": [ "learning_rate = 0.01\n", "training_epoch = 20\n", "batch_size = 100\n", "n_hidden = 256\n", "n_input = 28*28\n", "\n", "X = tf.placeholder(tf.float32, [None, n_input])" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 0001 Avg. cost = 0.204\n", "Epoch: 0002 Avg. cost = 0.055\n", "Epoch: 0003 Avg. cost = 0.045\n", "Epoch: 0004 Avg. cost = 0.038\n", "Epoch: 0005 Avg. cost = 0.035\n", "Epoch: 0006 Avg. cost = 0.032\n", "Epoch: 0007 Avg. cost = 0.030\n", "Epoch: 0008 Avg. cost = 0.029\n", "Epoch: 0009 Avg. cost = 0.028\n", "Epoch: 0010 Avg. cost = 0.027\n", "Epoch: 0011 Avg. cost = 0.026\n", "Epoch: 0012 Avg. cost = 0.025\n", "Epoch: 0013 Avg. cost = 0.025\n", "Epoch: 0014 Avg. cost = 0.025\n", "Epoch: 0015 Avg. cost = 0.024\n", "최적화 완료\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "W_encode = tf.Variable(tf.random_normal([n_input, n_hidden]))\n", "b_encode = tf.Variable(tf.random_normal([n_hidden]))\n", "\n", "encoder = tf.nn.sigmoid(tf.add(tf.matmul(X, W_encode), b_encode))\n", "\n", "W_decode = tf.Variable(tf.random_normal([n_hidden, n_input]))\n", "b_decode = tf.Variable(tf.random_normal([n_input]))\n", "decoder = tf.nn.sigmoid(tf.add(tf.matmul(encoder, W_decode), b_decode))\n", "\n", "cost = tf.reduce_mean(tf.pow(X-decoder, 2))\n", "\n", "optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)\n", "\n", "init = tf.global_variables_initializer()\n", "sess = tf.Session()\n", "sess.run(init)\n", "\n", "batch_size = 100\n", "total_batch = int(mnist.train.num_examples / batch_size)\n", "\n", "for epoch in range(15):\n", " total_cost = 0\n", " for i in range(total_batch):\n", " batch_xs, batch_ys = mnist.train.next_batch(batch_size)\n", " \n", " _, cost_val = sess.run([optimizer, cost], feed_dict={X: batch_xs, Y:batch_ys, keep_prob: 0.8})\n", " total_cost += cost_val\n", " print(\"Epoch:\", \"%04d\" % (epoch + 1), \n", " \"Avg. cost =\", \"{:.3f}\".format(total_cost/total_batch))\n", "\n", "print(\"최적화 완료\")\n", "\n", "sample_size = 10\n", "samples = sess.run(decoder, feed_dict={X:mnist.test.images[:sample_size]})\n", "fig, ax = plt.subplots(2, sample_size, figsize=(sample_size, 2))\n", "\n", "for i in range(sample_size):\n", " ax[0][i].set_axis_off()\n", " ax[1][i].set_axis_off()\n", " ax[0][i].imshow(np.reshape(mnist.test.images[i], (28,28)))\n", " ax[1][i].imshow(np.reshape(samples[i], (28,28)))\n", "plt.show()" ] }, { "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.6.2" } }, "nbformat": 4, "nbformat_minor": 2 }