From 490da4e4e76aa4a9e0abca054b7d98ab053d5d32 Mon Sep 17 00:00:00 2001 From: rickiepark Date: Sat, 19 May 2018 14:37:46 +0900 Subject: [PATCH] =?UTF-8?q?int32=20=ED=83=80=EC=9E=85=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD,=20Estimator=20API=20=EC=82=AC=EC=9A=A9,=20t?= =?UTF-8?q?f.keras.datasets.mnist=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...uction_to_artificial_neural_networks.ipynb | 167 ++++++++++++++---- 1 file changed, 128 insertions(+), 39 deletions(-) diff --git a/10_introduction_to_artificial_neural_networks.ipynb b/10_introduction_to_artificial_neural_networks.ipynb index 6be3860..7f9b57a 100644 --- a/10_introduction_to_artificial_neural_networks.ipynb +++ b/10_introduction_to_artificial_neural_networks.ipynb @@ -115,7 +115,7 @@ "X = iris.data[:, (2, 3)] # 꽃잎 길이, 꽃잎 너비\n", "y = (iris.target == 0).astype(np.int)\n", "\n", - "per_clf = Perceptron(max_iter=5, random_state=42)\n", + "per_clf = Perceptron(max_iter=100, random_state=42)\n", "per_clf.fit(X, y)\n", "\n", "y_pred = per_clf.predict([[2, 0.5]])" @@ -322,13 +322,6 @@ "# MNIST를 위한 FNN" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## tf.learn를 사용" - ] - }, { "cell_type": "code", "execution_count": 10, @@ -338,10 +331,94 @@ "import tensorflow as tf" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "경고: `tf.examples.tutorials.mnist`은 삭제될 예정이므로 대신 `tf.keras.datasets.mnist`를 사용하겠습니다. `tf.contrib.learn` API는 `tf.estimators`와 `tf.feature_columns`로 옮겨졌고 상당히 많이 바뀌었습니다. 특히 `infer_real_valued_columns_from_input()` 함수와 `SKCompat` 클래스가 없습니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data()\n", + "X_train = X_train.astype(np.float32).reshape(-1, 28*28) / 255.0\n", + "X_test = X_test.astype(np.float32).reshape(-1, 28*28) / 255.0\n", + "y_train = y_train.astype(np.int32)\n", + "y_test = y_test.astype(np.int32)\n", + "X_valid, X_train = X_train[:5000], X_train[5000:]\n", + "y_valid, y_train = y_train[:5000], y_train[5000:]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Estimator API를 사용 (이전엔 `tf.contrib.learn`)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "feature_cols = [tf.feature_column.numeric_column(\"X\", shape=[28 * 28])]\n", + "dnn_clf = tf.estimator.DNNClassifier(hidden_units=[300,100], n_classes=10,\n", + " feature_columns=feature_cols)\n", + "\n", + "input_fn = tf.estimator.inputs.numpy_input_fn(\n", + " x={\"X\": X_train}, y=y_train, num_epochs=40, batch_size=50, shuffle=True)\n", + "dnn_clf.train(input_fn=input_fn)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "test_input_fn = tf.estimator.inputs.numpy_input_fn(\n", + " x={\"X\": X_test}, y=y_test, shuffle=False)\n", + "eval_results = dnn_clf.evaluate(input_fn=test_input_fn)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "eval_results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y_pred_iter = dnn_clf.predict(input_fn=test_input_fn)\n", + "y_pred = list(y_pred_iter)\n", + "y_pred[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## tf.learn를 사용" + ] + }, { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -359,9 +436,8 @@ } ], "source": [ - "from tensorflow.examples.tutorials.mnist import input_data\n", - "tf.logging.set_verbosity(tf.logging.ERROR) # deprecated 경고 메세지를 출력하지 않기 위해 \n", - "mnist = input_data.read_data_sets(\"/tmp/data/\")" + "# from tensorflow.examples.tutorials.mnist import input_data\n", + "# mnist = input_data.read_data_sets(\"/tmp/data/\")" ] }, { @@ -370,16 +446,18 @@ "metadata": {}, "outputs": [], "source": [ - "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\")" + "# 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": 13, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [ { "name": "stdout", @@ -1241,8 +1319,6 @@ } ], "source": [ - "import tensorflow as tf\n", - "\n", "config = tf.contrib.learn.RunConfig(tf_random_seed=42) # 책에는 없음\n", "\n", "feature_cols = tf.contrib.learn.infer_real_valued_columns_from_input(X_train)\n", @@ -1341,7 +1417,7 @@ "reset_graph()\n", "\n", "X = tf.placeholder(tf.float32, shape=(None, n_inputs), name=\"X\")\n", - "y = tf.placeholder(tf.int64, shape=(None), name=\"y\")" + "y = tf.placeholder(tf.int32, shape=(None), name=\"y\")" ] }, { @@ -1434,6 +1510,20 @@ "batch_size = 50" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def shuffle_batch(X, y, batch_size):\n", + " rnd_idx = np.random.permutation(len(X))\n", + " n_batches = len(X) // batch_size\n", + " for batch_idx in np.array_split(rnd_idx, n_batches):\n", + " X_batch, y_batch = X[batch_idx], y[batch_idx]\n", + " yield X_batch, y_batch" + ] + }, { "cell_type": "code", "execution_count": 25, @@ -1490,13 +1580,11 @@ "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", + " for X_batch, y_batch in shuffle_batch(X_train, y_train, 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_val = accuracy.eval(feed_dict={X: mnist.validation.images,\n", - " y: mnist.validation.labels})\n", - " print(epoch, \"훈련 정확도:\", acc_train, \"검증 세트 정확도:\", acc_val)\n", + " acc_batch = accuracy.eval(feed_dict={X: X_batch, y: y_batch})\n", + " acc_valid = accuracy.eval(feed_dict={X: X_valid, y: y_valid})\n", + " print(epoch, \"배치 데이터 정확도:\", acc_batch, \"검증 세트 정확도:\", acc_valid)\n", "\n", " save_path = saver.save(sess, \"./my_model_final.ckpt\")" ] @@ -1517,7 +1605,7 @@ "source": [ "with tf.Session() as sess:\n", " saver.restore(sess, \"./my_model_final.ckpt\") # 또는 save_path를 사용합니다\n", - " X_new_scaled = mnist.test.images[:20]\n", + " X_new_scaled = X_test[:20]\n", " Z = logits.eval(feed_dict={X: X_new_scaled})\n", " y_pred = np.argmax(Z, axis=1)" ] @@ -1538,7 +1626,7 @@ ], "source": [ "print(\"예측 클래스:\", y_pred)\n", - "print(\"진짜 클래스:\", mnist.test.labels[:20])" + "print(\"진짜 클래스:\", y_test[:20])" ] }, { @@ -1547,6 +1635,8 @@ "metadata": {}, "outputs": [], "source": [ + "# 크롬 브라우저는 확인되었지만 다른 브라우저에서는 작동되지 않을 수 있습니다.\n", + "\n", "from IPython.display import clear_output, Image, display, HTML\n", "\n", "def strip_consts(graph_def, max_const_size=32):\n", @@ -1647,7 +1737,7 @@ "reset_graph()\n", "\n", "X = tf.placeholder(tf.float32, shape=(None, n_inputs), name=\"X\")\n", - "y = tf.placeholder(tf.int64, shape=(None), name=\"y\") " + "y = tf.placeholder(tf.int32, shape=(None), name=\"y\") " ] }, { @@ -1661,7 +1751,8 @@ " activation=tf.nn.relu)\n", " hidden2 = tf.layers.dense(hidden1, n_hidden2, name=\"hidden2\",\n", " activation=tf.nn.relu)\n", - " logits = tf.layers.dense(hidden2, n_outputs, name=\"outputs\")" + " logits = tf.layers.dense(hidden2, n_outputs, name=\"outputs\")\n", + " y_proba = tf.nn.softmax(logits)" ] }, { @@ -1748,12 +1839,11 @@ "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", + " for X_batch, y_batch in shuffle_batch(X_train, y_train, 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, \"훈련 정확도:\", acc_train, \"테스트 정확도:\", acc_test)\n", + " acc_batch = accuracy.eval(feed_dict={X: X_batch, y: y_batch})\n", + " acc_valid = accuracy.eval(feed_dict={X: X_valid, y: y_valid})\n", + " print(epoch, \"배치 데이터 정확도:\", acc_batch, \"검증 세트 정확도:\", acc_valid)\n", "\n", " save_path = saver.save(sess, \"./my_model_final.ckpt\")" ] @@ -1859,7 +1949,7 @@ "reset_graph()\n", "\n", "X = tf.placeholder(tf.float32, shape=(None, n_inputs), name=\"X\")\n", - "y = tf.placeholder(tf.int64, shape=(None), name=\"y\") " + "y = tf.placeholder(tf.int32, shape=(None), name=\"y\") " ] }, { @@ -1976,7 +2066,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "잠시만요! 조기 종료를 구현하는 것이 좋겠죠? 이렇게 하려면 검증 세트가 필요합니다. 다행히 텐서플로의 `input_data()` 함수에서 반환되는 데이터셋은 이미 훈련 세트(이미 섞여있는 60,000개의 샘플), 검증 세트(5,000개의 샘플), 테스트 세트(5,000개의 샘플)로 나뉘어져 있습니다. 손쉽게 `X_valid`와 `y_valid`를 정의할 수 있습니다:" + "잠시만요! 조기 종료를 구현하는 것이 좋겠죠? 이렇게 하려면 검증 세트가 필요합니다." ] }, { @@ -2060,8 +2150,7 @@ " sess.run(init)\n", "\n", " for epoch in range(start_epoch, 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", + " for X_batch, y_batch in shuffle_batch(X_train, y_train, batch_size):\n", " sess.run(training_op, feed_dict={X: X_batch, y: y_batch})\n", " accuracy_val, loss_val, accuracy_summary_str, loss_summary_str = sess.run([accuracy, loss, accuracy_summary, loss_summary], feed_dict={X: X_valid, y: y_valid})\n", " file_writer.add_summary(accuracy_summary_str, epoch)\n",