├── Chapter10.ipynb ├── Chapter3.ipynb ├── Chapter4.ipynb ├── Chapter5.ipynb ├── Chapter6.ipynb ├── Chapter7.ipynb ├── Chapter8.ipynb ├── Chapter8_20200408수정.ipynb ├── Chapter9.ipynb ├── Chapter9_ipynb_9_5단원_문제_해결을_위한_임시_파일.ipynb ├── README.md ├── requirements.txt └── tf2_book.jpg /Chapter7.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Chapter7.ipynb","provenance":[{"file_id":"148SI-wpi5Z3vDvYyOrNwGKsQQLZnVF-S","timestamp":1565493431491}],"collapsed_sections":[],"toc_visible":true},"kernelspec":{"name":"python3","display_name":"Python 3"},"accelerator":"GPU"},"cells":[{"cell_type":"markdown","metadata":{"id":"BCq2UCUvEkhh","colab_type":"text"},"source":["<시작하세요! 텐서플로 2.0 프로그래밍> 예제코드입니다.\n","\n","- 예제 코드를 실행하기 위해서는 [파일] > [드라이브에 사본 저장]으로 본인의 계정에 사본을 만든 다음 실행하면 됩니다.\n","- 예제 코드는 [깃허브 저장소](https://github.com/wikibook/tf2)에서도 동일하게 제공됩니다. 예제에 대한 질문이나 책에 대한 질문은 깃허브 저장소의 [Issues](https://github.com/wikibook/tf2/issues)에 올려주세요.\n","- 각 장의 예제 파일은 처음부터 끝까지 실행하는 상황을 가정하고 작성되었습니다. 혹시 세션이 다운되는 등의 이유로 실행이 되지 않는 경우가 있다면, 필요한 라이브러리를 import 하신 후에 실행하시면 됩니다. (tensorflow, numpy, pandas 등)"]},{"cell_type":"code","metadata":{"id":"gl58Zr-ZKjRE","colab_type":"code","outputId":"e79e9d7f-37e0-4e15-ba28-62661df716f3","executionInfo":{"status":"ok","timestamp":1575820913129,"user_tz":-540,"elapsed":4211,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mAJC9PPBoQ91glDwFjxm3TlW5EqGy0BIAJ52D-ekw=s64","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":35}},"source":["# 텐서플로 2 버전 선택\n","try:\n"," # %tensorflow_version only exists in Colab.\n"," %tensorflow_version 2.x\n","except Exception:\n"," pass\n","import tensorflow as tf\n","import numpy as np"],"execution_count":0,"outputs":[{"output_type":"stream","text":["TensorFlow 2.x selected.\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"OSciZqogK0Mg","colab_type":"text"},"source":["# 7.2 주요 레이어 정리"]},{"cell_type":"markdown","metadata":{"id":"8DmYqaWfcxJa","colab_type":"text"},"source":["## 7.2.1 SimpleRNN 레이어"]},{"cell_type":"code","metadata":{"id":"s0f2FG66cx27","colab_type":"code","colab":{}},"source":["# 7.1 SimpleRNN 레이어 생성 코드\n","rnn1 = tf.keras.layers.SimpleRNN(units=1, activation='tanh', return_sequences=True)"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"vU4_rMdw47Au","colab_type":"code","outputId":"c395215a-9a07-4a78-f9d2-d088c9c8a0a9","executionInfo":{"status":"ok","timestamp":1565400947872,"user_tz":-540,"elapsed":43014,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":449}},"source":["# 7.2 시퀀스 예측 데이터 생성\n","X = []\n","Y = []\n","for i in range(6):\n"," # [0,1,2,3], [1,2,3,4] 같은 정수의 시퀀스를 만듭니다.\n"," lst = list(range(i,i+4))\n","\n"," # 위에서 구한 시퀀스의 숫자들을 각각 10으로 나눈 다음 저장합니다.\n"," # SimpleRNN 에 각 타임스텝에 하나씩 숫자가 들어가기 때문에 여기서도 하나씩 분리해서 배열에 저장합니다.\n"," X.append(list(map(lambda c: [c/10], lst)))\n","\n"," # 정답에 해당하는 4, 5 등의 정수를 역시 위처럼 10으로 나눠서 저장합니다.\n"," Y.append((i+4)/10)\n"," \n","X = np.array(X)\n","Y = np.array(Y)\n","for i in range(len(X)):\n"," print(X[i], Y[i])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["[[0. ]\n"," [0.1]\n"," [0.2]\n"," [0.3]] 0.4\n","[[0.1]\n"," [0.2]\n"," [0.3]\n"," [0.4]] 0.5\n","[[0.2]\n"," [0.3]\n"," [0.4]\n"," [0.5]] 0.6\n","[[0.3]\n"," [0.4]\n"," [0.5]\n"," [0.6]] 0.7\n","[[0.4]\n"," [0.5]\n"," [0.6]\n"," [0.7]] 0.8\n","[[0.5]\n"," [0.6]\n"," [0.7]\n"," [0.8]] 0.9\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"yFdjOc6G5kO1","colab_type":"code","outputId":"b1f16a66-1bc5-439e-e51b-89709bd3a85f","executionInfo":{"status":"ok","timestamp":1565420204501,"user_tz":-540,"elapsed":3098,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":233}},"source":["# 7.3 시퀀스 예측 모델 정의\n","model = tf.keras.Sequential([\n"," tf.keras.layers.SimpleRNN(units=10, return_sequences=False, input_shape=[4,1]),\n"," tf.keras.layers.Dense(1)\n","])\n","\n","model.compile(optimizer='adam', loss='mse')\n","model.summary()"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Model: \"sequential_8\"\n","_________________________________________________________________\n","Layer (type) Output Shape Param # \n","=================================================================\n","simple_rnn_6 (SimpleRNN) (None, 10) 120 \n","_________________________________________________________________\n","dense_8 (Dense) (None, 1) 11 \n","=================================================================\n","Total params: 131\n","Trainable params: 131\n","Non-trainable params: 0\n","_________________________________________________________________\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"7odqgVWw5oyH","colab_type":"code","outputId":"c67cc65e-2ea1-4f8a-b979-9977d5827747","executionInfo":{"status":"ok","timestamp":1565095662369,"user_tz":-540,"elapsed":3394,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":125}},"source":["# 7.4 네트워크 훈련 및 결과 확인\n","model.fit(X, Y, epochs=100, verbose=0)\n","print(model.predict(X))"],"execution_count":0,"outputs":[{"output_type":"stream","text":["[[0.46641627]\n"," [0.5727007 ]\n"," [0.66080105]\n"," [0.72964305]\n"," [0.7798768 ]\n"," [0.81313634]]\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"KQUaYRRG7aWA","colab_type":"code","outputId":"c5baa2e9-e25c-4195-98a6-2b58d1b0fdb1","executionInfo":{"status":"ok","timestamp":1565095663313,"user_tz":-540,"elapsed":805,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":53}},"source":["# 7.5 학습되지 않은 시퀀스에 대한 예측 결과\n","print(model.predict(np.array([[[0.6],[0.7],[0.8],[0.9]]])))\n","print(model.predict(np.array([[[-0.1],[0.0],[0.1],[0.2]]])))"],"execution_count":0,"outputs":[{"output_type":"stream","text":["[[0.8314607]]\n","[[0.3454302]]\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"HGzdLJHZvSUg","colab_type":"text"},"source":["## 7.2.2 LSTM 레이어"]},{"cell_type":"code","metadata":{"id":"iYyU1BKZFDvo","colab_type":"code","outputId":"579631eb-65e7-4e6f-96ef-a1b15fd83823","executionInfo":{"status":"ok","timestamp":1565400949229,"user_tz":-540,"elapsed":40878,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":1000}},"source":["# 7.6 곱셈 문제 데이터 생성\n","X = []\n","Y = []\n","for i in range(3000):\n"," # 0~1 사이의 랜덤한 숫자 100 개를 만듭니다.\n"," lst = np.random.rand(100)\n"," # 마킹할 숫자 2개의 인덱스를 뽑습니다.\n"," idx = np.random.choice(100, 2, replace=False)\n"," # 마킹 인덱스가 저장된 원-핫 인코딩 벡터를 만듭니다.\n"," zeros = np.zeros(100)\n"," zeros[idx] = 1\n"," # 마킹 인덱스와 랜덤한 숫자를 합쳐서 X 에 저장합니다.\n"," X.append(np.array(list(zip(zeros, lst))))\n"," # 마킹 인덱스가 1인 값들만 서로 곱해서 Y 에 저장합니다.\n"," Y.append(np.prod(lst[idx]))\n"," \n","print(X[0], Y[0])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["[[0. 0.71500918]\n"," [0. 0.50462317]\n"," [0. 0.79823579]\n"," [0. 0.87088728]\n"," [0. 0.06404519]\n"," [0. 0.74275039]\n"," [0. 0.47803341]\n"," [0. 0.80781902]\n"," [0. 0.6592144 ]\n"," [0. 0.60070947]\n"," [0. 0.23206705]\n"," [0. 0.49119176]\n"," [0. 0.26349428]\n"," [0. 0.09759818]\n"," [0. 0.59417387]\n"," [0. 0.69955166]\n"," [0. 0.24426289]\n"," [1. 0.00469047]\n"," [0. 0.11305018]\n"," [0. 0.01977969]\n"," [0. 0.34769719]\n"," [0. 0.35876183]\n"," [0. 0.8172711 ]\n"," [0. 0.17547484]\n"," [0. 0.38501168]\n"," [0. 0.34624459]\n"," [0. 0.47679437]\n"," [0. 0.3683685 ]\n"," [0. 0.46798767]\n"," [0. 0.4482542 ]\n"," [0. 0.77268146]\n"," [0. 0.34406317]\n"," [0. 0.58179208]\n"," [0. 0.18706241]\n"," [0. 0.83332038]\n"," [0. 0.26600481]\n"," [0. 0.29890546]\n"," [0. 0.15680724]\n"," [0. 0.34085863]\n"," [0. 0.4779582 ]\n"," [0. 0.24719369]\n"," [0. 0.76483868]\n"," [1. 0.3036142 ]\n"," [0. 0.37056323]\n"," [0. 0.3128427 ]\n"," [0. 0.74138828]\n"," [0. 0.45711082]\n"," [0. 0.60190692]\n"," [0. 0.57416477]\n"," [0. 0.57890764]\n"," [0. 0.93477822]\n"," [0. 0.17047107]\n"," [0. 0.02795573]\n"," [0. 0.79423586]\n"," [0. 0.47983346]\n"," [0. 0.49332266]\n"," [0. 0.71598579]\n"," [0. 0.86772118]\n"," [0. 0.95684813]\n"," [0. 0.38645588]\n"," [0. 0.14250415]\n"," [0. 0.80416655]\n"," [0. 0.883508 ]\n"," [0. 0.92172291]\n"," [0. 0.19238297]\n"," [0. 0.72301668]\n"," [0. 0.03656848]\n"," [0. 0.9334998 ]\n"," [0. 0.23416156]\n"," [0. 0.65510332]\n"," [0. 0.58275211]\n"," [0. 0.74874064]\n"," [0. 0.604646 ]\n"," [0. 0.95259867]\n"," [0. 0.89925378]\n"," [0. 0.81326904]\n"," [0. 0.9001764 ]\n"," [0. 0.09535334]\n"," [0. 0.39966309]\n"," [0. 0.19335457]\n"," [0. 0.92691053]\n"," [0. 0.33134001]\n"," [0. 0.08800828]\n"," [0. 0.21056985]\n"," [0. 0.20325521]\n"," [0. 0.56967302]\n"," [0. 0.34909402]\n"," [0. 0.09262938]\n"," [0. 0.06126583]\n"," [0. 0.14008456]\n"," [0. 0.02351988]\n"," [0. 0.34421416]\n"," [0. 0.8710241 ]\n"," [0. 0.61939828]\n"," [0. 0.84775368]\n"," [0. 0.03327324]\n"," [0. 0.79232725]\n"," [0. 0.58430952]\n"," [0. 0.57418694]\n"," [0. 0.97540729]] 0.0014240921999715036\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"doitxA8uOm5i","colab_type":"code","outputId":"d2cf0fe0-2497-4fb0-91e9-35f82da28b8c","executionInfo":{"status":"ok","timestamp":1565420208111,"user_tz":-540,"elapsed":1081,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":269}},"source":["# 7.7 SimpleRNN 레이어를 사용한 곱셈 문제 모델 정의\n","model = tf.keras.Sequential([\n"," tf.keras.layers.SimpleRNN(units=30, return_sequences=True, input_shape=[100,2]),\n"," tf.keras.layers.SimpleRNN(units=30),\n"," tf.keras.layers.Dense(1)\n","])\n","\n","model.compile(optimizer='adam', loss='mse')\n","model.summary()"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Model: \"sequential_9\"\n","_________________________________________________________________\n","Layer (type) Output Shape Param # \n","=================================================================\n","simple_rnn_7 (SimpleRNN) (None, 100, 30) 990 \n","_________________________________________________________________\n","simple_rnn_8 (SimpleRNN) (None, 30) 1830 \n","_________________________________________________________________\n","dense_9 (Dense) (None, 1) 31 \n","=================================================================\n","Total params: 2,851\n","Trainable params: 2,851\n","Non-trainable params: 0\n","_________________________________________________________________\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"HTp4nvHYOqOZ","colab_type":"code","outputId":"eb794c29-17b8-4a37-8d37-36fce66569fa","executionInfo":{"status":"ok","timestamp":1565017987773,"user_tz":-540,"elapsed":1863900,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":1000}},"source":["# 7.8 SimpleRNN 네트워크 학습\n","X = np.array(X)\n","Y = np.array(Y)\n","# 2560개의 데이터만 학습시킵니다. validation 데이터는 20% 로 지정합니다.\n","history = model.fit(X[:2560], Y[:2560], epochs=100, validation_split=0.2)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Train on 2048 samples, validate on 512 samples\n","Epoch 1/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0987 - val_loss: 0.0544\n","Epoch 2/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0530 - val_loss: 0.0514\n","Epoch 3/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0529 - val_loss: 0.0567\n","Epoch 4/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0531 - val_loss: 0.0512\n","Epoch 5/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0520 - val_loss: 0.0504\n","Epoch 6/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0509 - val_loss: 0.0515\n","Epoch 7/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0509 - val_loss: 0.0505\n","Epoch 8/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0507 - val_loss: 0.0526\n","Epoch 9/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0518 - val_loss: 0.0548\n","Epoch 10/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0519 - val_loss: 0.0513\n","Epoch 11/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0503 - val_loss: 0.0522\n","Epoch 12/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0520 - val_loss: 0.0514\n","Epoch 13/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0503 - val_loss: 0.0509\n","Epoch 14/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0505 - val_loss: 0.0513\n","Epoch 15/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0505 - val_loss: 0.0528\n","Epoch 16/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0505 - val_loss: 0.0525\n","Epoch 17/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0505 - val_loss: 0.0526\n","Epoch 18/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0497 - val_loss: 0.0512\n","Epoch 19/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0507 - val_loss: 0.0514\n","Epoch 20/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0511 - val_loss: 0.0548\n","Epoch 21/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0500 - val_loss: 0.0518\n","Epoch 22/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0494 - val_loss: 0.0523\n","Epoch 23/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0492 - val_loss: 0.0514\n","Epoch 24/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0497 - val_loss: 0.0528\n","Epoch 25/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0489 - val_loss: 0.0518\n","Epoch 26/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0492 - val_loss: 0.0540\n","Epoch 27/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0491 - val_loss: 0.0526\n","Epoch 28/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0488 - val_loss: 0.0528\n","Epoch 29/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0478 - val_loss: 0.0526\n","Epoch 30/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0481 - val_loss: 0.0522\n","Epoch 31/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0476 - val_loss: 0.0551\n","Epoch 32/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0473 - val_loss: 0.0549\n","Epoch 33/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0468 - val_loss: 0.0544\n","Epoch 34/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0484 - val_loss: 0.0542\n","Epoch 35/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0472 - val_loss: 0.0573\n","Epoch 36/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0469 - val_loss: 0.0533\n","Epoch 37/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0458 - val_loss: 0.0519\n","Epoch 38/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0466 - val_loss: 0.0569\n","Epoch 39/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0468 - val_loss: 0.0562\n","Epoch 40/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0466 - val_loss: 0.0555\n","Epoch 41/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0456 - val_loss: 0.0545\n","Epoch 42/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0446 - val_loss: 0.0560\n","Epoch 43/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0444 - val_loss: 0.0547\n","Epoch 44/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0443 - val_loss: 0.0538\n","Epoch 45/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0442 - val_loss: 0.0579\n","Epoch 46/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0446 - val_loss: 0.0564\n","Epoch 47/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0436 - val_loss: 0.0551\n","Epoch 48/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0430 - val_loss: 0.0552\n","Epoch 49/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0435 - val_loss: 0.0543\n","Epoch 50/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0419 - val_loss: 0.0592\n","Epoch 51/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0427 - val_loss: 0.0570\n","Epoch 52/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0422 - val_loss: 0.0546\n","Epoch 53/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0419 - val_loss: 0.0583\n","Epoch 54/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0424 - val_loss: 0.0547\n","Epoch 55/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0418 - val_loss: 0.0574\n","Epoch 56/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0418 - val_loss: 0.0577\n","Epoch 57/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0406 - val_loss: 0.0546\n","Epoch 58/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0401 - val_loss: 0.0580\n","Epoch 59/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0409 - val_loss: 0.0551\n","Epoch 60/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0392 - val_loss: 0.0566\n","Epoch 61/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0400 - val_loss: 0.0583\n","Epoch 62/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0392 - val_loss: 0.0577\n","Epoch 63/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0378 - val_loss: 0.0614\n","Epoch 64/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0382 - val_loss: 0.0624\n","Epoch 65/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0371 - val_loss: 0.0599\n","Epoch 66/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0379 - val_loss: 0.0635\n","Epoch 67/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0391 - val_loss: 0.0601\n","Epoch 68/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0377 - val_loss: 0.0633\n","Epoch 69/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0373 - val_loss: 0.0595\n","Epoch 70/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0361 - val_loss: 0.0600\n","Epoch 71/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0351 - val_loss: 0.0592\n","Epoch 72/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0349 - val_loss: 0.0617\n","Epoch 73/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0354 - val_loss: 0.0605\n","Epoch 74/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0337 - val_loss: 0.0602\n","Epoch 75/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0338 - val_loss: 0.0611\n","Epoch 76/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0338 - val_loss: 0.0628\n","Epoch 77/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0326 - val_loss: 0.0602\n","Epoch 78/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0335 - val_loss: 0.0619\n","Epoch 79/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0334 - val_loss: 0.0639\n","Epoch 80/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0322 - val_loss: 0.0631\n","Epoch 81/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0322 - val_loss: 0.0642\n","Epoch 82/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0311 - val_loss: 0.0627\n","Epoch 83/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0312 - val_loss: 0.0635\n","Epoch 84/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0312 - val_loss: 0.0630\n","Epoch 85/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0301 - val_loss: 0.0641\n","Epoch 86/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0299 - val_loss: 0.0614\n","Epoch 87/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0303 - val_loss: 0.0652\n","Epoch 88/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0287 - val_loss: 0.0659\n","Epoch 89/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0279 - val_loss: 0.0651\n","Epoch 90/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0280 - val_loss: 0.0680\n","Epoch 91/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0291 - val_loss: 0.0688\n","Epoch 92/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0276 - val_loss: 0.0663\n","Epoch 93/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0275 - val_loss: 0.0684\n","Epoch 94/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0267 - val_loss: 0.0682\n","Epoch 95/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0262 - val_loss: 0.0688\n","Epoch 96/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0252 - val_loss: 0.0701\n","Epoch 97/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0250 - val_loss: 0.0684\n","Epoch 98/100\n","2048/2048 [==============================] - 18s 9ms/sample - loss: 0.0259 - val_loss: 0.0682\n","Epoch 99/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0246 - val_loss: 0.0708\n","Epoch 100/100\n","2048/2048 [==============================] - 19s 9ms/sample - loss: 0.0242 - val_loss: 0.0748\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"3EiSvd5rOsIV","colab_type":"code","outputId":"5b51499b-b5cd-4a94-b733-424f4e46faeb","executionInfo":{"status":"ok","timestamp":1565020968714,"user_tz":-540,"elapsed":1323,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":283}},"source":["# 7.9 SimpleRNN 네트워크 학습 결과 확인\n","import matplotlib.pyplot as plt\n","plt.plot(history.history['loss'], 'b-', label='loss')\n","plt.plot(history.history['val_loss'], 'r--', label='val_loss')\n","plt.xlabel('Epoch')\n","plt.legend()\n","plt.show()"],"execution_count":0,"outputs":[{"output_type":"display_data","data":{"image/png":"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\nv0IFe/agX8p88401EJa077+3Rs0xY6xK5GBs32712ccfbw2mCxbAe+9lTbN3r9WFX389HHZY7sdZ\nutRGwv7nP/DEE1n3ZRxvwoTcP/vxx3D00fDjjzbF8G+/WV37ww8XzwRpLrqF0pm/JB/hGJz17LM2\nhmTjxiIfyoVLerp9KWCv87J5s43Y3Ls3fOceMcJGj/brpyqiOmPGwX0+I7+pqTbU+9hjs47yfP99\nu65331V95hnVVasy961aZZ//6y8bDXvllapVqtggpQwdO6q2bJn7uTdsUK1VS/WEE2zgk3N5IIyD\ns8ocL+mXQt9+a88vvJB/974nnrB5ZJo1gzfeCM/siJ9+atUz48ZZf/OBAw+u0TUjv3FxNlfNihU2\neCnDZ5/ZhGUnn2y/BjL2/fWX1b0PHWr/KBs0sGvbvRs++MDSrFtnVUh9+thAq+7dMydHU4V//tPm\nqHnrrYL7vzsXgqgO+n9321yxwqoWXOS89pp1Cbw0e2/fbObMgWOOsUU9Bg606pSC5LfU37p1Vod+\n/vl2/smTrX78kktsGuL8TJkCJ5xgI1Uz9Oxp87QH/3v6979tUFOTJja52dSptv3dd22Q00UXZabt\n0MGqaM46y95v2WI3pD59rJro448zZ6J88kmYPt1GwrZoUfDfwblQhPJzoCQf4ajeefvtoKlFnnjC\n3jRtWuTjukLas8fmZ7n8ctWXXlK95JK80959t9XPpaWpzpyZuX3aNNVdu3Km/+gjm//l/vtzP964\ncfb9L16cue3dd62a591388/3sGGqlSvnnEMmeIKx7B5+2M63Zo3NQdOsWdZJx/Kzd6/qYYdZNVR6\nuuqAATanTX7VYc4FEK4J10r6EY6g/957dmULF6pqr172Ji4uaz2qKzkbNqj+8582g+Ojj9r3sXZt\n6J9PTlaNj1dt2FA1KSlz+6+/WpCsVMmOOXFizs+OGaN6/PE5A+eyZQWf98QTVc85J+/9v/9uN5s7\n7sjc9vPPlpdLL7XnZ5/N+bn0dNW33lJ99VVrwwh2ww2qFSqobtpk6fbtKzifzmmMB/2PP7Yr+/67\ndNUjj7RSJqjOmVPkY7sgDz+sevPNqo89pvrGGxaoCrJ4sX0XL72Uc98ff+TdWDlnjgX9SpXsrq5q\npf+6dS3Qnn22avfuuZeK8yspz5ljJfITTrDZHzt0sJvJtm32a2DUqNw/9803diMqX171wguz7jvh\n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\n","text/plain":["
"]},"metadata":{"tags":[]}}]},{"cell_type":"code","metadata":{"id":"g5OnirteOyut","colab_type":"code","outputId":"09b4541d-aa7e-4906-b950-b119ac841168","executionInfo":{"status":"ok","timestamp":1565020973154,"user_tz":-540,"elapsed":3140,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":143}},"source":["# 7.10 Test 데이터에 대한 예측 정확도 확인\n","model.evaluate(X[2560:], Y[2560:])\n","prediction = model.predict(X[2560:2560+5])\n","# 5개 테스트 데이터에 대한 예측을 표시합니다.\n","for i in range(5):\n"," print(Y[2560+i], '\\t', prediction[i][0], '\\tdiff:', abs(prediction[i][0] - Y[2560+i]))\n"," \n","prediction = model.predict(X[2560:])\n","fail = 0\n","for i in range(len(prediction)):\n"," # 오차가 0.04 이상이면 오답입니다.\n"," if abs(prediction[i][0] - Y[2560+i]) > 0.04:\n"," fail += 1\n","print('correctness:', (440 - fail) / 440 * 100, '%')"],"execution_count":0,"outputs":[{"output_type":"stream","text":["440/440 [==============================] - 1s 2ms/sample - loss: 0.0805\n","0.034887773363423434 \t 0.37500668 \tdiff: 0.34011890235679143\n","0.00034131119754715394 \t 0.012471177 \tdiff: 0.012129865486355586\n","0.4893153311074549 \t 0.4436293 \tdiff: 0.04568603647358954\n","0.153814953074304 \t 0.32798985 \tdiff: 0.1741748933936678\n","0.22067859331833786 \t 0.13175683 \tdiff: 0.088921766083116\n","correctness: 9.318181818181818 %\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"6o1z24gWIe4B","colab_type":"code","outputId":"7124a02f-34bb-4114-8b9e-d8168c576e7d","executionInfo":{"status":"ok","timestamp":1565420214041,"user_tz":-540,"elapsed":1051,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":325}},"source":["# 7.11 LSTM 레이어를 사용한 곱셈 문제 모델 정의\n","model = tf.keras.Sequential([\n"," tf.keras.layers.LSTM(units=30, return_sequences=True, input_shape=[100,2]),\n"," tf.keras.layers.LSTM(units=30),\n"," tf.keras.layers.Dense(1)\n","])\n","\n","model.compile(optimizer='adam', loss='mse')\n","model.summary()"],"execution_count":0,"outputs":[{"output_type":"stream","text":["W0810 06:56:56.334852 140069235160960 tf_logging.py:161] : Note that this layer is not optimized for performance. Please use tf.keras.layers.CuDNNLSTM for better performance on GPU.\n","W0810 06:56:56.355059 140069235160960 tf_logging.py:161] : Note that this layer is not optimized for performance. Please use tf.keras.layers.CuDNNLSTM for better performance on GPU.\n"],"name":"stderr"},{"output_type":"stream","text":["Model: \"sequential_10\"\n","_________________________________________________________________\n","Layer (type) Output Shape Param # \n","=================================================================\n","unified_lstm_4 (UnifiedLSTM) (None, 100, 30) 3960 \n","_________________________________________________________________\n","unified_lstm_5 (UnifiedLSTM) (None, 30) 7320 \n","_________________________________________________________________\n","dense_10 (Dense) (None, 1) 31 \n","=================================================================\n","Total params: 11,311\n","Trainable params: 11,311\n","Non-trainable params: 0\n","_________________________________________________________________\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"XavhYhX4Imax","colab_type":"code","outputId":"d6f20c85-3fdd-4115-fbfc-56a91ef82c4f","executionInfo":{"status":"ok","timestamp":1565249375352,"user_tz":-540,"elapsed":285145,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":1000}},"source":["# 7.12 LSTM 네트워크 학습\n","X = np.array(X)\n","Y = np.array(Y)\n","history = model.fit(X[:2560], Y[:2560], epochs=100, validation_split=0.2)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Train on 2048 samples, validate on 512 samples\n","Epoch 1/100\n","2048/2048 [==============================] - 6s 3ms/sample - loss: 0.0526 - val_loss: 0.0508\n","Epoch 2/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0484 - val_loss: 0.0507\n","Epoch 3/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0482 - val_loss: 0.0514\n","Epoch 4/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0481 - val_loss: 0.0513\n","Epoch 5/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0481 - val_loss: 0.0516\n","Epoch 6/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0481 - val_loss: 0.0507\n","Epoch 7/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0478 - val_loss: 0.0507\n","Epoch 8/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0480 - val_loss: 0.0506\n","Epoch 9/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0479 - val_loss: 0.0525\n","Epoch 10/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0476 - val_loss: 0.0506\n","Epoch 11/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0478 - val_loss: 0.0513\n","Epoch 12/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0479 - val_loss: 0.0506\n","Epoch 13/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0477 - val_loss: 0.0511\n","Epoch 14/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0477 - val_loss: 0.0507\n","Epoch 15/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0477 - val_loss: 0.0505\n","Epoch 16/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0476 - val_loss: 0.0505\n","Epoch 17/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0476 - val_loss: 0.0505\n","Epoch 18/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0477 - val_loss: 0.0510\n","Epoch 19/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0475 - val_loss: 0.0505\n","Epoch 20/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0475 - val_loss: 0.0509\n","Epoch 21/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0475 - val_loss: 0.0507\n","Epoch 22/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0477 - val_loss: 0.0518\n","Epoch 23/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0474 - val_loss: 0.0508\n","Epoch 24/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0478 - val_loss: 0.0507\n","Epoch 25/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0476 - val_loss: 0.0503\n","Epoch 26/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0477 - val_loss: 0.0503\n","Epoch 27/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0470 - val_loss: 0.0503\n","Epoch 28/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0494 - val_loss: 0.0511\n","Epoch 29/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0470 - val_loss: 0.0498\n","Epoch 30/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0454 - val_loss: 0.0421\n","Epoch 31/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0400 - val_loss: 0.0375\n","Epoch 32/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0450 - val_loss: 0.0492\n","Epoch 33/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0409 - val_loss: 0.0506\n","Epoch 34/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0370 - val_loss: 0.0373\n","Epoch 35/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0310 - val_loss: 0.0671\n","Epoch 36/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0277 - val_loss: 0.0249\n","Epoch 37/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0228 - val_loss: 0.0187\n","Epoch 38/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0168 - val_loss: 0.0143\n","Epoch 39/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0147 - val_loss: 0.0114\n","Epoch 40/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0122 - val_loss: 0.0114\n","Epoch 41/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0126 - val_loss: 0.0206\n","Epoch 42/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0125 - val_loss: 0.0095\n","Epoch 43/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0093 - val_loss: 0.0107\n","Epoch 44/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0089 - val_loss: 0.0082\n","Epoch 45/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0078 - val_loss: 0.0084\n","Epoch 46/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0077 - val_loss: 0.0073\n","Epoch 47/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0060 - val_loss: 0.0076\n","Epoch 48/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0056 - val_loss: 0.0056\n","Epoch 49/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0048 - val_loss: 0.0045\n","Epoch 50/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0046 - val_loss: 0.0041\n","Epoch 51/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0037 - val_loss: 0.0040\n","Epoch 52/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0038 - val_loss: 0.0034\n","Epoch 53/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0031 - val_loss: 0.0034\n","Epoch 54/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0030 - val_loss: 0.0040\n","Epoch 55/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0027 - val_loss: 0.0029\n","Epoch 56/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0023 - val_loss: 0.0026\n","Epoch 57/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0028 - val_loss: 0.0025\n","Epoch 58/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0018 - val_loss: 0.0023\n","Epoch 59/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0021 - val_loss: 0.0025\n","Epoch 60/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0019 - val_loss: 0.0021\n","Epoch 61/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0016 - val_loss: 0.0025\n","Epoch 62/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0016 - val_loss: 0.0020\n","Epoch 63/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0021 - val_loss: 0.0020\n","Epoch 64/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0019 - val_loss: 0.0033\n","Epoch 65/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0018 - val_loss: 0.0019\n","Epoch 66/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0020 - val_loss: 0.0023\n","Epoch 67/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0016 - val_loss: 0.0019\n","Epoch 68/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0016 - val_loss: 0.0020\n","Epoch 69/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0015 - val_loss: 0.0015\n","Epoch 70/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0013 - val_loss: 0.0015\n","Epoch 71/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0013 - val_loss: 0.0015\n","Epoch 72/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0014 - val_loss: 0.0015\n","Epoch 73/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0014 - val_loss: 0.0015\n","Epoch 74/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 9.8113e-04 - val_loss: 0.0014\n","Epoch 75/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 9.6374e-04 - val_loss: 0.0014\n","Epoch 76/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 9.6291e-04 - val_loss: 0.0012\n","Epoch 77/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 9.6295e-04 - val_loss: 0.0012\n","Epoch 78/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 9.3042e-04 - val_loss: 0.0017\n","Epoch 79/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0013 - val_loss: 0.0011\n","Epoch 80/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 9.0471e-04 - val_loss: 0.0011\n","Epoch 81/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0011 - val_loss: 0.0012\n","Epoch 82/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0010 - val_loss: 0.0011\n","Epoch 83/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 9.2191e-04 - val_loss: 9.0652e-04\n","Epoch 84/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 7.4902e-04 - val_loss: 0.0012\n","Epoch 85/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 9.6879e-04 - val_loss: 8.9269e-04\n","Epoch 86/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 7.3660e-04 - val_loss: 8.4929e-04\n","Epoch 87/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 6.2718e-04 - val_loss: 8.4783e-04\n","Epoch 88/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 7.0590e-04 - val_loss: 8.6072e-04\n","Epoch 89/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0011 - val_loss: 0.0012\n","Epoch 90/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 8.6760e-04 - val_loss: 8.2993e-04\n","Epoch 91/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 9.0278e-04 - val_loss: 0.0013\n","Epoch 92/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 6.7411e-04 - val_loss: 7.3806e-04\n","Epoch 93/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 6.9900e-04 - val_loss: 6.9523e-04\n","Epoch 94/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 5.5824e-04 - val_loss: 8.0767e-04\n","Epoch 95/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 9.1564e-04 - val_loss: 7.8212e-04\n","Epoch 96/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 6.6581e-04 - val_loss: 6.9919e-04\n","Epoch 97/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 5.8539e-04 - val_loss: 7.7874e-04\n","Epoch 98/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 5.9506e-04 - val_loss: 5.3631e-04\n","Epoch 99/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0012 - val_loss: 0.0015\n","Epoch 100/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 6.5871e-04 - val_loss: 5.9089e-04\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"NJSlA-z7NRHE","colab_type":"code","outputId":"7a17b10f-139b-4afc-be65-a70dd039bf30","executionInfo":{"status":"ok","timestamp":1565015931206,"user_tz":-540,"elapsed":80481,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":283}},"source":["# 7.13 LSTM 네트워크 학습 결과 확인\n","import matplotlib.pyplot as plt\n","plt.plot(history.history['loss'], 'b-', label='loss')\n","plt.plot(history.history['val_loss'], 'r--', label='val_loss')\n","plt.xlabel('Epoch')\n","plt.legend()\n","plt.show()"],"execution_count":0,"outputs":[{"output_type":"display_data","data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAX0AAAEKCAYAAAD+XoUoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XucTeX+wPHPd25mmHGdQWNcRpRI\nyLh1jktJpYSSJCod3VSku3SXTqlzup0cTqXCUZEuv1FKhUIHGfcQuRvXGZdxGWMu+/v7Y21sY7Ax\nM3vs9X2/Xvu1137Ws9f6rll897Of/axniapijDHGHUICHYAxxpjiY0nfGGNcxJK+Mca4iCV9Y4xx\nEUv6xhjjIpb0jTHGRSzpG2OMi1jSN8YYF7Gkb4wxLhIW6ADyi42N1Vq1agU6DGOMOafMnz8/XVXj\nTlWvxCX9WrVqkZKSEugwjDHmnCIiG/ypZ907xhjjIpb0jTHGRSzpG2OMi5S4Pn1jjDvl5OSQmppK\nVlZWoEMp0SIjI0lISCA8PPyM3m9J3xhTIqSmphITE0OtWrUQkUCHUyKpKjt37iQ1NZXExMQz2oZ1\n7xhjSoSsrCwqVapkCf8kRIRKlSqd1bchS/rGmBLDEv6pne3fyJK+CYiVK+H77wMdhTHuY0nfBMTz\nz8MNN4D9ZmdKkujo6ECHUOQs6ZuAWLbMSfizZgU6EmPcxZK+KXY5OU73DsCPPwY2FmMKoqo8/vjj\nXHzxxTRs2JDx48cDsHXrVtq0aUPjxo25+OKLmTlzJnl5efTp0+dI3TfffDPA0Z9c0AzZVIWvvoIu\nXSA0NNDRmJNZs8ZJ/CEh8MMPMGxYoCMyJc3AgbBoUeFus3FjeOst/+p++eWXLFq0iMWLF5Oenk6z\nZs1o06YNn3zyCVdffTVPP/00eXl5ZGZmsmjRIjZv3szvv/8OwJ49ewo38EIWNC39qVOhWzd49dVA\nR2JOZfly57lrV+c/9o4dgY3HmPxmzZpFz549CQ0NpUqVKrRt25Z58+bRrFkzPvroI1544QWWLl1K\nTEwMtWvXZu3atfTv35/vv/+esmXLBjr8kwqaln779nDrrfDcc9CmDbRuHeiIzIksW+Y8DxgAX34J\nP/3knLtCkZUFeXlQpkwhbdAEgr8t8uLWpk0bZsyYwbfffkufPn145JFHuP3221m8eDFTpkxh5MiR\nTJgwgQ8//DDQoZ5Q0LT0RWDkSKhd20kgO3cGOiJzIsuXQ2Ii/PWvULFiIfbrp6VBVBS88kohbdC4\nVevWrRk/fjx5eXmkpaUxY8YMmjdvzoYNG6hSpQp33303d911FwsWLCA9PR2Px0O3bt0YOnQoCxYs\nCHT4JxU0LX2AmBgYPx5atYI+fSA52fkwMCXEt9/CRRexbFlt6td3fntp397p11cthHP1zDPOc3r6\nWYdq3O2GG25g9uzZNGrUCBHhtddeo2rVqowePZrXX3+d8PBwoqOjGTNmDJs3b+bOO+/E4/EA8EpJ\nb3Soaol6NG3aVM/W22+rguobb5z1plTXrVNdurQQNnQO2Lu36LZ96JBq2bKa97e7NCJC9fHHneL3\n33fO1bJlhbCPSy5xNnbTTYWwMVPcli9fHugQzhkF/a2AFPUjxwZN946v/v2dHwmffBJ++y3fyrQ0\np883vz17jr9SaM8epx+iYcPg/7Vx1Cinr+Wbb4pm+zNnwt69bGvQnquzk2nQwCnu0MF5/uGHs9z+\nvn3gHT1hLX1jTiwok74IfPghxMdDjx6wezdOon/lFahWDa68EvbuPfqGuXPx1D4fT1Jzb2Wvhx5y\nnvv3h7hT3nryeJmZ0L27M0axpEtKgtxceOABJ+7C9s03UKoUGb+tJJkuNA1fAkDNmnDBBYXQrz9v\nHng8Tp++JX1jTsivpC8i14jIShFZLSKDClhfSkTGe9fPFZFa3vJaInJQRBZ5HyMLN/wTq1DB6d9P\nTYW//Q22LtxG7suvsrVuazwzZ+Fpezns2MG2mX9yqHV7UndHk7NsJamNr2P/9gPw9dcwZgw8+yy8\n8w6LFgu9e+bRpg2MGOF8CTiliAinBdq1K+zff8rqaWnOaJbPP3dGtMyfXwTTFGRmOhv2ftvJSMtm\nz27lQJ1G5E77BTZuhKFDC3efqjBpErRvz+Q6A9hPGS785p9HVl97LXz3HfTqBX/8cYb7mDPHeX7n\nHbj//rOP2Zhgdar+HyAUWAPUBiKAxUD9fHXuB0Z6l28BxnuXawG/+9PPdPhxVn36Y8eqtmqlevvt\nqs8+q9qrl25NSFIhT0G1JusUPHoNk/UAUTopto+WivDo0/KyDuyxRV+69EvNJkxvK/u1bqrYUFOr\nNNFXhxzSa65RvYVP9PeQi7Vpvf0KqqVKqXbsqHrnnaqPPab6/PNOP3W/fqpPdl6u71w8Ulu2VL33\n/B81T0J0e+sb9cC+PJ00SfXWW1UrVVKtU0f1mmtU+/ZVbdLE6Y7O/4iNVR08WDU1VXXPHtWvv1Yd\nMEB10CDVuXM86pn+s+qUKbpja65OnKg6apTqokWq2dnOnyQvT3X7duf9qqo6daoqaHZ8DR1Xb4hO\n4Cb9kD4KHg0PV/217u3qCQ9XPYv+1fnzVdeu9SlYv141JER1xAjt2VN1VMxDqmFhqps2qapqxh6P\nPvl4npYurSqi2rOn6sqVp7nTJUtUR44845hN4Fmfvv/Opk/fn6TfCpji8/op4Kl8daYArbzLYUA6\nIMWe9CdMUG3XTjU+3jm06tXV07mzjhu+W//9b9UpU1T/+EN10iTVt3rP0w7N9+hdd6muWXN0Ewu+\nXKcdO6rWq7RD64X9qaBaubLq2HtnqoJ6unXTDYP+rR91GKdX1tuk1aqpXlBqvT7Li/pK6NP6duQT\nuiW0mqaFVdGu7XZr+/aqj4f+UxX0JZ5RUK1YUfWxLqv04WuWa+tGGRpbyaNt26oOHao6e7bzu/Ha\ne17Rnecn6R8VWuhn3KyvyRPaS8YpqMZEZmvfkA91MQ2PfDqsIVHb8LOCaig5GlnKozVrqsaEH9R4\nUrUt0zUx0fmAGd12lP4oVx5576yOQ3XYMNW771atFr5d/yu99ZGbN+n48c7fKzf3+D91To7q+PGq\n33+vmpXllG3Zotqrl7PZ8uVVZ8zweUN6umpGhjZqpHpH23WqoaGqffo461atUq1YUfe+8q4OejxX\nS5d2Vvftq7phw2n+Gzh40Dmhhz/1zDnDkr7/ijrp3wR84PP6NuDdfHV+BxJ8Xq8BYr1J/wCwEPgF\naH2q/RXG6B1VLZT/9B6Pamamk+BU1WnS+zbDR41yyufMcV6HhDhfARITVRcvPrKdfXs9urFtb1XQ\n777O0kOHVPWBB45up3Rp51Gu3NGd33GHauvWqldeqYdq1dWc0AhdW7Od/vyzatbeQ5pXparuSmio\n7zT5UIc2Gq/ral+u879YpytXqs7v/YbmhoTpwdDSR/aRFxKq9135p5Yv7yTUfv1U0+f8qfrpp87X\nAa/UVNX+/VUjI1UvZom24WctU8YJJyXFqTNz5tGBMqAaHa3aqZPzHBGh+sQTqhde6Pwpvvji6CHl\n5jpljz2mqr17O195VJ39t2vnbKxxY9014Ud9tN8BjYhwYm3XzhmJtXr1CU7Utm2qycnO6KPRo53t\nnLCyKaks6fuvJCf9UkAlb1lTYBNQtoB93AOkACk1atQomr9SYcnMVN26VXXFCtUdO5yyvLyCm8O+\nDh5Ufe8951nV6b8YN0719ddVH3lE9dFHVZ977mh9j+fY9+flOf07h23YcHydw2bOVH3qKWe7L7/s\ndHv8/LOqOmH6buZEsrJUd3a8VRV0efwVekOpbzWEXL3wQudfTY+4qbrz/Ga6p3ZjXVirq46KeUg/\nrveKrlngbDw9XbVlS9VKpOuGC69U/fVXXbXKee+HH3r/Hkf6nLzHO2GCakKCUykqSjeszdXBg1V7\n1P5NE1mjoHrppaqvveaMpD1y+GPGOO9ZskT1m2+c5TlzTn2QpkSxpO+/Etu9U8C2fgaSTra/Qmvp\nm7OXmek0satWVQXNqFhTX6s9QgcPVs2cPF31ootUr7tOtUED1TJlnH9O27c77/3HPzTntjt1bL2X\nVEHf7DlXv/jCqTJ37kn2uW+f6uefqw4ffrSseXNV0F2xdXRqhRv1ZZ7SnozTCuU92qKF6tR6/TQv\nOsb5RDv8reubb4ryL2OKwLmW9MuUKXPCdevWrdMGDRoU2b7PJun7c0XuPKCuiCQCm70/1OafKSUZ\nuAOY7f1mME1VVUTigF2qmicitYG6wFo/9mlKgqgoePhhZxjn//0fZUeO5PG2O+A5gHZw9e/OVJmH\nHTwIkZHO8oEDhE38jN4HD5JRuiqPfJpEJe+wzIsuOsk+o6PhppuOLRs7Fr77jgrTp3PFH8u4fF8y\naxp0oVyrW1m1CirNm82v4S2IXx/K+bGxznts2KYxBTpl0lfVXBF5EKc1Hwp8qKrLRGQIzidLMjAK\nGCsiq4FdOB8MAG2AISKSA3iA+1R1V1EciClCERHO9Qbduztj4Q8LyTfiNyrq6PJzz8F998Hw4ZS7\n4ALe2hnCwIFQo4YzXcZpueAC5+G9bkJycqiTk8OI0jjDT5MW8Q95hrfbwYxJsSSCJf1g0K7d8WU3\n3+wMyc3MdMb65tenj/NITz++8fDzzyfd3aBBg6hevToPPPAAAC+88AJhYWFMnz6d3bt3k5OTw9Ch\nQ+nSpctpHUZWVhb9+vUjJSWFsLAw3njjDS6//HKWLVvGnXfeSXZ2Nh6Phy+++IL4+HhuvvlmUlNT\nycvL49lnn6VHjx6ntb9T8WvuHVWdDEzOV/acz3IW0L2A930BfHGWMZqSJH+iP5nKleHFFwEYADRq\nVPDF0KctPNx5AGzdChddROfnb+TVB6D1dWVZ/OxbVLqiTSHsyLhJjx49GDhw4JGkP2HCBKZMmcKA\nAQMoW7Ys6enptGzZks6dO5/WzcmHDx+OiLB06VL++OMPrrrqKlatWsXIkSN56KGH6NWrF9nZ2eTl\n5TF58mTi4+P59ttvAcjIyCj04wyqCddMyda2bRFstFMn6NSJC4BpF0HbtkLH7x9i1jPORSXmHHay\nlnnp0idfHxt7ypZ9fk2aNGHHjh1s2bKFtLQ0KlSoQNWqVXn44YeZMWMGISEhbN68me3bt1O1alW/\ntztr1iz69+8PQL169ahZsyarVq2iVatWvPzyy6SmpnLjjTdSt25dGjZsyKOPPsqTTz5Jp06daF0E\nc8QH5TQMxp0uuQQ++ADS563lX/evCHQ45hzUvXt3Jk6cyPjx4+nRowfjxo0jLS2N+fPns2jRIqpU\nqUJWIV0mf+utt5KcnExUVBTXXnst06ZN44ILLmDBggU0bNiQZ555hiFDhhTKvnxZ0jdBpVs3+O68\nvjQbdS9TpwY6GnOu6dGjB5999hkTJ06ke/fuZGRkULlyZcLDw5k+fTobNmw47W22bt2acePGAbBq\n1So2btzIhRdeyNq1a6lduzYDBgygS5cuLFmyhC1btlC6dGl69+7N448/XiRz81v3jgk657eMJezb\nZbS+DRYvPrO58ow7NWjQgH379lGtWjXOO+88evXqxfXXX0/Dhg1JSkqiXr16p73N+++/n379+tGw\nYUPCwsL4+OOPKVWqFBMmTGDs2LGEh4dTtWpVBg8ezLx583j88ccJCQkhPDycESNGFPoxijO8s+RI\nSkrSlJSUQIdhzmX9+pEz/gsidu/g73+Hp54KdEDGHytWrOCik47nNYcV9LcSkfmqmnSq91r3jgk+\nsbGEZ+wkurTHRm4ak49175jgExsLHg/VY/awd2/FQEdjgtjSpUu57bbbjikrVaoUc+fODVBEp2ZJ\n3wSfa6+FatUIHxx1zL1yTMmnqqc1Bj7QGjZsyKJFi4p1n2fbJW/dOyb41K0LN91EqfKW9M8lkZGR\n7Ny586yTWjBTVXbu3Enk4elOzoC19E3wycyE2bNJjKjHpoxqgY7G+CkhIYHU1FTS0tICHUqJFhkZ\nSUJCwhm/35K+CT5paXDllbRuMoqR2X8LdDTGT+Hh4SQmJgY6jKBn3Tsm+Hhn2qwckm7dO8bkY0nf\nBJ/SpSEykkpqSd+Y/Czpm+AjArGxlM9zkr79LmjMUZb0TXCKjaVcdjqqcOBAoIMxpuSwpG+C0/Dh\nLOw2FMC6eIzxYaN3THC67DJyvRMiZmRAfHxgwzGmpLCWvglOy5ZRb+GngLX0jfFlSd8Ep88/p8nr\ntxJKriV9Y3xY0jfByTtWvyK7LOkb48OSvglO3qQfi43VN8aXJX0TnCzpG1MgS/omOFnSN6ZAlvRN\ncLrwQpg3j9lR7cnICHQwxpQcNk7fBKeoKEhKgnI2ZNMYX9bSN8FrzBiuDv3Jkr4xPizpm+D1/PPc\nfHC0JX1jfFjSN8ErLo5Y0izpG+PDr6QvIteIyEoRWS0igwpYX0pExnvXzxWRWvnW1xCR/SLyWOGE\nbYwfYmOplGdJ3xhfp0z6IhIKDAc6AvWBniJSP1+1vsBuVa0DvAkMy7f+DeC7sw/XmNMQF0f5HEv6\nxvjyp6XfHFitqmtVNRv4DOiSr04XYLR3eSLQXkQEQES6AuuAZYUTsjF+iosjJjvdhmwa48OfpF8N\n2OTzOtVbVmAdVc0FMoBKIhINPAm8ePahGnOannySN+5fw94MtbtnGeNV1D/kvgC8qar7T1ZJRO4R\nkRQRSUlLSyvikIxrxMURUu08PCpkZgY6GGNKBn+S/magus/rBG9ZgXVEJAwoB+wEWgCvich6YCAw\nWEQezL8DVX1PVZNUNSkuLu60D8KYAq1fz+UzXqQGG6xf3xgvf5L+PKCuiCSKSARwC5Ccr04ycId3\n+SZgmjpaq2otVa0FvAX8XVXfLaTYjTm5rVtp9u0L1Ge5JX1jvE45DYOq5npb51OAUOBDVV0mIkOA\nFFVNBkYBY0VkNbAL54PBmMDyfmuMs7H6xhzh19w7qjoZmJyv7Dmf5Syg+ym28cIZxGfMmfMmfZtp\n05ij7IpcE7zKlsUTFk4caTZs0xgvS/omeIngqRhr3TvG+LCkb4La3jkruIf3LOkb42Xz6ZugFl2t\nHIrNqW/MYdbSN0Et4qvxvBL6jCV9Y7ws6ZvgNmsW93mGW9I3xsuSvglucXGU1z3s350T6EiMKREs\n6Zvgdnhaj/T0wMZhTAlhSd8Et9hYAMJ220R+xoAlfRPs4uLICYmAvXZ1ljFgQzZNsGvblr63ZjFz\nlgQ6EmNKBEv6JriJUK68jdM35jDr3jHBTZU+M+7k2j2f2N2zjMGSvgl2ItRfnUxLz68cPBjoYIwJ\nPEv6JugdirZJ14w5zJK+CXrZ5eNsTn1jvCzpm6CXVzHOWvrGeFnSN0Evr3otDlDGkr4xWNI3LpA+\n+E1aMceSvjFY0jcuULas82xJ3xhL+sYFKq74lR/ogGft+kCHYkzAWdI3Qa+07qcDPyFbNgc6FGMC\nzpK+CXoR8d7pldNspk1jLOmb4OedXnn3nzanvjGW9E3w895IZdfKNLKyAhyLMQFmSd8Ev6go9tRp\nSkZuaX79NdDBGBNYNrWycYWwhSmMqAhRP0L79oGOxpjAsZa+cYXoaLjsMvjxx0BHYkxg+ZX0ReQa\nEVkpIqtFZFAB60uJyHjv+rkiUstb3lxEFnkfi0XkhsIN3xg/9e3L64f6s2CBDeIx7nbKpC8iocBw\noCNQH+gpIvXzVesL7FbVOsCbwDBv+e9Akqo2Bq4B/iMi1qVkit+aNVyYvRSAqVMDHIsxAeRPS785\nsFpV16pqNvAZ0CVfnS7AaO/yRKC9iIiqZqpqrrc8ErB7F5nAiI4mhn1UqGBdPMbd/En61YBNPq9T\nvWUF1vEm+QygEoCItBCRZcBS4D6fDwFjik9MDLJ/P+3bww8/YLdONK5V5D/kqupcVW0ANAOeEpHI\n/HVE5B4RSRGRlDTrcDVFIToa9u2jQwdITYWVKwMdkDGB4U/S3wxU93md4C0rsI63z74csNO3gqqu\nAPYDF+ffgaq+p6pJqpoU572QxphC1aABNG1Khw7OS+viMW7lT9KfB9QVkUQRiQBuAZLz1UkG7vAu\n3wRMU1X1vicMQERqAvWA9YUSuTGnY+BAmDSJxESoWRP+979AB2RMYJxyJI2q5orIg8AUIBT4UFWX\nicgQIEVVk4FRwFgRWQ3swvlgAPgrMEhEcgAPcL+q2gQoJqASE2HTplPXMyYY+TV8UlUnA5PzlT3n\ns5wFdC/gfWOBsWcZozFn7/PP4amn4H//IyGhMrNmBTogYwLDrsg17nDoEKxZA3v3kpAAmzeDxxPo\noIwpfpb0jTtERzvP+/dTrRrk5NiVucadLOkbd4iJcZ737SMhwVncbDfSMi5kSd+4g09L/3DST00N\nXDjGBIolfeMOVapAp05QoQLVvNeTW9I3bmSTnxl3qFULJk0CoHIehIVZ945xJ2vpG9cJDYX4eGvp\nG3eypG/cITcXzjsP/vEPAKpVs6Rv3MmSvnGHsDDYtQvSnQvCD4/VN8ZtLOkb94iJgf37ASfpp6ba\nFMvGfSzpG/fwTq8MTvfOgQOQkRHgmIwpZpb0jXvka+mDdfEY97Gkb9yja1f4618BbKy+cS0bp2/c\n46WXjizaVbnGraylb9zF+8ttfLzz0rp3jNtY0jfuce+9ULcuABERULmytfSN+1jSN+4RFnbMcB0b\nq2/cyJK+cY+YmCNDNuHoWH1j3MSSvnGP6GjnDlo5OYBNxWDcyZK+cQ+fOfXBaenv2gUHDwYwJmOK\nmSV94x5Nm0L//hDi/LO3C7SMG9k4feMerVs7Dy/fC7Tq1AlQTMYUM2vpG/dQhawsZ5plrKVv3MmS\nvnGPWbMgKgp++QWwqRiMO1nSN+6R74fc6GgoV86SvnEXS/rGPQ4nfRurb1zMkr5xj5gY59nb0geo\nWhW2bw9QPMYEgCV94x4FtPQrV4a0tADFY0wA+JX0ReQaEVkpIqtFZFAB60uJyHjv+rkiUstb3kFE\n5ovIUu/zFYUbvjGnoUwZePJJaN78SFFcHOzYEcCYjClmpxynLyKhwHCgA5AKzBORZFVd7lOtL7Bb\nVeuIyC3AMKAHkA5cr6pbRORiYApQrbAPwhi/iMCrrx5TVLky7N3rzM5QqlSA4jKmGPnT0m8OrFbV\ntaqaDXwGdMlXpwsw2rs8EWgvIqKqC1V1i7d8GRAlIvZfywTO7t3O3AtecXHOs3XxGLfwJ+lXAzb5\nvE7l+Nb6kTqqmgtkAJXy1ekGLFDVQ2cWqjGFoHlzePDBIy8rV3aeLekbtyiWaRhEpAFOl89VJ1h/\nD3APQI0aNYojJONW+aZXPtzSt3594xb+tPQ3A9V9Xid4ywqsIyJhQDlgp/d1AvAVcLuqriloB6r6\nnqomqWpS3OH/hcYUhejoY4ZsWkvfuI0/SX8eUFdEEkUkArgFSM5XJxm4w7t8EzBNVVVEygPfAoNU\n9dfCCtqYM2YtfeNyp0z63j76B3FG3qwAJqjqMhEZIiKdvdVGAZVEZDXwCHB4WOeDQB3gORFZ5H1U\nLvSjMMZfMTHHtPTLlYPwcGvpG/fwq09fVScDk/OVPeeznAV0L+B9Q4GhZxmjMYWnd2+48sojL0Vs\nrL5xF5tP37hLp07HFVWubEnfuIdNw2DcZc8eWLHCmVvfy6ZiMG5iSd+4y3/+A/XrH3NjXOveMW5i\nSd+4i026ZlzOkr5xlwKmV46Lc176NP6NCVqW9I27nKClD9baN+5gSd+4ywla+mD9+sYdLOkbd2nQ\nwPkxt3btI0XW0jduYuP0jbvEx8M99xxTZC194ybW0jfukpMDKSmwdeuRImvpGzexpG/cZe9eaNYM\nPv/8SFF0NERGWkvfuIMlfeMuBYzeOTz/jrX0jRtY0jfuUqqUM62mz+gdsPl3jHtY0jfuk+9GKmBT\nMRj3sKRv3Ccm5rgMb1MxGLewIZvGfV56Cdq1O6bIWvrGLSzpG/e5/fbjiipXdubeOXAAypQJQEzG\nFBPr3jHu9OefcO21sG4dYBdoGfewpG/cqUwZmD4dhgwBTnKBlqrzwZCaWrzxGVNELOkbd4qPh379\nYMwYWLny+Jb+t99C69ZQvrwzT0/z5gEL1ZjCZEnfuNegQc6luK++enxLf+pUmDPHuZF6ly7OtA0+\nF3QZc66ypG/cq3Jl6NwZfvrp+Jb+G2848/QMH872oe8zf+I6+4XXBAUbvWPcrXdvaNyYMqVyKV06\n7Lg+/W3b4C9d4ti+PY6MrhAamCiNKTTW0jfudt118OSTEBZ2dCqGMWOgaVP2rUunY0fYvnY/DxwY\nxtav5wY6WmPOmiV9Y9LTYdky4uJgxQrY8eUsPGvW0vVvFfn9d3hqcAjDGMS+r6cGOlJjzpp17xjT\nrRscPEi9er8xdixsSfmNhTRn2s8h/Pe/cN11pdn19wpkrt4c6EiNOWvW0jfmsstg4UJGvXuQpXMO\n0ChkKeWvbsHkydCrlzNqc3tYAmJj9U0QsJa+Ma1aQW4u4YtTuBjA46HFg82h49Eq+8olEL3LWvrm\n3OdXS19ErhGRlSKyWkQGFbC+lIiM966fKyK1vOWVRGS6iOwXkXcLN3RjCkmrVs7z7NkQFQU33wwt\nWhxTJa9qNSpmbsbjCUB8xhSiUyZ9EQkFhuO0e+oDPUWkfr5qfYHdqloHeBMY5i3PAp4FHiu0iI0p\nbHFxUKcO/O9/kJQE48cfnYzHa+W9b1CdjWzYEKAYjSkk/rT0mwOrVXWtqmYDnwFd8tXpAoz2Lk8E\n2ouIqOoBVZ2Fk/yNKbk++ACGDYPt2wtcXffSGHIJZ/nyYo7LmELmT9KvBmzyeZ3qLSuwjqrmAhlA\npcII0Jhi0bYtlCsHVavCiBHHrb649Fr+xYNsm74iAMEZU3hKxOgdEblHRFJEJCXNbl9kAiE7G+6/\n31m+5JLjVpcLO8CDDCcr5fdiDsyYwuVP0t8MVPd5neAtK7COiIQB5YCd/gahqu+papKqJsXl60s1\npliEhsJXXznLl156/Ppqzpfb7LU2bNOc2/xJ+vOAuiKSKCIRwC1Acr46ycAd3uWbgGmqqoUXpjFF\nLDQUYmOd5aio49dXqEB2WBShW1Oxf9nmXHbKcfqqmisiDwJTcOab+lBVl4nIECBFVZOBUcBYEVkN\n7ML5YABARNYDZYEIEekKXKUANz+/AAAQ+ElEQVSq9nOYKXn+/BPy8gpeJ8LBCtWonLaZjRuhZs3i\nDc2YwuLXxVmqOhmYnK/sOZ/lLKD7Cd5b6yziM6b4lC9/0tVavQal0zJZvtySvjl3lYgfco05F+RN\n+YkuJNuwTXNOs6RvjJ8qxQpVqsCyZYGOxJgzZ0nfGH/98gsT87qSutjvgWnGlDiW9I3x186d/DX9\n/8j8YyO5uYEOxpgzY0nfGH8lJABQITOVceMCHIsxZ8iSvjH+8l6g1TJhM0OHYq19c06ypG+Mv6pW\nhdBQurVMZfVq+OSTQAdkzOmzpG+Mv0JDoUkTLmgQTqNGWGvfnJPszlnGnI558wgBnrvEubXuZ59B\n+/bO84IFzuzM8fGBDtKYE7Okb8wZ6NrVmYyzXz/IzASPx/kiMGcOTJsG1aufehvGBIJ17xhzOt5/\nH8qVI2T4vxjd/Rv+WnMTgwfDihUwcybs2AFt2sC6dU7Xz8KFMHo0TJoES5ZARkagD8C4nbX0jTkd\ncXGQkwMDBtAY+C48HDr+DPUuA2DqVLjqKmd25uxs51uAr7Aw+Pxz55uCMYFgLX1jTkfXrnDgAGzb\nBr/+6gzj/PHHI6uTkmDRI2Poclkad90Fn37qfAuYMwcmTIC6deHpp7EbrJuAsZa+MadLBKpUcR4L\nFx47O+f771Pj2Xv4+Ikn4NVXYcMGqFULgBYtnJmbe/aEr7+GG28MTPjG3aylb8zZOJzwFyyAhx+G\ne++Fjh3hpZfgzTehYUNYtOhI9e7doU4dePll7GYsJiAs6RtztlTh0UfhrbfgL3+BiRMhIgJuucX5\nUOjY0cn2V19N6OefMWiQ8xkxZUqgAzduZEnfmLMlAmPGwODBzjCd0qWd8vh4mDwZzjvPmY85IwNy\ncrjtNmdI58svO9U2bHDe/uKLcN99TrfPf/5j3wRM0ZCSdivbpKQkTUlJCXQYxhSdAweYd+MrtPnh\naSrXiGLjxqOrYmOhTBnng6B7d/jgAyhbtpjiysiAvn2hdWu4++6jH17mnCAi81U16VT1rKVvTHGb\nPZtmP7xMcpV7aNJYefttZwx/djakpcHatc6VvV9+CU2bQqG0gTZvhn/+Ew4ePHGd77+HL76AgQOd\nH5+HDYNDhwph56YksaRvTHG78koYMoQO2//L18vqMuD7a2k4/2PCw53VISHwxBPw88/OOP/mzeHO\nO2HLlrPY5z33wGOPQefOx188cFiPHs5VZb/8Ak2awKBBTp9TsNuwwfmAy8kJdCTFwpK+MYHw9NPO\n6J6mTZ0x/5s3O+UZGVCvHtxyC3/96QVWvfgpf79rLZ984ozxf/hhJyef9kRvH3wATz3lXD3WqZNz\nrYEvb8LbElELbd3G+ZX57bedH6ODWV6e86v6oEHOJdVuoKol6tG0aVM1xrXWrVPt0kU1MVFVRNX5\nPVe3D/tQe/RQrRa2Tf/CTG1Rdrne122Hjv8kV/fsUT10SHXyZNW//U21Y0fVTz5RzcpS1R9+UM3N\n1QMHVDdsUNVx41RDQlSvvfboPj0e1aQknX35IAXVO+9Uzc09w/hXrjz7v0FxeuIJ1SZNVMPDVfv3\nD3Q0ZwVIUT9ybMCTfP6HJX1jvA4eVF28WPXNN1XXr1dV1cyRo498EChoLiG6jcp6femfFFTLllWt\nWVO1Juv031GPqIK+Hv+GhoY6b2nWTHXafeP14OeTjuzG89NUVdC+vK8NGzr1evdWzclR1VWrVO++\nW3X//lPHO22a84EyYULR/D0KW26uany86vXXq3burFq9uvMBeI7yN+nbFbnGlFSRkc5UnpdccqQo\nqstVkDgFdu7Esz2NLYvS2LR0N9Uat+abG+GqDe8TNukr2DQFT5YwMbI3P1/Uj0F3Qrly8PHHcMXI\nmykzFpr+C+4NG0XLhf+mDJUpfXdvFo5wLiR+5hmnx+exy9JIev99/renPof6DaRVKyesY/z2G4de\n+Sf9ct/l6XJNSLz/AUIuv9wZilSSTZ3q/FDy9tuwbx8kJztXWF96aaAjK1r+fDIU58Na+sachV69\nVKtVUx08WHXjxuNWezyqM2aoPvCAatuWWbpSLlQF/anNi8c0cl977egXium01U1U0xbM1joRG/Ty\ny1U/GLpV9/3rI9Xt2zUrobamhtXQ2LDd2iRsiR4iXFPb3Vp8x3ymevVSLV/e6QfbsUM1Kkr1448D\nHdUZw8+Wvo3TN8bFPDvSOfSfj4kaeC/ExByzbsEC2L8fqv/xI4n3XgXA9KaP8VD267Rb+g7v8BC5\nEoaohxsrzWDQpL8QHQ0zrhzCAzue5+UWyZS/7Xo6VFnC+ZtnkHtdF3LPq054uHPBcqHIzmbP2l18\n8n1FGjaNoHVrP9+3d69z+8s77oARI5yygwchKqqQAit+/o7Tt6RvjDk5Vefy4UqVnNE8FSqwaKEy\nc8h0Er79D+trtqXHL/cfuWNY1t5sdl7QksE5QxizqxOdmMQkOgMwhxZM5woiKpRhVtJAKlYvQ6uU\nf3HF6vcon72d1Oh6bI1rxM5aTTnYow9NmkCjD/pDTAwHO95IVr3GxEz7PyLq1CCzQTM+f2Ieff7d\nHIAUmrI0sQuNnu3MpX0uca6UPpHMTPjvf6FlyyPdZzk5MHs2ePKUtu3kpG8viSzpG2OKnOoJcmtW\nFrr/AOv3VWLmDGX/wj+pv+ILLvr9c6psWQhA24a7WL2zAvfpCNofmsy+0lU4b88Kah9YgiqUZS8g\nDOVpnmQYYeSRSRSlOchH8jf6RYyi/KFtPH/xl1zffBshU3+k6oa5hKBcGzmNlfGXc37F3TSKXMkF\noWtIzFtN1fSlRO5N4+WrfiEvz2nYR0Y6Q/VnT83kq/1XMoGbWd5hIO+844yeBdi9S9m9cD2JTcoj\n5cs5nxBz5qDlK7C31iWUK4czX3ZIwaPgDxxwRuNm7cshZOYvZJWuyN7ERuRqKAkJzrQcZ/shY0nf\nGFMyqTpJMzy84Ezn8eBJ38WaPZVYsFD44w+Iyd7JRWu+ocaGmaw6vyPzq3cl81Ao3bo5c9wdlrl2\nG/Oe/4ZJFW5n684Irv91ELdsGOZsFmEdiSwJb8ojlcehYeEcOgRZWVCxInToAMO+b4Ts3cN3+9uQ\nmwsH6jfjH9kD+PNPJYNylGUfHglBQ0IJzcvh0zJ9ufXAB1xRZRnjDnRhZfsHiLgwkXKx4ZSKieD7\njFZM/D6a9TM20s/zLrczhqpsB2ANtanDakC4pPxGzmsaT+cbw7j//jP7sxZq0heRa4C3gVDgA1V9\nNd/6UsAYoCmwE+ihquu9654C+gJ5wABVPencgpb0jTGFZtYs2LMHzj8frZUIkZEnb1F/9BG8/DJ5\nucrOXTDH04KPOnxC8+bQdONXbJ29nh1/7MJzKJvfYy4j5PK21G1WnswZKdz4ywCSsmcfs7mLWE7Y\nxRfxSuU36fjzE2xu3ImN7W4n0pNJ5KEMUjvfz7p1cMNTF1LqwC5evGcLbw0PP6NDLbSkLyKhwCqg\nA5AKzAN6qupynzr3A5eo6n0icgtwg6r2EJH6wKdAcyAe+Am4QFXzTrQ/S/rGmJIsJ8e5gLpGjeN7\nc9LnrmHn+n3s2p7Dgd3Z1L7pUmo3iII//3RmzqtS5fgNqjq3Vdu0yZkq4wz5m/T9GaffHFitqmu9\nG/4M6AIs96nTBXjBuzwReFdExFv+maoeAtaJyGrv9o79ODTGmHNEePiRm6EdJ7bF+cS2KGBF3bon\n3qCIM+9RMfFn7p1qwCaf16nesgLrqGoukAFU8vO9iMg9IpIiIilpaWn+R2+MMea0lIgJ11T1PVVN\nUtWkuLi4QIdjjDFBy5+kvxmo7vM6wVtWYB0RCQPK4fyg6897jTHGFBN/kv48oK6IJIpIBHALkJyv\nTjJwh3f5JmCa97LgZOAWESklIolAXeC3wgndGGPM6TrlD7mqmisiDwJTcIZsfqiqy0RkCM5cD8nA\nKGCs94faXTgfDHjrTcD50TcXeOBkI3eMMcYULbs4yxhjgoDdI9cYY8xxLOkbY4yLlLjuHRFJAzac\nxSZigfRCCudc4cZjBncetx2ze5zucddU1VOOeS9xSf9siUiKP/1awcSNxwzuPG47ZvcoquO27h1j\njHERS/rGGOMiwZj03wt0AAHgxmMGdx63HbN7FMlxB12fvjHGmBMLxpa+McaYEwiapC8i14jIShFZ\nLSKDAh1PURCR6iIyXUSWi8gyEXnIW15RRH4UkT+9zxUCHWtREJFQEVkoIt94XyeKyFzvOR/vnRsq\naIhIeRGZKCJ/iMgKEWnlhnMtIg97/33/LiKfikhkMJ5rEflQRHaIyO8+ZQWeX3G84z3+JSJy6Znu\nNyiSvvfuXsOBjkB9oKf3rl3BJhd4VFXrAy2BB7zHOQiYqqp1gane18HoIWCFz+thwJuqWgfYjXNb\nzmDyNvC9qtYDGuEce1CfaxGpBgwAklT1Ypz5vm4hOM/1x8A1+cpOdH474kxYWRe4BxhxpjsNiqSP\nz929VDUbOHx3r6CiqltVdYF3eR9OEqiGc6yjvdVGA10DE2HREZEE4DrgA+9rAa7AuVMbBNlxi0g5\noA3OZIaoaraq7sEF5xpnIsgo7zTtpYGtBOG5VtUZOBNU+jrR+e0CjFHHHKC8iJx3JvsNlqTv1x26\ngomI1AKaAHOBKqq61btqG1DAjTjPeW8BTwAe7+tKwB7vndog+M55IpAGfOTt0vpARMoQ5OdaVTcD\n/wA24iT7DGA+wX2ufZ3o/BZajguWpO8qIhINfAEMVNW9vuu89zEIqiFZItIJ2KGq8wMdSzEKAy4F\nRqhqE+AA+bpygvRcV8Bp1SYC8UAZju8CcYWiOr/BkvRdc4cuEQnHSfjjVPVLb/H2w1/1vM87AhVf\nEfkL0FlE1uN03V2B099d3tsFAMF3zlOBVFWd6309EedDINjP9ZXAOlVNU9Uc4Euc8x/M59rXic5v\noeW4YEn6/tzd65zn7cceBaxQ1Td8VvneuewO4P+KO7aipKpPqWqCqtbCObfTVLUXMB3nTm0QZMet\nqtuATSJyobeoPc7NiIL6XON067QUkdLef++Hjztoz3U+Jzq/ycDt3lE8LYEMn26g06OqQfEArgVW\nAWuApwMdTxEd419xvu4tARZ5H9fi9G9PBf4EfgIqBjrWIvwbtAO+8S7Xxrn95mrgc6BUoOMr5GNt\nDKR4z/fXQAU3nGvgReAP4HdgLFAqGM818CnO7xY5ON/s+p7o/AKCM0JxDbAUZ3TTGe3Xrsg1xhgX\nCZbuHWOMMX6wpG+MMS5iSd8YY1zEkr4xxriIJX1jjHERS/rGlUQkT0QW+TwKbeIyEanlO3OiMSVJ\n2KmrGBOUDqpq40AHYUxxs5a+MT5EZL2IvCYiS0XkNxGp4y2vJSLTvHOZTxWRGt7yKiLylYgs9j4u\n824qVETe984L/4OIRAXsoIzxYUnfuFVUvu6dHj7rMlS1IfAuzuyeAP8CRqvqJcA44B1v+TvAL6ra\nCGdunGXe8rrAcFVtAOwBuhXx8RjjF7si17iSiOxX1egCytcDV6jqWu/kdttUtZKIpAPnqWqOt3yr\nqsaKSBqQoKqHfLZRC/hRnRthICJPAuGqOrToj8yYk7OWvjHH0xMsn45DPst52O9npoSwpG/M8Xr4\nPM/2Lv8PZ4ZPgF7ATO/yVKAfHLmHb7niCtKYM2GtD+NWUSKyyOf196p6eNhmBRFZgtNa7+kt649z\nF6vHce5odae3/CHgPRHpi9Oi74czc6IxJZL16Rvjw9unn6Sq6YGOxZiiYN07xhjjItbSN8YYF7GW\nvjHGuIglfWOMcRFL+sYY4yKW9I0xxkUs6RtjjItY0jfGGBf5f/8G2z5z+ejDAAAAAElFTkSuQmCC\n","text/plain":["
"]},"metadata":{"tags":[]}}]},{"cell_type":"code","metadata":{"id":"Ob1VbaYzJCWa","colab_type":"code","outputId":"74c30022-c570-4a34-ecc9-4e964573e661","executionInfo":{"status":"ok","timestamp":1565016079805,"user_tz":-540,"elapsed":761,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":143}},"source":["# 7.14 Test 데이터에 대한 예측 정확도 확인\n","model.evaluate(X[2560:], Y[2560:])\n","prediction = model.predict(X[2560:2560+5])\n","for i in range(5):\n"," print(Y[2560+i], '\\t', prediction[i][0], '\\tdiff:', abs(prediction[i][0] - Y[2560+i]))\n"," \n","prediction = model.predict(X[2560:])\n","cnt = 0\n","for i in range(len(prediction)):\n"," if abs(prediction[i][0] - Y[2560+i]) > 0.04:\n"," cnt += 1\n","print('correctness:', (440 - cnt) / 440 * 100, '%')"],"execution_count":0,"outputs":[{"output_type":"stream","text":["440/440 [==============================] - 0s 265us/sample - loss: 6.0522e-04\n","0.034887773363423434 \t 0.045945946 \tdiff: 0.01105817276375285\n","0.00034131119754715394 \t 0.013404831 \tdiff: 0.013063520092697902\n","0.4893153311074549 \t 0.5186676 \tdiff: 0.02935224758974969\n","0.153814953074304 \t 0.14587536 \tdiff: 0.007939588532296565\n","0.22067859331833786 \t 0.21842426 \tdiff: 0.002254332702035372\n","correctness: 94.77272727272728 %\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"VxV7T14AvXkH","colab_type":"text"},"source":["## 7.2.3 GRU 레이어"]},{"cell_type":"code","metadata":{"id":"8WjH-A0WvNAO","colab_type":"code","outputId":"454743b1-553a-47ae-fe0e-c02ffa31d098","executionInfo":{"status":"ok","timestamp":1565420218129,"user_tz":-540,"elapsed":1059,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":269}},"source":["# 7.15 GRU 레이어를 사용한 곱셈 문제 모델 정의\n","model = tf.keras.Sequential([\n"," tf.keras.layers.GRU(units=30, return_sequences=True, input_shape=[100,2]),\n"," tf.keras.layers.GRU(units=30),\n"," tf.keras.layers.Dense(1)\n","])\n","\n","model.compile(optimizer='adam', loss='mse')\n","model.summary()"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Model: \"sequential_11\"\n","_________________________________________________________________\n","Layer (type) Output Shape Param # \n","=================================================================\n","unified_gru_4 (UnifiedGRU) (None, 100, 30) 3060 \n","_________________________________________________________________\n","unified_gru_5 (UnifiedGRU) (None, 30) 5580 \n","_________________________________________________________________\n","dense_11 (Dense) (None, 1) 31 \n","=================================================================\n","Total params: 8,671\n","Trainable params: 8,671\n","Non-trainable params: 0\n","_________________________________________________________________\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"vd6C4gvUvdQS","colab_type":"code","outputId":"efd36828-7906-4dc2-c92d-197230073c83","executionInfo":{"status":"ok","timestamp":1565249609835,"user_tz":-540,"elapsed":515269,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":1000}},"source":["# 7.16 GRU 네트워크 학습\n","X = np.array(X)\n","Y = np.array(Y)\n","history = model.fit(X[:2560], Y[:2560], epochs=100, validation_split=0.2)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Train on 2048 samples, validate on 512 samples\n","Epoch 1/100\n","2048/2048 [==============================] - 3s 1ms/sample - loss: 0.0565 - val_loss: 0.0515\n","Epoch 2/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0483 - val_loss: 0.0508\n","Epoch 3/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0483 - val_loss: 0.0507\n","Epoch 4/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0481 - val_loss: 0.0511\n","Epoch 5/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0480 - val_loss: 0.0508\n","Epoch 6/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0479 - val_loss: 0.0507\n","Epoch 7/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0477 - val_loss: 0.0504\n","Epoch 8/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0477 - val_loss: 0.0518\n","Epoch 9/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0479 - val_loss: 0.0502\n","Epoch 10/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0478 - val_loss: 0.0502\n","Epoch 11/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0473 - val_loss: 0.0502\n","Epoch 12/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0471 - val_loss: 0.0500\n","Epoch 13/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0471 - val_loss: 0.0505\n","Epoch 14/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0471 - val_loss: 0.0504\n","Epoch 15/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0461 - val_loss: 0.0535\n","Epoch 16/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0452 - val_loss: 0.0479\n","Epoch 17/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0303 - val_loss: 0.0090\n","Epoch 18/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0041 - val_loss: 0.0036\n","Epoch 19/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0021 - val_loss: 0.0017\n","Epoch 20/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0017 - val_loss: 0.0020\n","Epoch 21/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0022 - val_loss: 0.0014\n","Epoch 22/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0013 - val_loss: 0.0013\n","Epoch 23/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0011 - val_loss: 0.0014\n","Epoch 24/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0011 - val_loss: 0.0011\n","Epoch 25/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 9.3595e-04 - val_loss: 0.0011\n","Epoch 26/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 0.0010 - val_loss: 9.4046e-04\n","Epoch 27/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 8.3893e-04 - val_loss: 9.2959e-04\n","Epoch 28/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 7.4170e-04 - val_loss: 8.4709e-04\n","Epoch 29/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 7.3956e-04 - val_loss: 8.0262e-04\n","Epoch 30/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 7.5555e-04 - val_loss: 8.0527e-04\n","Epoch 31/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 7.1811e-04 - val_loss: 7.4206e-04\n","Epoch 32/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 7.3064e-04 - val_loss: 7.5413e-04\n","Epoch 33/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 6.1759e-04 - val_loss: 6.7655e-04\n","Epoch 34/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 5.6142e-04 - val_loss: 6.5674e-04\n","Epoch 35/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 7.3387e-04 - val_loss: 7.0132e-04\n","Epoch 36/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 6.0850e-04 - val_loss: 6.9867e-04\n","Epoch 37/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 5.3303e-04 - val_loss: 7.1733e-04\n","Epoch 38/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 5.1451e-04 - val_loss: 5.3288e-04\n","Epoch 39/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 5.0255e-04 - val_loss: 7.7168e-04\n","Epoch 40/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 6.1249e-04 - val_loss: 5.0275e-04\n","Epoch 41/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 5.8577e-04 - val_loss: 5.4677e-04\n","Epoch 42/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 4.3773e-04 - val_loss: 6.5587e-04\n","Epoch 43/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 4.7370e-04 - val_loss: 4.5442e-04\n","Epoch 44/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 4.2565e-04 - val_loss: 6.3450e-04\n","Epoch 45/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 5.5705e-04 - val_loss: 5.5243e-04\n","Epoch 46/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.7550e-04 - val_loss: 6.6836e-04\n","Epoch 47/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.9477e-04 - val_loss: 4.4868e-04\n","Epoch 48/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.3745e-04 - val_loss: 4.6517e-04\n","Epoch 49/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.5112e-04 - val_loss: 4.2512e-04\n","Epoch 50/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 4.0376e-04 - val_loss: 8.0140e-04\n","Epoch 51/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.4910e-04 - val_loss: 5.9230e-04\n","Epoch 52/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.2974e-04 - val_loss: 4.8808e-04\n","Epoch 53/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.6445e-04 - val_loss: 4.4823e-04\n","Epoch 54/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.0047e-04 - val_loss: 3.7641e-04\n","Epoch 55/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.9625e-04 - val_loss: 3.6401e-04\n","Epoch 56/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.3041e-04 - val_loss: 4.9109e-04\n","Epoch 57/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.7521e-04 - val_loss: 3.3119e-04\n","Epoch 58/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.9400e-04 - val_loss: 3.7839e-04\n","Epoch 59/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.2824e-04 - val_loss: 3.1553e-04\n","Epoch 60/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.3330e-04 - val_loss: 2.8243e-04\n","Epoch 61/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.1247e-04 - val_loss: 4.6556e-04\n","Epoch 62/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.9814e-04 - val_loss: 2.6187e-04\n","Epoch 63/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.8693e-04 - val_loss: 3.5620e-04\n","Epoch 64/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.4777e-04 - val_loss: 4.8472e-04\n","Epoch 65/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.4129e-04 - val_loss: 4.6002e-04\n","Epoch 66/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.6461e-04 - val_loss: 3.6858e-04\n","Epoch 67/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 3.0835e-04 - val_loss: 3.3439e-04\n","Epoch 68/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.5209e-04 - val_loss: 3.4678e-04\n","Epoch 69/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.4443e-04 - val_loss: 2.6059e-04\n","Epoch 70/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.0927e-04 - val_loss: 2.0889e-04\n","Epoch 71/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.2954e-04 - val_loss: 2.2242e-04\n","Epoch 72/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.8560e-04 - val_loss: 2.0423e-04\n","Epoch 73/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.0288e-04 - val_loss: 2.2462e-04\n","Epoch 74/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.4066e-04 - val_loss: 2.9334e-04\n","Epoch 75/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.5517e-04 - val_loss: 2.6190e-04\n","Epoch 76/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.0727e-04 - val_loss: 2.8056e-04\n","Epoch 77/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.2837e-04 - val_loss: 4.6729e-04\n","Epoch 78/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.3859e-04 - val_loss: 1.8189e-04\n","Epoch 79/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.1983e-04 - val_loss: 2.6046e-04\n","Epoch 80/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.0231e-04 - val_loss: 1.8574e-04\n","Epoch 81/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.7074e-04 - val_loss: 1.9380e-04\n","Epoch 82/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.7609e-04 - val_loss: 1.4725e-04\n","Epoch 83/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.7178e-04 - val_loss: 1.6848e-04\n","Epoch 84/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 2.2655e-04 - val_loss: 2.1970e-04\n","Epoch 85/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.8436e-04 - val_loss: 1.4510e-04\n","Epoch 86/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.8893e-04 - val_loss: 1.8672e-04\n","Epoch 87/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.5977e-04 - val_loss: 1.3407e-04\n","Epoch 88/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.6946e-04 - val_loss: 1.8769e-04\n","Epoch 89/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.4770e-04 - val_loss: 1.7554e-04\n","Epoch 90/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.5040e-04 - val_loss: 1.9365e-04\n","Epoch 91/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.3074e-04 - val_loss: 1.2342e-04\n","Epoch 92/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.5768e-04 - val_loss: 1.4241e-04\n","Epoch 93/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.6989e-04 - val_loss: 1.3045e-04\n","Epoch 94/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.8190e-04 - val_loss: 2.0151e-04\n","Epoch 95/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.5759e-04 - val_loss: 1.3329e-04\n","Epoch 96/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.6273e-04 - val_loss: 2.3228e-04\n","Epoch 97/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.7745e-04 - val_loss: 1.0128e-04\n","Epoch 98/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.2225e-04 - val_loss: 1.2500e-04\n","Epoch 99/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.8092e-04 - val_loss: 1.9567e-04\n","Epoch 100/100\n","2048/2048 [==============================] - 2s 1ms/sample - loss: 1.4453e-04 - val_loss: 1.4514e-04\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"-SHz_LHExkH3","colab_type":"code","outputId":"89a43f72-ea39-450c-d88b-a7da9208e72a","executionInfo":{"status":"ok","timestamp":1565176283841,"user_tz":-540,"elapsed":1853,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":283}},"source":["# 7.17 GRU 네트워크 학습 결과 확인\n","import matplotlib.pyplot as plt\n","plt.plot(history.history['loss'], 'b-', label='loss')\n","plt.plot(history.history['val_loss'], 'r--', label='val_loss')\n","plt.xlabel('Epoch')\n","plt.legend()\n","plt.show()"],"execution_count":0,"outputs":[{"output_type":"display_data","data":{"image/png":"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\nmNm/zewtMzuqqTcws8vMbIaZzSgpKdmuDagzZAj07x/mQUs5770X5ghq43N+iEjy7eoTucuBfdz9\nG8BPgafNrH3jQu7+sLsPdfehXbt23aE3MoPzzgvfX1qypPnykVI3gkcnc0V2m23Nvb9o0SIOqv/l\nyjakJaFfDPSs97gosazJMmaWAXQASt290t1LAdx9JvA5sP/OVnprRo8OE9YkZkFNHb16hZ8KfRFp\nRkumYZgO9DOzPoRwPxc4r1GZScBFwFRgJPC6u7uZdQVWu3uNme0L9AMWtlrtG+nbF4YNC1PjN55U\nM9LU0pcoamo22nPOgSuuCFOTn3LKlusvvjjcVq2CkSMbrnvzzW2+3dixY+nZsydXXnklAOPGjSMj\nI4M33niDNWvWUFVVxe23386IEY1PaW5bRUUFl19+OTNmzCAjI4P77ruPY489lrlz53LJJZcQj8ep\nra3lr3/9K927d+ecc85h6dKl1NTUcNNNNzFq1Kjter/mNBv67l5tZlcBU4B0YLy7zzWz2wizuk0C\nHgWeNLMFwGrCgQHgaOA2M6sCaoGfuPvqVt2CRs47L0xFM29e6ONPCV27Qk5OCvZribSeUaNGcd11\n130d+s899xxTpkzhmmuuoX379qxatYojjjiC008/fbsuTv7AAw9gZsyZM4d58+Zx4oknMn/+fB56\n6CGuvfZazj//fOLxODU1NUyePJnu3bvzyiuvALBu3brW39CWTMW5O287O7XysmXuZu4337xTL7Pn\nWb16+6ZxFmlj2sLUyv379/fi4mKfPXu2H3nkkR6Px/3KK6/0QYMG+eDBgz07O9uXL1/u7punYW7K\nF1984QMHDnR39zPOOMNfe+21r9d9+9vf9g8//NCfeuopHzBggN91110+f/58d3f/7LPPvFevXn7D\nDTf422+/vdXX35mplSP3jdy99w6Xwn366a1fHz2SOnXS1MoiO+nss89m4sSJTJgwgVGjRvHUU09R\nUlLCzJkzmT17Nt26daOioqJV3uu8885j0qRJ5OTkcMopp/D666+z//77M2vWLAYNGsSvf/1rbtsF\nX7qMXOhD6OJZsAB+9zvYuHHL9TU18M474VK6Tz4ZHu/x/va30NcpIjts1KhRPPvss0ycOJGzzz6b\ndevWsddee5GZmckbb7zB4h04b3bUUUfx1FNPATB//ny+/PJLDjjgABYuXMi+++7LNddcw4gRI/jo\n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\n","text/plain":["
"]},"metadata":{"tags":[]}}]},{"cell_type":"code","metadata":{"id":"JdecdSb0xkDj","colab_type":"code","outputId":"8695a72f-4f0c-4fe0-f8ce-b4159ca249f4","executionInfo":{"status":"ok","timestamp":1565176412723,"user_tz":-540,"elapsed":1717,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":143}},"source":["# 7.18 Test 데이터에 대한 예측 정확도 확인\n","model.evaluate(X[2560:], Y[2560:])\n","prediction = model.predict(X[2560:2560+5])\n","for i in range(5):\n"," print(Y[2560+i], '\\t', prediction[i][0], '\\tdiff:', abs(prediction[i][0] - Y[2560+i]))\n"," \n","prediction = model.predict(X[2560:])\n","cnt = 0\n","for i in range(len(prediction)):\n"," if abs(prediction[i][0] - Y[2560+i]) > 0.04:\n"," cnt += 1\n","print('correctness:', (440 - cnt) / 440 * 100, '%')"],"execution_count":0,"outputs":[{"output_type":"stream","text":["440/440 [==============================] - 0s 257us/sample - loss: 2.1656e-04\n","0.5868979267885701 \t 0.59347934 \tdiff: 0.006581408519504839\n","0.05878754410344112 \t 0.060995653 \tdiff: 0.002208109168233989\n","0.28405740032203625 \t 0.2864653 \tdiff: 0.0024078868865208825\n","0.0031702546170603993 \t 0.0039648563 \tdiff: 0.0007946016499150036\n","0.49710513844098114 \t 0.49417952 \tdiff: 0.0029256214102652\n","correctness: 98.86363636363636 %\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"b4rFl018T7Py","colab_type":"text"},"source":["# 7.3 긍정, 부정 감성 분석"]},{"cell_type":"code","metadata":{"id":"srjpifEqUAx3","colab_type":"code","outputId":"512b0ae7-097f-4760-8a38-eb0c145d7c4c","executionInfo":{"status":"ok","timestamp":1575820930037,"user_tz":-540,"elapsed":7711,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mAJC9PPBoQ91glDwFjxm3TlW5EqGy0BIAJ52D-ekw=s64","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":89}},"source":["# 7.19 Naver Sentiment Movie Corpus v1.0 다운로드\n","path_to_train_file = tf.keras.utils.get_file('train.txt', 'https://raw.githubusercontent.com/e9t/nsmc/master/ratings_train.txt')\n","path_to_test_file = tf.keras.utils.get_file('test.txt', 'https://raw.githubusercontent.com/e9t/nsmc/master/ratings_test.txt')"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Downloading data from https://raw.githubusercontent.com/e9t/nsmc/master/ratings_train.txt\n","14630912/14628807 [==============================] - 0s 0us/step\n","Downloading data from https://raw.githubusercontent.com/e9t/nsmc/master/ratings_test.txt\n","4898816/4893335 [==============================] - 0s 0us/step\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"8e3_cWrjcZ8X","colab_type":"code","outputId":"d43321b8-60f9-4976-e6e8-51358ad42ee4","executionInfo":{"status":"ok","timestamp":1575820932961,"user_tz":-540,"elapsed":1412,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mAJC9PPBoQ91glDwFjxm3TlW5EqGy0BIAJ52D-ekw=s64","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":215}},"source":["# 7.20 데이터 로드 및 확인\n","# 데이터를 메모리에 불러옵니다. encoding 형식으로 utf-8 을 지정해야합니다.\n","train_text = open(path_to_train_file, 'rb').read().decode(encoding='utf-8')\n","test_text = open(path_to_test_file, 'rb').read().decode(encoding='utf-8')\n","\n","# 텍스트가 총 몇 자인지 확인합니다.\n","print('Length of text: {} characters'.format(len(train_text)))\n","print('Length of text: {} characters'.format(len(test_text)))\n","print()\n","\n","# 처음 300 자를 확인해봅니다.\n","print(train_text[:300])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Length of text: 6937271 characters\n","Length of text: 2318260 characters\n","\n","id\tdocument\tlabel\n","9976970\t아 더빙.. 진짜 짜증나네요 목소리\t0\n","3819312\t흠...포스터보고 초딩영화줄....오버연기조차 가볍지 않구나\t1\n","10265843\t너무재밓었다그래서보는것을추천한다\t0\n","9045019\t교도소 이야기구먼 ..솔직히 재미는 없다..평점 조정\t0\n","6483659\t사이몬페그의 익살스런 연기가 돋보였던 영화!스파이더맨에서 늙어보이기만 했던 커스틴 던스트가 너무나도 이뻐보였다\t1\n","5403919\t막 걸음마 뗀 3세부터 초등학교 1학년생인 8살용영화.ㅋㅋㅋ...별반개도 아까움.\t0\n","7797314\t원작의\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"3R4G9NAekYsE","colab_type":"code","outputId":"10821adf-ba4c-4b52-8b9f-76f2af204691","executionInfo":{"status":"ok","timestamp":1575820941539,"user_tz":-540,"elapsed":1501,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mAJC9PPBoQ91glDwFjxm3TlW5EqGy0BIAJ52D-ekw=s64","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":125}},"source":["# 7.21 학습을 위한 정답 데이터(Y) 만들기\n","train_Y = np.array([[int(row.split('\\t')[2])] for row in train_text.split('\\n')[1:] if row.count('\\t') > 0])\n","test_Y = np.array([[int(row.split('\\t')[2])] for row in test_text.split('\\n')[1:] if row.count('\\t') > 0])\n","print(train_Y.shape, test_Y.shape)\n","print(train_Y[:5])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["(150000, 1) (50000, 1)\n","[[0]\n"," [1]\n"," [0]\n"," [0]\n"," [1]]\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"IlrwaPyJ06V5","colab_type":"code","outputId":"0cdb25ca-b6fd-4f2b-f071-e1e1b732a667","executionInfo":{"status":"ok","timestamp":1575820949497,"user_tz":-540,"elapsed":4604,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mAJC9PPBoQ91glDwFjxm3TlW5EqGy0BIAJ52D-ekw=s64","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":107}},"source":["# 7.22 train 데이터의 입력(X)에 대한 정제(Cleaning)\n","import re\n","# From https://github.com/yoonkim/CNN_sentence/blob/master/process_data.py\n","def clean_str(string): \n"," string = re.sub(r\"[^가-힣A-Za-z0-9(),!?\\'\\`]\", \" \", string)\n"," string = re.sub(r\"\\'s\", \" \\'s\", string)\n"," string = re.sub(r\"\\'ve\", \" \\'ve\", string)\n"," string = re.sub(r\"n\\'t\", \" n\\'t\", string)\n"," string = re.sub(r\"\\'re\", \" \\'re\", string)\n"," string = re.sub(r\"\\'d\", \" \\'d\", string)\n"," string = re.sub(r\"\\'ll\", \" \\'ll\", string)\n"," string = re.sub(r\",\", \" , \", string)\n"," string = re.sub(r\"!\", \" ! \", string)\n"," string = re.sub(r\"\\(\", \" \\( \", string)\n"," string = re.sub(r\"\\)\", \" \\) \", string)\n"," string = re.sub(r\"\\?\", \" \\? \", string)\n"," string = re.sub(r\"\\s{2,}\", \" \", string)\n"," string = re.sub(r\"\\'{2,}\", \"\\'\", string)\n"," string = re.sub(r\"\\'\", \"\", string)\n","\n"," return string.lower()\n","\n","\n","train_text_X = [row.split('\\t')[1] for row in train_text.split('\\n')[1:] if row.count('\\t') > 0]\n","train_text_X = [clean_str(sentence) for sentence in train_text_X]\n","# 문장을 띄어쓰기 단위로 단어 분리\n","sentences = [sentence.split(' ') for sentence in train_text_X]\n","for i in range(5):\n"," print(sentences[i])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["['아', '더빙', '진짜', '짜증나네요', '목소리']\n","['흠', '포스터보고', '초딩영화줄', '오버연기조차', '가볍지', '않구나']\n","['너무재밓었다그래서보는것을추천한다']\n","['교도소', '이야기구먼', '솔직히', '재미는', '없다', '평점', '조정']\n","['사이몬페그의', '익살스런', '연기가', '돋보였던', '영화', '!', '스파이더맨에서', '늙어보이기만', '했던', '커스틴', '던스트가', '너무나도', '이뻐보였다']\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"zwtf77CE0xPi","colab_type":"code","outputId":"4dacfde9-2015-4092-8d3f-cabaf6e2bc65","executionInfo":{"status":"ok","timestamp":1565420230262,"user_tz":-540,"elapsed":4592,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":287}},"source":["# 7.23 각 문장의 단어 길이 확인\n","import matplotlib.pyplot as plt\n","sentence_len = [len(sentence) for sentence in sentences]\n","sentence_len.sort()\n","plt.plot(sentence_len)\n","plt.show()\n","\n","print(sum([int(l<=25) for l in sentence_len]))"],"execution_count":0,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n4v8DVFxOOFWJzVAAAAAASUVORK5CYII=\n","text/plain":["
"]},"metadata":{"tags":[]}},{"output_type":"stream","text":["142587\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"c9F0OQSB71Az","colab_type":"code","outputId":"5319762b-c8e9-4227-abc8-879f4373e2af","executionInfo":{"status":"ok","timestamp":1575820955978,"user_tz":-540,"elapsed":1132,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mAJC9PPBoQ91glDwFjxm3TlW5EqGy0BIAJ52D-ekw=s64","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":107}},"source":["# 7.24 단어 정제 및 문장 길이 줄임\n","sentences_new = []\n","for sentence in sentences:\n"," sentences_new.append([word[:5] for word in sentence][:25])\n","sentences = sentences_new\n","for i in range(5):\n"," print(sentences[i])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["['아', '더빙', '진짜', '짜증나네요', '목소리']\n","['흠', '포스터보고', '초딩영화줄', '오버연기조', '가볍지', '않구나']\n","['너무재밓었']\n","['교도소', '이야기구먼', '솔직히', '재미는', '없다', '평점', '조정']\n","['사이몬페그', '익살스런', '연기가', '돋보였던', '영화', '!', '스파이더맨', '늙어보이기', '했던', '커스틴', '던스트가', '너무나도', '이뻐보였다']\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"9iHRApH_SxJz","colab_type":"code","outputId":"056cfd8f-5603-4924-bc22-1bff886b0469","executionInfo":{"status":"ok","timestamp":1575820961410,"user_tz":-540,"elapsed":4189,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mAJC9PPBoQ91glDwFjxm3TlW5EqGy0BIAJ52D-ekw=s64","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":287}},"source":["# 7.25 Tokenizer와 pad_sequences를 사용한 문장 전처리\n","from tensorflow.keras.preprocessing.text import Tokenizer\n","from tensorflow.keras.preprocessing.sequence import pad_sequences\n","\n","tokenizer = Tokenizer(num_words=20000)\n","tokenizer.fit_on_texts(sentences)\n","train_X = tokenizer.texts_to_sequences(sentences)\n","train_X = pad_sequences(train_X, padding='post')\n","\n","print(train_X[:5])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["[[ 25 884 8 5795 1111 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0]\n"," [ 588 5796 6697 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0]\n"," [ 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0]\n"," [ 71 346 31 35 10468 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0]\n"," [ 106 5338 4 2 2169 869 573 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0]]\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"Id3SzN7350CB","colab_type":"code","outputId":"260569cf-9119-4a51-d65a-bf5bf4aa0c3c","executionInfo":{"status":"ok","timestamp":1565420237085,"user_tz":-540,"elapsed":3597,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":143}},"source":["# 7.26 Tokenizer의 동작 확인\n","print(tokenizer.index_word[19999])\n","print(tokenizer.index_word[20000])\n","temp = tokenizer.texts_to_sequences(['#$#$#', '경우는', '잊혀질', '연기가'])\n","print(temp)\n","temp = pad_sequences(temp, padding='post')\n","print(temp)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["경우는\n","잊혀질\n","[[], [19999], [], [106]]\n","[[ 0]\n"," [19999]\n"," [ 0]\n"," [ 106]]\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"qHkCAL4QpVAF","colab_type":"code","outputId":"4805b775-d77a-49ba-bd6c-b2a98d3d0285","executionInfo":{"status":"ok","timestamp":1575820976746,"user_tz":-540,"elapsed":4286,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mAJC9PPBoQ91glDwFjxm3TlW5EqGy0BIAJ52D-ekw=s64","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":269}},"source":["# 7.27 감성 분석을 위한 모델 정의\n","model = tf.keras.Sequential([\n"," tf.keras.layers.Embedding(20000, 300, input_length=25),\n"," tf.keras.layers.LSTM(units=50),\n"," tf.keras.layers.Dense(2, activation='softmax')\n","])\n","\n","model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n","model.summary()"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Model: \"sequential\"\n","_________________________________________________________________\n","Layer (type) Output Shape Param # \n","=================================================================\n","embedding (Embedding) (None, 25, 300) 6000000 \n","_________________________________________________________________\n","lstm (LSTM) (None, 50) 70200 \n","_________________________________________________________________\n","dense (Dense) (None, 2) 102 \n","=================================================================\n","Total params: 6,070,302\n","Trainable params: 6,070,302\n","Non-trainable params: 0\n","_________________________________________________________________\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"DG5bZtehpU8O","colab_type":"code","outputId":"28868beb-1759-4b61-911b-d2a0fdee4365","executionInfo":{"status":"ok","timestamp":1575821336811,"user_tz":-540,"elapsed":351765,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mAJC9PPBoQ91glDwFjxm3TlW5EqGy0BIAJ52D-ekw=s64","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":215}},"source":["# 7.28 감성 분석 모델 학습\n","history = model.fit(train_X, train_Y, epochs=5, batch_size=128, validation_split=0.2)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Train on 120000 samples, validate on 30000 samples\n","Epoch 1/5\n","120000/120000 [==============================] - 75s 623us/sample - loss: 0.4351 - accuracy: 0.7837 - val_loss: 0.3907 - val_accuracy: 0.8186\n","Epoch 2/5\n","120000/120000 [==============================] - 69s 578us/sample - loss: 0.3241 - accuracy: 0.8485 - val_loss: 0.3912 - val_accuracy: 0.8168\n","Epoch 3/5\n","120000/120000 [==============================] - 69s 578us/sample - loss: 0.2721 - accuracy: 0.8683 - val_loss: 0.4313 - val_accuracy: 0.8180\n","Epoch 4/5\n","120000/120000 [==============================] - 68s 571us/sample - loss: 0.2297 - accuracy: 0.8871 - val_loss: 0.5035 - val_accuracy: 0.8091\n","Epoch 5/5\n","120000/120000 [==============================] - 69s 575us/sample - loss: 0.1983 - accuracy: 0.9017 - val_loss: 0.5381 - val_accuracy: 0.8062\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"-N83MOKFpU4a","colab_type":"code","outputId":"51b3157e-569c-4a8c-a4ab-53ec8cb99c4f","executionInfo":{"status":"ok","timestamp":1575821337948,"user_tz":-540,"elapsed":1119,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mAJC9PPBoQ91glDwFjxm3TlW5EqGy0BIAJ52D-ekw=s64","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":283}},"source":["# 7.29 감성 분석 모델 학습 결과 확인\n","import matplotlib.pyplot as plt\n","plt.figure(figsize=(12, 4))\n","\n","plt.subplot(1, 2, 1)\n","plt.plot(history.history['loss'], 'b-', label='loss')\n","plt.plot(history.history['val_loss'], 'r--', label='val_loss')\n","plt.xlabel('Epoch')\n","plt.legend()\n","\n","plt.subplot(1, 2, 2)\n","plt.plot(history.history['accuracy'], 'g-', label='accuracy')\n","plt.plot(history.history['val_accuracy'], 'k--', label='val_accuracy')\n","plt.xlabel('Epoch')\n","plt.ylim(0.7, 1)\n","plt.legend()\n","\n","plt.show()"],"execution_count":0,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[]}}]},{"cell_type":"code","metadata":{"id":"dS4Bw55e1HQa","colab_type":"code","outputId":"3d4de552-203e-483d-83f0-7d009f175d0b","executionInfo":{"status":"ok","timestamp":1575821789255,"user_tz":-540,"elapsed":18470,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mAJC9PPBoQ91glDwFjxm3TlW5EqGy0BIAJ52D-ekw=s64","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":35}},"source":["# 7.30 테스트 데이터 평가\n","test_text_X = [row.split('\\t')[1] for row in test_text.split('\\n')[1:] if row.count('\\t') > 0]\n","test_text_X = [clean_str(sentence) for sentence in test_text_X]\n","sentences = [sentence.split(' ') for sentence in test_text_X]\n","sentences_new = []\n","for sentence in sentences:\n"," sentences_new.append([word[:5] for word in sentence][:25])\n","sentences = sentences_new\n","\n","test_X = tokenizer.texts_to_sequences(sentences)\n","test_X = pad_sequences(test_X, padding='post')\n","\n","model.evaluate(test_X, test_Y, verbose=0)"],"execution_count":0,"outputs":[{"output_type":"execute_result","data":{"text/plain":["[0.547995473408699, 0.80038]"]},"metadata":{"tags":[]},"execution_count":11}]},{"cell_type":"code","metadata":{"id":"S_gWAXeb1HM0","colab_type":"code","outputId":"f04c63d8-bef8-48c7-ca68-57b1e0f56581","executionInfo":{"status":"ok","timestamp":1565429969185,"user_tz":-540,"elapsed":1041,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":341}},"source":["# 7.31 임의의 문장 감성 분석 결과 확인\n","test_sentence = '재미있을 줄 알았는데 완전 실망했다. 너무 졸리고 돈이 아까웠다.'\n","test_sentence = test_sentence.split(' ')\n","test_sentences = []\n","now_sentence = []\n","for word in test_sentence:\n"," now_sentence.append(word)\n"," test_sentences.append(now_sentence[:])\n"," \n","test_X_1 = tokenizer.texts_to_sequences(test_sentences)\n","test_X_1 = pad_sequences(test_X_1, padding='post', maxlen=25)\n","prediction = model.predict(test_X_1)\n","for idx, sentence in enumerate(test_sentences):\n"," print(sentence)\n"," print(prediction[idx])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["['재미있을']\n","[0.41499388 0.5850061 ]\n","['재미있을', '줄']\n","[0.46383956 0.53616047]\n","['재미있을', '줄', '알았는데']\n","[0.5084595 0.4915405]\n","['재미있을', '줄', '알았는데', '완전']\n","[0.52025294 0.4797471 ]\n","['재미있을', '줄', '알았는데', '완전', '실망했다.']\n","[0.52025294 0.4797471 ]\n","['재미있을', '줄', '알았는데', '완전', '실망했다.', '너무']\n","[0.59737766 0.40262237]\n","['재미있을', '줄', '알았는데', '완전', '실망했다.', '너무', '졸리고']\n","[0.99524826 0.00475175]\n","['재미있을', '줄', '알았는데', '완전', '실망했다.', '너무', '졸리고', '돈이']\n","[0.9979342 0.00206574]\n","['재미있을', '줄', '알았는데', '완전', '실망했다.', '너무', '졸리고', '돈이', '아까웠다.']\n","[0.9979342 0.00206574]\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"GbJuXY19T-vd","colab_type":"text"},"source":["# 7.4 자연어 생성"]},{"cell_type":"markdown","metadata":{"id":"f3eau9dNxOgR","colab_type":"text"},"source":["## 7.4.1 단어 단위 생성"]},{"cell_type":"code","metadata":{"id":"HWbhqXUTUBJj","colab_type":"code","outputId":"d8e799e0-7a73-4b7b-db38-316eced55718","executionInfo":{"status":"ok","timestamp":1565835933297,"user_tz":-540,"elapsed":56235,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":53}},"source":["# 7.32 조선왕조실록 데이터 파일 다운로드\n","path_to_file = tf.keras.utils.get_file('input.txt', 'http://bit.ly/2Mc3SOV')"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Downloading data from http://bit.ly/2Mc3SOV\n","62013440/62012502 [==============================] - 0s 0us/step\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"8uFbN0cwulLE","colab_type":"code","outputId":"d303ec7d-2e75-42f5-a078-62f0c52768ba","executionInfo":{"status":"ok","timestamp":1565652867225,"user_tz":-540,"elapsed":30419,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":89}},"source":["# 7.33 데이터 로드 및 확인\n","# 데이터를 메모리에 불러옵니다. encoding 형식으로 utf-8 을 지정해야합니다.\n","train_text = open(path_to_file, 'rb').read().decode(encoding='utf-8')\n","\n","# 텍스트가 총 몇 자인지 확인합니다.\n","print('Length of text: {} characters'.format(len(train_text)))\n","print()\n","\n","# 처음 100 자를 확인해봅니다.\n","print(train_text[:100])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Length of text: 26265493 characters\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 \n","태조 강헌 지인 계운 성문 신무 대왕(太祖康獻至仁啓運聖文神武大王)의 성은 이씨(李氏)요, 휘\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"qYpvgEtfulIe","colab_type":"code","outputId":"742b9275-b7ce-4ca4-8d7f-dd327e390236","executionInfo":{"status":"ok","timestamp":1565652875099,"user_tz":-540,"elapsed":35361,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":35}},"source":["# 7.34 훈련 데이터 입력 정제\n","import re\n","# From https://github.com/yoonkim/CNN_sentence/blob/master/process_data.py\n","def clean_str(string): \n"," string = re.sub(r\"[^가-힣A-Za-z0-9(),!?\\'\\`]\", \" \", string)\n"," string = re.sub(r\"\\'ll\", \" \\'ll\", string)\n"," string = re.sub(r\",\", \" , \", string)\n"," string = re.sub(r\"!\", \" ! \", string)\n"," string = re.sub(r\"\\(\", \"\", string)\n"," string = re.sub(r\"\\)\", \"\", string)\n"," string = re.sub(r\"\\?\", \" \\? \", string)\n"," string = re.sub(r\"\\s{2,}\", \" \", string)\n"," string = re.sub(r\"\\'{2,}\", \"\\'\", string)\n"," string = re.sub(r\"\\'\", \"\", string)\n","\n"," return string\n","\n","\n","train_text = train_text.split('\\n')\n","train_text = [clean_str(sentence) for sentence in train_text]\n","train_text_X = []\n","for sentence in train_text:\n"," train_text_X.extend(sentence.split(' '))\n"," train_text_X.append('\\n')\n"," \n","train_text_X = [word for word in train_text_X if word != '']\n","\n","print(train_text_X[:20])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["['태조', '이성계', '선대의', '가계', '목조', '이안사가', '전주에서', '삼척', '의주를', '거쳐', '알동에', '정착하다', '\\n', '태조', '강헌', '지인', '계운', '성문', '신무', '대왕']\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"DWMq4C-qulCn","colab_type":"code","outputId":"f88c9028-c5f8-4d04-fd25-0d6dfc12c9b9","executionInfo":{"status":"ok","timestamp":1565652879266,"user_tz":-540,"elapsed":37220,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":287}},"source":["# 7.35 단어 토큰화\n","# 단어의 set을 만듭니다.\n","vocab = sorted(set(train_text_X))\n","vocab.append('UNK')\n","print ('{} unique words'.format(len(vocab)))\n","\n","# vocab list를 숫자로 맵핑하고, 반대도 실행합니다.\n","word2idx = {u:i for i, u in enumerate(vocab)}\n","idx2word = np.array(vocab)\n","\n","text_as_int = np.array([word2idx[c] for c in train_text_X])\n","\n","# word2idx 의 일부를 알아보기 쉽게 print 해봅니다.\n","print('{')\n","for word,_ in zip(word2idx, range(10)):\n"," print(' {:4s}: {:3d},'.format(repr(word), word2idx[word]))\n","print(' ...\\n}')\n","\n","print('index of UNK: {}'.format(word2idx['UNK']))"],"execution_count":0,"outputs":[{"output_type":"stream","text":["332640 unique words\n","{\n"," '\\n': 0,\n"," '!' : 1,\n"," ',' : 2,\n"," '000명으로': 3,\n"," '001': 4,\n"," '002': 5,\n"," '003': 6,\n"," '004': 7,\n"," '005': 8,\n"," '006': 9,\n"," ...\n","}\n","index of UNK: 332639\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"dIOkvMpd_7Wd","colab_type":"code","outputId":"5fc29cf4-f965-4899-e954-a490e859420d","executionInfo":{"status":"ok","timestamp":1565652879267,"user_tz":-540,"elapsed":35589,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":71}},"source":["# 7.36 토큰 데이터 확인\n","print(train_text_X[:20])\n","print(text_as_int[:20])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["['태조', '이성계', '선대의', '가계', '목조', '이안사가', '전주에서', '삼척', '의주를', '거쳐', '알동에', '정착하다', '\\n', '태조', '강헌', '지인', '계운', '성문', '신무', '대왕']\n","[299305 229634 161443 17430 111029 230292 251081 155087 225462 29027\n"," 190295 256129 0 299305 25624 273553 36147 163996 180466 84413]\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"hKeZRJsM_7Tx","colab_type":"code","outputId":"b5d1a3f5-47f9-4fbc-8d38-c159b4aff2fe","executionInfo":{"status":"ok","timestamp":1565652879267,"user_tz":-540,"elapsed":34165,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":107}},"source":["# 7.37 기본 데이터셋 만들기\n","seq_length = 25\n","examples_per_epoch = len(text_as_int) // seq_length\n","sentence_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)\n","\n","sentence_dataset = sentence_dataset.batch(seq_length+1, drop_remainder=True)\n","for item in sentence_dataset.take(1):\n"," print(idx2word[item.numpy()])\n"," print(item.numpy())"],"execution_count":0,"outputs":[{"output_type":"stream","text":["['태조' '이성계' '선대의' '가계' '목조' '이안사가' '전주에서' '삼척' '의주를' '거쳐' '알동에' '정착하다'\n"," '\\n' '태조' '강헌' '지인' '계운' '성문' '신무' '대왕' '의' '성은' '이씨' '요' ',' '휘']\n","[299305 229634 161443 17430 111029 230292 251081 155087 225462 29027\n"," 190295 256129 0 299305 25624 273553 36147 163996 180466 84413\n"," 224182 164549 230248 210912 2 330313]\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"WCgSGJTQ_7QH","colab_type":"code","outputId":"d8df3831-c7b8-4913-8b6c-7f8713fa3a84","executionInfo":{"status":"ok","timestamp":1565652879672,"user_tz":-540,"elapsed":32900,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":143}},"source":["# 7.38 학습 데이터셋 만들기\n","def split_input_target(chunk):\n"," return [chunk[:-1], chunk[-1]]\n","\n","train_dataset = sentence_dataset.map(split_input_target)\n","for x,y in train_dataset.take(1):\n"," print(idx2word[x.numpy()])\n"," print(x.numpy())\n"," print(idx2word[y.numpy()])\n"," print(y.numpy())"],"execution_count":0,"outputs":[{"output_type":"stream","text":["['태조' '이성계' '선대의' '가계' '목조' '이안사가' '전주에서' '삼척' '의주를' '거쳐' '알동에' '정착하다'\n"," '\\n' '태조' '강헌' '지인' '계운' '성문' '신무' '대왕' '의' '성은' '이씨' '요' ',']\n","[299305 229634 161443 17430 111029 230292 251081 155087 225462 29027\n"," 190295 256129 0 299305 25624 273553 36147 163996 180466 84413\n"," 224182 164549 230248 210912 2]\n","휘\n","330313\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"X6LSzyUgS72O","colab_type":"code","colab":{}},"source":["# 7.39 데이터셋 shuffle, batch 설정\n","BATCH_SIZE = 512\n","steps_per_epoch = examples_per_epoch // BATCH_SIZE\n","BUFFER_SIZE = 10000\n","\n","train_dataset = train_dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE, drop_remainder=True)"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"bGDQMKzZRz9k","colab_type":"code","outputId":"bb7bed08-62e9-4aab-9a1d-c11e4f9e6442","executionInfo":{"status":"ok","timestamp":1565652880071,"user_tz":-540,"elapsed":27222,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":415}},"source":["# 7.40 단어 단위 생성 모델 정의\n","total_words = len(vocab)\n","model = tf.keras.Sequential([\n"," tf.keras.layers.Embedding(total_words, 100, input_length=seq_length),\n"," tf.keras.layers.LSTM(units=100, return_sequences=True),\n"," tf.keras.layers.Dropout(0.2),\n"," tf.keras.layers.LSTM(units=100),\n"," tf.keras.layers.Dense(total_words, activation='softmax')\n","])\n","\n","model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n","model.summary()"],"execution_count":0,"outputs":[{"output_type":"stream","text":["WARNING: Logging before flag parsing goes to stderr.\n","W0812 23:34:38.569299 140394947336064 tf_logging.py:161] : Note that this layer is not optimized for performance. Please use tf.keras.layers.CuDNNLSTM for better performance on GPU.\n","W0812 23:34:38.583793 140394947336064 tf_logging.py:161] : Note that this layer is not optimized for performance. Please use tf.keras.layers.CuDNNLSTM for better performance on GPU.\n"],"name":"stderr"},{"output_type":"stream","text":["Model: \"sequential\"\n","_________________________________________________________________\n","Layer (type) Output Shape Param # \n","=================================================================\n","embedding (Embedding) (None, 25, 100) 33264000 \n","_________________________________________________________________\n","unified_lstm (UnifiedLSTM) (None, 25, 100) 80400 \n","_________________________________________________________________\n","dropout (Dropout) (None, 25, 100) 0 \n","_________________________________________________________________\n","unified_lstm_1 (UnifiedLSTM) (None, 100) 80400 \n","_________________________________________________________________\n","dense (Dense) (None, 332640) 33596640 \n","=================================================================\n","Total params: 67,021,440\n","Trainable params: 67,021,440\n","Non-trainable params: 0\n","_________________________________________________________________\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"xCF1_hcARz6g","colab_type":"code","outputId":"211c953f-b098-485f-baea-6feae75f069d","executionInfo":{"status":"ok","timestamp":1565665345719,"user_tz":-540,"elapsed":8458911,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":1000}},"source":["# 7.41 단어 단위 생성 모델 학습\n","from tensorflow.keras.preprocessing.sequence import pad_sequences\n","\n","def testmodel(epoch, logs):\n"," if epoch % 5 != 0 and epoch != 49:\n"," return\n"," test_sentence = train_text[0]\n","\n"," next_words = 100\n"," for _ in range(next_words):\n"," test_text_X = test_sentence.split(' ')[-seq_length:]\n"," test_text_X = np.array([word2idx[c] if c in word2idx else word2idx['UNK'] for c in test_text_X])\n"," test_text_X = pad_sequences([test_text_X], maxlen=seq_length, padding='pre', value=word2idx['UNK'])\n","\n"," output_idx = model.predict_classes(test_text_X)\n"," test_sentence += ' ' + idx2word[output_idx[0]]\n"," \n"," print()\n"," print(test_sentence)\n"," print()\n","\n","testmodelcb = tf.keras.callbacks.LambdaCallback(on_epoch_end=testmodel)\n","\n","history = model.fit(train_dataset.repeat(), epochs=50, steps_per_epoch=steps_per_epoch, callbacks=[testmodelcb], verbose=2)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Epoch 1/50\n","\n"," 태조 이성계 선대의 가계 목조 이안사가 전주에서 삼척 의주를 거쳐 알동에 정착하다 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,\n","\n","533/533 - 255s - loss: 9.3702 - accuracy: 0.0723\n","Epoch 2/50\n","533/533 - 249s - loss: 8.3646 - accuracy: 0.0741\n","Epoch 3/50\n","533/533 - 249s - loss: 8.0768 - accuracy: 0.0816\n","Epoch 4/50\n","533/533 - 249s - loss: 7.8147 - accuracy: 0.0911\n","Epoch 5/50\n","533/533 - 249s - loss: 7.5722 - accuracy: 0.1025\n","Epoch 6/50\n","\n"," 태조 이성계 선대의 가계 목조 이안사가 전주에서 삼척 의주를 거쳐 알동에 정착하다 , , , , , , 그 , , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그 것은 , 그\n","\n","533/533 - 250s - loss: 7.3301 - accuracy: 0.1165\n","Epoch 7/50\n","533/533 - 249s - loss: 7.0574 - accuracy: 0.1305\n","Epoch 8/50\n","533/533 - 249s - loss: 6.7848 - accuracy: 0.1433\n","Epoch 9/50\n","533/533 - 249s - loss: 6.5153 - accuracy: 0.1555\n","Epoch 10/50\n","533/533 - 249s - loss: 6.2694 - accuracy: 0.1679\n","Epoch 11/50\n","\n"," 태조 이성계 선대의 가계 목조 이안사가 전주에서 삼척 의주를 거쳐 알동에 정착하다 등 것입니다 \n"," 하니 , 임금이 말하기를 , \n"," 상참을 받고 , 임금이 아뢰기를 , \n"," 이 받고 그 일을 다 다 다 가지고 주고 , 그 거느리고 다 화살을 내어 주고 , 이는 아뢰기를 , \n"," 함길도 의 서쪽에 서향하여 없는 것입니다 또 아뢰기를 , \n"," 이 받고 반드시 보내어 가서 가지고 가서 가서 주고 , 그 거느리고 의하여 서향하여 있으니 , 그 받고 , 아뢰기를 , \n"," 그 일을 가지고 서향하여 서게 하고 , 그 받고 몸을 아뢰기를 , \n"," 예조에서 아뢰기를 , \n"," 함길도 의 서쪽에 인도하여 가지고 주고 , 아뢰기를 , \n"," 평안도 의 서쪽에 서향하여\n","\n","533/533 - 250s - loss: 6.0086 - accuracy: 0.1822\n","Epoch 12/50\n","533/533 - 249s - loss: 5.7584 - accuracy: 0.1960\n","Epoch 13/50\n","533/533 - 248s - loss: 5.5062 - accuracy: 0.2102\n","Epoch 14/50\n","533/533 - 249s - loss: 5.2491 - accuracy: 0.2261\n","Epoch 15/50\n","533/533 - 249s - loss: 4.9958 - accuracy: 0.2423\n","Epoch 16/50\n","\n"," 태조 이성계 선대의 가계 목조 이안사가 전주에서 삼척 의주를 거쳐 알동에 정착하다 것이니 , 그 뜻을 다 알지 것이 없습니다 지금 내가 비록 여러 것은 모두 다 일을 다 일을 다 일을 다 말을 말을 다 알고 , 지금 만일 다시 가서 가서 아뢰게 하고 , 드디어 비가 보내어 가서 가서 토물 을 바쳤다 조회를 받았다 을축년 관찰사에게 이르기 살기가 , 의정부에서 아뢰기를 , \n"," 맹규의 관찰사에게 유시하기를 , \n"," 맹규의 벼슬만 아니오라 , 왕비가 관찰사에게 유시하기를 , \n"," 중추원 관찰사에게 유시하기를 , \n"," 중추원 부사 권맹경이 \n"," 하였다 전 도절제사 부사 로 하여금 상언 하기를 , \n"," 맹규의 관찰사에게 유시하기를 , \n"," 맹규의 죄수 벌할 하게 , \n"," 세자가 아뢰기를 ,\n","\n","533/533 - 249s - loss: 4.7473 - accuracy: 0.2599\n","Epoch 17/50\n","533/533 - 249s - loss: 4.5038 - accuracy: 0.2782\n","Epoch 18/50\n","533/533 - 249s - loss: 4.2670 - accuracy: 0.2984\n","Epoch 19/50\n","533/533 - 249s - loss: 4.0450 - accuracy: 0.3195\n","Epoch 20/50\n","533/533 - 249s - loss: 3.8258 - accuracy: 0.3440\n","Epoch 21/50\n","\n"," 태조 이성계 선대의 가계 목조 이안사가 전주에서 삼척 의주를 거쳐 알동에 정착하다 것이다 고 하고 , 그 말을 있고 , 모두 같이 같이 같이 같이 한다 또한 있고 한 것은 더욱 말을 있는 것은 모두 이를 살피게 하라 \n"," 하였다 일본국 정난 공신 에게 유시 하기를 , \n"," 일본국 병조 에서 상서 하여 각각 더불어 제수 로 하여금 함께 의논하여 가서 아뢰니 , 일본국 명나라 정문 에 의거하여 아뢰니 , 임금이 말하기를 , \n"," 일본국 상송포 새긴들 다만 정난 신숙주 에게 유시 하기를 , \n"," 일본국 병조 에서 전지 하기를 , \n"," 이 사람을 보내어 와서 와서 가서 와서 이르기를 , \n"," 경 은 하직하니 , 그 죄는 와서 와서 의논하게 하였다\n","\n","533/533 - 250s - loss: 3.6157 - accuracy: 0.3703\n","Epoch 22/50\n","533/533 - 249s - loss: 3.4163 - accuracy: 0.3981\n","Epoch 23/50\n","533/533 - 249s - loss: 3.2208 - accuracy: 0.4284\n","Epoch 24/50\n","533/533 - 249s - loss: 3.0313 - accuracy: 0.4601\n","Epoch 25/50\n","533/533 - 249s - loss: 2.8555 - accuracy: 0.4897\n","Epoch 26/50\n","\n"," 태조 이성계 선대의 가계 목조 이안사가 전주에서 삼척 의주를 거쳐 알동에 정착하다 것인데 , 만약 혹은 좋은 자는 백성을 주고 , 혹은 폐단이 있어 있어 오래 자가 나누어 주고 , 반드시 말을 일을 가지고 나누어 보내어 가게 하고 , 만일 병이 사실을 염려하여 , 드디어 말하기를 , \n"," 함길도 도절제사 의 죄는 돌아와서 보내지 않은 것을 옮겨 주어 아뢰게 하고 , 만일 자기 베어 징계하소서 \n"," 예조 에서 공조 판서 겸 형조 참판 제학 이조 등이 불러 불러서 조용히 전하다 \n"," 경상도 상호군 박경무 으로 종이 대부 로 삼았다 함길도 도절제사 에서 와서 와서 내려 죄를 가서 아뢰다 \n"," 사헌부에서 아뢰기를 , \n"," 함길도 나라 일로 감사 의 개를 바치었다 햇무리가 쏘았다\n","\n","533/533 - 250s - loss: 2.6946 - accuracy: 0.5192\n","Epoch 27/50\n","533/533 - 248s - loss: 2.5327 - accuracy: 0.5480\n","Epoch 28/50\n","533/533 - 249s - loss: 2.3733 - accuracy: 0.5766\n","Epoch 29/50\n","533/533 - 249s - loss: 2.2233 - accuracy: 0.6036\n","Epoch 30/50\n","533/533 - 249s - loss: 2.0778 - accuracy: 0.6309\n","Epoch 31/50\n","\n"," 태조 이성계 선대의 가계 목조 이안사가 전주에서 삼척 의주를 거쳐 알동에 정착하다 되고 , 청컨대 본조 수는 없는데 , 무릇 여러 일은 이미 심히 알지 자는 서로 알 것이다 또한 이미 여러 사람이 심히 말을 사람을 얻게 합니다 이에 갖추어 아뢰니 , 드디어 세자에게 거둥하여 사실을 묻게 하였으나 , 임금이 말하기를 , \n"," 이 사람을 거느리고 가서 와서 이르기를 , \n"," 이 사람을 보내 토산물을 바쳤다 나도 아뢴 않겠는가 \n"," 하였다 임금이 말하기를 , \n"," 전하께서 전지 에서 함께 사사로이 듣고 아뢰게 하고 , 만일 잘못 묻지는 를 올려 국문 하여 계문 하여 이러하였다 \n"," 대간 으로 사제 를 하사하다 \n"," 대간 에 내리니 , 전하께서 다시 와서 가서 잘 알지 것은\n","\n","533/533 - 250s - loss: 1.9361 - accuracy: 0.6555\n","Epoch 32/50\n","533/533 - 249s - loss: 1.8070 - accuracy: 0.6788\n","Epoch 33/50\n","533/533 - 249s - loss: 1.6785 - accuracy: 0.7029\n","Epoch 34/50\n","533/533 - 249s - loss: 1.5642 - accuracy: 0.7236\n","Epoch 35/50\n","533/533 - 249s - loss: 1.4530 - accuracy: 0.7431\n","Epoch 36/50\n","\n"," 태조 이성계 선대의 가계 목조 이안사가 전주에서 삼척 의주를 거쳐 알동에 정착하다 된다 말하다 , 사의가 음악은 옳을 수는 없으니 , 본조 가 같이 같이 같이 있고 북쪽을 안 한 뒤에 모두 다 자리로 나아간다 \n"," 창한다 마치면 , 통찬이 윤대를 행하고 , 신의 하나는 인도하여 내려와 제자리로 돌아간다 집례가 사배하라 찬하여 , 배 이하가 모두 꿇어앉는다 무릇 다음에 정한 것도 돌아간다 찬자가 사배하라 찬하면 , 감찰 는 단 가 자리에 나아간다 찬인이 감찰과 여러 때의 의식과 같이 한다 집례가 그 곡하라 하면 , 다음에 꿇어앉는다 여러 사람이 각기 각기 각기 자리에 나아간다 알자가 술잔을 씻고 올라가 인도하여 자리에 나간다 집례가 사배하라 찬하면 , 흥 , 흥 , 흥 , 흥 ,\n","\n","533/533 - 250s - loss: 1.3488 - accuracy: 0.7627\n","Epoch 37/50\n","533/533 - 249s - loss: 1.2497 - accuracy: 0.7815\n","Epoch 38/50\n","533/533 - 248s - loss: 1.1613 - accuracy: 0.7968\n","Epoch 39/50\n","533/533 - 249s - loss: 1.0768 - accuracy: 0.8122\n","Epoch 40/50\n","533/533 - 249s - loss: 0.9966 - accuracy: 0.8267\n","Epoch 41/50\n","\n"," 태조 이성계 선대의 가계 목조 이안사가 전주에서 삼척 의주를 거쳐 알동에 정착하다 되고 , 청컨대 그전 무지한 곳이 없게 되니 , 물러가 가까이 가고 , 혹은 도로 사람이 있을 것이다 진실로 이미 가 서로 폐단이 심히 남겨서 대신의 무리들이 급히 주게 하고 , 그 온 1백 콩 1백 명을 조사하여 급히 오늘에 가서 크게 시종 중에 살펴보게 한다든가 허락하지 아니하였다 신이 그 죄가 와서 와서 가서 청하여 임금의 두게 하소서 \n"," 하니 , 의금부에서 아뢰기를 , \n"," 평안도 토관 죄수 벌송 애오라지 염법 을 내리어 의논하게 하므로 , 무릇 부득이하여 보면 , 무릇 성상께서 생각해 나아가 바로 전의 를 인도하여 주어 서향하게 하고 , 다음은 나라가 정한 지경에 너무 가지고 반드시 모두\n","\n","533/533 - 250s - loss: 0.9232 - accuracy: 0.8399\n","Epoch 42/50\n","533/533 - 249s - loss: 0.8571 - accuracy: 0.8523\n","Epoch 43/50\n","533/533 - 249s - loss: 0.7950 - accuracy: 0.8637\n","Epoch 44/50\n","533/533 - 249s - loss: 0.7335 - accuracy: 0.8753\n","Epoch 45/50\n","533/533 - 249s - loss: 0.6764 - accuracy: 0.8857\n","Epoch 46/50\n","\n"," 태조 이성계 선대의 가계 목조 이안사가 전주에서 삼척 의주를 거쳐 알동에 정착하다 되고 , 청컨대 혹은 감한 많으며 , 겨우 휘 를 올리고 종자 가 서로 알 것이다 또한 감히 뒤에 모두 서로 폐단을 알 것이다 그러나 경 등과 천지 인 약정하기를 사직 과 더불어 글을 모여서 가서 본 말은 서울과 70이 민간에 시행할 있지 않는 것이니 , 이에 어질고 떨어져 구 에 참여하지 않을 것이니 , 마침내 그를 오지 아니하고 , 대개 속전 에 붙여 들지 아니할 것이니 , 그것을 그르다 힘쓰고 수양 3천 떼가 박천 2개는 모순 천하가 의논했다고 되었다 청백 양씨 중후 처소 740 강호덕 615 박사란 김선거 연변에 이등 씩 음식도 어리고 2명씩 뵙고 일본의 주었사오니 하옵고 침체\n","\n","533/533 - 250s - loss: 0.6241 - accuracy: 0.8957\n","Epoch 47/50\n","533/533 - 249s - loss: 0.5790 - accuracy: 0.9038\n","Epoch 48/50\n","533/533 - 249s - loss: 0.5355 - accuracy: 0.9114\n","Epoch 49/50\n","533/533 - 249s - loss: 0.4964 - accuracy: 0.9183\n","Epoch 50/50\n","\n"," 태조 이성계 선대의 가계 목조 이안사가 전주에서 삼척 의주를 거쳐 알동에 정착하다 들을 것과 , 본조 가 없으면 서향하게 것입니다 만약 먼저 단 가 있고 , 한 법이 같이 같이 같이 되어 한 일이 있을 일이 없습니다 그러나 , 이제부터는 진휼사 에 술을 받들어 그 자리에 매우 옳지 를 나아가서 , 내가 그 아비를 가서 온 사람은 한번 가상히 부임 하여 이러한 때 아울러 국문 하여 외방 전의 일수 를 받들어 잡희 를 나아가서 나아가서 나가고 , 이어서 병법 과 악 을 외유 일어나고 , 의장 을 더하여 적당히 판위 에 올라 그치게 하되 , 앙제 에 나아가서 꿇어앉아 나아가서 선다 판통례가 , 다만 술 서문 궤 앞으로 나아가 부복하고 꿇어앉아 부복\n","\n","533/533 - 250s - loss: 0.4581 - accuracy: 0.9256\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"Zz6UCaidRz2b","colab_type":"code","outputId":"484d36b1-5218-4dc9-d5f6-5392269d1ab5","executionInfo":{"status":"ok","timestamp":1565665346246,"user_tz":-540,"elapsed":547,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":73}},"source":["# 7.42 임의의 문장을 사용한 생성 결과 확인\n","from tensorflow.keras.preprocessing.sequence import pad_sequences\n","test_sentence = '동헌에 나가 공무를 본 후 활 십오 순을 쏘았다'\n","\n","next_words = 100\n","for _ in range(next_words):\n"," test_text_X = test_sentence.split(' ')[-seq_length:]\n"," test_text_X = np.array([word2idx[c] if c in word2idx else word2idx['UNK'] for c in test_text_X])\n"," test_text_X = pad_sequences([test_text_X], maxlen=seq_length, padding='pre', value=word2idx['UNK'])\n"," \n"," output_idx = model.predict_classes(test_text_X)\n"," test_sentence += ' ' + idx2word[output_idx[0]]\n","\n","print(test_sentence)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["동헌에 나가 공무를 본 후 활 십오 순을 쏘았다 그곳의 사로잡힌 대리하는 호군직 2개는 놓기도 토의 으로써 차임 되고 , 저들은 일시에 굳게 것으로서 주고 , 더욱 높은 바가 많아서 정위 라 같다 하는데 하였습니다 빈자 는 부의 에 도와서 알아야 하여 주소서 \n"," 하니 , 형조 에서 교지 를 하사하고 충청도 도절제사 에서 다시 와서 와서 내려 쓸 하고 , 만일 잘 가는 것이 없었다 상수의 대한 한 한 뒤에 모두 능히 서로 알지 것은 감히 모두 모두 모두 사람을 죄를 죄를 사람을 죄를 온 한 사람을 삼가서 어질고 그믐날에 한다는 것이니 , 청컨대 이러한 정성을 알아서 난 를 정하여 급히 원하는 곳에 두고 특별히 징계하여 인도해 특별히\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"9Hzr8inp0Go4","colab_type":"text"},"source":["## 7.4.2 자소 단위 생성"]},{"cell_type":"code","metadata":{"id":"pPw8MxlxvE66","colab_type":"code","outputId":"aead5501-3f0f-4278-981e-9c9aabf10025","executionInfo":{"status":"ok","timestamp":1565835939617,"user_tz":-540,"elapsed":56544,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":143}},"source":["# 7.43 jamotools 설치\n","!pip install jamotools"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Collecting jamotools\n"," Downloading https://files.pythonhosted.org/packages/3d/d6/ec13c68f7ea6a8085966390d256d183bf8488f8b9770028359acb86df643/jamotools-0.1.10-py2.py3-none-any.whl\n","Requirement already satisfied: future in /usr/local/lib/python3.6/dist-packages (from jamotools) (0.16.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from jamotools) (1.16.4)\n","Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from jamotools) (1.12.0)\n","Installing collected packages: jamotools\n","Successfully installed jamotools-0.1.10\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"Xq6XfbRpvEz5","colab_type":"code","outputId":"983099ed-d1e6-44d5-9546-360eaf9d3900","executionInfo":{"status":"ok","timestamp":1565835939952,"user_tz":-540,"elapsed":56871,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":89}},"source":["# 7.44 자모 분리 테스트\n","import jamotools\n","\n","train_text = open(path_to_file, 'rb').read().decode(encoding='utf-8')\n","s = train_text[:100]\n","print(s)\n","\n","# 한글 텍스트를 자모 단위로 분리해줍니다. 한자 등에는 영향이 없습니다.\n","s_split = jamotools.split_syllables(s)\n","print(s_split)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 \n","태조 강헌 지인 계운 성문 신무 대왕(太祖康獻至仁啓運聖文神武大王)의 성은 이씨(李氏)요, 휘\n","ㅌㅐㅈㅗ ㅇㅣㅅㅓㅇㄱㅖ ㅅㅓㄴㄷㅐㅇㅢ ㄱㅏㄱㅖ. ㅁㅗㄱㅈㅗ ㅇㅣㅇㅏㄴㅅㅏㄱㅏ ㅈㅓㄴㅈㅜㅇㅔㅅㅓ ㅅㅏㅁㅊㅓㄱ·ㅇㅢㅈㅜㄹㅡㄹ ㄱㅓㅊㅕ ㅇㅏㄹㄷㅗㅇㅇㅔ ㅈㅓㅇㅊㅏㄱㅎㅏㄷㅏ \n","ㅌㅐㅈㅗ ㄱㅏㅇㅎㅓㄴ ㅈㅣㅇㅣㄴ ㄱㅖㅇㅜㄴ ㅅㅓㅇㅁㅜㄴ ㅅㅣㄴㅁㅜ ㄷㅐㅇㅘㅇ(太祖康獻至仁啓運聖文神武大王)ㅇㅢ ㅅㅓㅇㅇㅡㄴ ㅇㅣㅆㅣ(李氏)ㅇㅛ, ㅎㅟ\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"-Ivfd0G5RRLJ","colab_type":"code","outputId":"a12708bf-2d79-47bd-b225-c65ac5624797","executionInfo":{"status":"ok","timestamp":1565835939953,"user_tz":-540,"elapsed":56863,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":71}},"source":["# 7.45 자모 결합 테스트\n","s2 = jamotools.join_jamos(s_split)\n","print(s2)\n","print(s == s2)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 \n","태조 강헌 지인 계운 성문 신무 대왕(太祖康獻至仁啓運聖文神武大王)의 성은 이씨(李氏)요, 휘\n","True\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"wtl5EkcrRRIV","colab_type":"code","outputId":"e1082c46-af08-40c6-9e49-98e760cd0ac3","executionInfo":{"status":"ok","timestamp":1565835987976,"user_tz":-540,"elapsed":104878,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":287}},"source":["# 7.46 자모 토큰화\n","# 텍스트를 자모 단위로 나눕니다. 데이터가 크기 때문에 약간 시간이 걸립니다.\n","train_text_X = jamotools.split_syllables(train_text)\n","vocab = sorted(set(train_text_X))\n","vocab.append('UNK')\n","print ('{} unique characters'.format(len(vocab)))\n","\n","# vocab list를 숫자로 맵핑하고, 반대도 실행합니다.\n","char2idx = {u:i for i, u in enumerate(vocab)}\n","idx2char = np.array(vocab)\n","\n","text_as_int = np.array([char2idx[c] for c in train_text_X])\n","\n","# word2idx 의 일부를 알아보기 쉽게 print 해봅니다.\n","print('{')\n","for char,_ in zip(char2idx, range(10)):\n"," print(' {:4s}: {:3d},'.format(repr(char), char2idx[char]))\n","print(' ...\\n}')\n","\n","print('index of UNK: {}'.format(char2idx['UNK']))"],"execution_count":0,"outputs":[{"output_type":"stream","text":["6198 unique characters\n","{\n"," '\\n': 0,\n"," ' ' : 1,\n"," '!' : 2,\n"," '\"' : 3,\n"," \"'\" : 4,\n"," '(' : 5,\n"," ')' : 6,\n"," '+' : 7,\n"," ',' : 8,\n"," '-' : 9,\n"," ...\n","}\n","index of UNK: 6197\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"opyAlE-ZR4-o","colab_type":"code","outputId":"af7f9ba2-5e74-4315-c0f2-d029f74ec092","executionInfo":{"status":"ok","timestamp":1565835987977,"user_tz":-540,"elapsed":104873,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":71}},"source":["# 7.47 토큰 데이터 확인\n","print(train_text_X[:20])\n","print(text_as_int[:20])"],"execution_count":0,"outputs":[{"output_type":"stream","text":["ㅌㅐㅈㅗ ㅇㅣㅅㅓㅇㄱㅖ ㅅㅓㄴㄷㅐㅇ\n","[6158 83 87 79 94 1 78 106 76 90 78 56 93 1\n"," 76 90 59 62 87 78]\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"MP0hfUCVRsp7","colab_type":"code","outputId":"478819d1-4c00-4fa8-a4ed-ddb48b927e82","executionInfo":{"status":"ok","timestamp":1565835988335,"user_tz":-540,"elapsed":105224,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":449}},"source":["# 7.48 학습 데이터세트 생성\n","seq_length = 80\n","examples_per_epoch = len(text_as_int) // seq_length\n","char_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)\n","\n","char_dataset = char_dataset.batch(seq_length+1, drop_remainder=True)\n","for item in char_dataset.take(1):\n"," print(idx2char[item.numpy()])\n"," print(item.numpy())\n"," \n","def split_input_target(chunk):\n"," return [chunk[:-1], chunk[-1]]\n","\n","train_dataset = char_dataset.map(split_input_target)\n","for x,y in train_dataset.take(1):\n"," print(idx2char[x.numpy()])\n"," print(x.numpy())\n"," print(idx2char[y.numpy()])\n"," print(y.numpy())\n"," \n","BATCH_SIZE = 256\n","steps_per_epoch = examples_per_epoch // BATCH_SIZE\n","BUFFER_SIZE = 10000\n","\n","train_dataset = train_dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE, drop_remainder=True)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["['\\ufeff' 'ㅌ' 'ㅐ' 'ㅈ' 'ㅗ' ' ' 'ㅇ' 'ㅣ' 'ㅅ' 'ㅓ' 'ㅇ' 'ㄱ' 'ㅖ' ' ' 'ㅅ' 'ㅓ' 'ㄴ'\n"," 'ㄷ' 'ㅐ' 'ㅇ' 'ㅢ' ' ' 'ㄱ' 'ㅏ' 'ㄱ' 'ㅖ' '.' ' ' 'ㅁ' 'ㅗ' 'ㄱ' 'ㅈ' 'ㅗ' ' ' 'ㅇ'\n"," 'ㅣ' 'ㅇ' 'ㅏ' 'ㄴ' 'ㅅ' 'ㅏ' 'ㄱ' 'ㅏ' ' ' 'ㅈ' 'ㅓ' 'ㄴ' 'ㅈ' 'ㅜ' 'ㅇ' 'ㅔ' 'ㅅ' 'ㅓ'\n"," ' ' 'ㅅ' 'ㅏ' 'ㅁ' 'ㅊ' 'ㅓ' 'ㄱ' '·' 'ㅇ' 'ㅢ' 'ㅈ' 'ㅜ' 'ㄹ' 'ㅡ' 'ㄹ' ' ' 'ㄱ' 'ㅓ'\n"," 'ㅊ' 'ㅕ' ' ' 'ㅇ' 'ㅏ' 'ㄹ' 'ㄷ' 'ㅗ' 'ㅇ' 'ㅇ']\n","[6158 83 87 79 94 1 78 106 76 90 78 56 93 1\n"," 76 90 59 62 87 78 105 1 56 86 56 93 10 1\n"," 72 94 56 79 94 1 78 106 78 86 59 76 86 56\n"," 86 1 79 90 59 79 99 78 91 76 90 1 76 86\n"," 72 81 90 56 36 78 105 79 99 64 104 64 1 56\n"," 90 81 92 1 78 86 64 62 94 78 78]\n","['\\ufeff' 'ㅌ' 'ㅐ' 'ㅈ' 'ㅗ' ' ' 'ㅇ' 'ㅣ' 'ㅅ' 'ㅓ' 'ㅇ' 'ㄱ' 'ㅖ' ' ' 'ㅅ' 'ㅓ' 'ㄴ'\n"," 'ㄷ' 'ㅐ' 'ㅇ' 'ㅢ' ' ' 'ㄱ' 'ㅏ' 'ㄱ' 'ㅖ' '.' ' ' 'ㅁ' 'ㅗ' 'ㄱ' 'ㅈ' 'ㅗ' ' ' 'ㅇ'\n"," 'ㅣ' 'ㅇ' 'ㅏ' 'ㄴ' 'ㅅ' 'ㅏ' 'ㄱ' 'ㅏ' ' ' 'ㅈ' 'ㅓ' 'ㄴ' 'ㅈ' 'ㅜ' 'ㅇ' 'ㅔ' 'ㅅ' 'ㅓ'\n"," ' ' 'ㅅ' 'ㅏ' 'ㅁ' 'ㅊ' 'ㅓ' 'ㄱ' '·' 'ㅇ' 'ㅢ' 'ㅈ' 'ㅜ' 'ㄹ' 'ㅡ' 'ㄹ' ' ' 'ㄱ' 'ㅓ'\n"," 'ㅊ' 'ㅕ' ' ' 'ㅇ' 'ㅏ' 'ㄹ' 'ㄷ' 'ㅗ' 'ㅇ']\n","[6158 83 87 79 94 1 78 106 76 90 78 56 93 1\n"," 76 90 59 62 87 78 105 1 56 86 56 93 10 1\n"," 72 94 56 79 94 1 78 106 78 86 59 76 86 56\n"," 86 1 79 90 59 79 99 78 91 76 90 1 76 86\n"," 72 81 90 56 36 78 105 79 99 64 104 64 1 56\n"," 90 81 92 1 78 86 64 62 94 78]\n","ㅇ\n","78\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"TazYgfrsRsly","colab_type":"code","outputId":"d1f0f38f-0dd8-4d86-db84-a35afa447388","executionInfo":{"status":"ok","timestamp":1565835988755,"user_tz":-540,"elapsed":105638,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":325}},"source":["# 7.49 자소 단위 생성 모델 정의\n","total_chars = len(vocab)\n","model = tf.keras.Sequential([\n"," tf.keras.layers.Embedding(total_chars, 100, input_length=seq_length),\n"," tf.keras.layers.LSTM(units=400),\n"," tf.keras.layers.Dense(total_chars, activation='softmax')\n","])\n","\n","model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n","model.summary()"],"execution_count":0,"outputs":[{"output_type":"stream","text":["WARNING: Logging before flag parsing goes to stderr.\n","W0815 02:26:31.007726 140634399106944 tf_logging.py:161] : Note that this layer is not optimized for performance. Please use tf.keras.layers.CuDNNLSTM for better performance on GPU.\n"],"name":"stderr"},{"output_type":"stream","text":["Model: \"sequential\"\n","_________________________________________________________________\n","Layer (type) Output Shape Param # \n","=================================================================\n","embedding (Embedding) (None, 80, 100) 619800 \n","_________________________________________________________________\n","unified_lstm (UnifiedLSTM) (None, 400) 801600 \n","_________________________________________________________________\n","dense (Dense) (None, 6198) 2485398 \n","=================================================================\n","Total params: 3,906,798\n","Trainable params: 3,906,798\n","Non-trainable params: 0\n","_________________________________________________________________\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"Xjv4zsxFRRF9","colab_type":"code","outputId":"bea65cf1-5cd4-406b-de71-2866f01208b6","executionInfo":{"status":"ok","timestamp":1565863012352,"user_tz":-540,"elapsed":23141912,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":1000}},"source":["# 7.50 자소 단위 생성 모델 학습\n","from tensorflow.keras.preprocessing.sequence import pad_sequences\n","\n","def testmodel(epoch, logs):\n"," if epoch % 5 != 0 and epoch != 99:\n"," return\n"," \n"," test_sentence = train_text[:48]\n"," test_sentence = jamotools.split_syllables(test_sentence)\n","\n"," next_chars = 300\n"," for _ in range(next_chars):\n"," test_text_X = test_sentence[-seq_length:]\n"," test_text_X = np.array([char2idx[c] if c in char2idx else char2idx['UNK'] for c in test_text_X])\n"," test_text_X = pad_sequences([test_text_X], maxlen=seq_length, padding='pre', value=char2idx['UNK'])\n","\n"," output_idx = model.predict_classes(test_text_X)\n"," test_sentence += idx2char[output_idx[0]]\n"," \n"," print()\n"," print(jamotools.join_jamos(test_sentence))\n"," print()\n","\n","testmodelcb = tf.keras.callbacks.LambdaCallback(on_epoch_end=testmodel)\n","\n","history = model.fit(train_dataset.repeat(), epochs=100, steps_per_epoch=steps_per_epoch, callbacks=[testmodelcb], verbose=2)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Epoch 1/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 이를 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 것을 \n","\n","2364/2364 - 270s - loss: 2.5904 - accuracy: 0.3065\n","Epoch 2/100\n","2364/2364 - 266s - loss: 1.9905 - accuracy: 0.4264\n","Epoch 3/100\n","2364/2364 - 266s - loss: 1.8423 - accuracy: 0.4608\n","Epoch 4/100\n","2364/2364 - 266s - loss: 1.7423 - accuracy: 0.4823\n","Epoch 5/100\n","2364/2364 - 264s - loss: 1.6784 - accuracy: 0.4948\n","Epoch 6/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 일이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다. 임금이 있었다.\n","\n","2364/2364 - 265s - loss: 1.6241 - accuracy: 0.5070\n","Epoch 7/100\n","2364/2364 - 264s - loss: 1.5739 - accuracy: 0.5184\n","Epoch 8/100\n","2364/2364 - 264s - loss: 1.5297 - accuracy: 0.5286\n","Epoch 9/100\n","2364/2364 - 266s - loss: 1.4916 - accuracy: 0.5372\n","Epoch 10/100\n","2364/2364 - 268s - loss: 1.4595 - accuracy: 0.5451\n","Epoch 11/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하였다. 임금이 말하기를,\n","\"임금이 말하기를,\n","\"임금이 말하기를,\n","\"임금이 말하기를,\n","\"임금이 말하기를,\n","\"임금이 말하기를,\n","\"임금이 말하기를,\n","\"임금이 말하기를,\n","\"임금이 말하기를,\n","\"임금이 말하기를,\n","\"임금이 말하기를,\n","\"임금이 말하기를,\n","\"임금이 말하기를,\n","\"임그\n","\n","2364/2364 - 270s - loss: 1.4323 - accuracy: 0.5516\n","Epoch 12/100\n","2364/2364 - 269s - loss: 1.4059 - accuracy: 0.5585\n","Epoch 13/100\n","2364/2364 - 269s - loss: 1.3848 - accuracy: 0.5631\n","Epoch 14/100\n","2364/2364 - 269s - loss: 1.3646 - accuracy: 0.5685\n","Epoch 15/100\n","2364/2364 - 270s - loss: 1.3473 - accuracy: 0.5730\n","Epoch 16/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하였다. 임금이 말하기를,\n","\"이제 이를 받들고 전하께서 아뢰기를,\n","\"이제 이를 받들고 전하께서 아뢰기를,\n","\"이제 이를 받들고 전하께서 아뢰기를,\n","\"이제 이를 받들고 전하께서 아뢰기를,\n","\"이제 이를 받들고 전하께서 아뢰기를,\n","\"이제 이를 받들고 전하께서 아뢰기를,\n","\"이제 이를 받들\n","\n","2364/2364 - 272s - loss: 1.3297 - accuracy: 0.5777\n","Epoch 17/100\n","2364/2364 - 271s - loss: 1.3138 - accuracy: 0.5825\n","Epoch 18/100\n","2364/2364 - 270s - loss: 1.3013 - accuracy: 0.5857\n","Epoch 19/100\n","2364/2364 - 270s - loss: 1.2859 - accuracy: 0.5904\n","Epoch 20/100\n","2364/2364 - 272s - loss: 1.2727 - accuracy: 0.5941\n","Epoch 21/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하는 것은 그 고을에 있으면 그 사람을 감하게 하였다. 임금이 말하기를,\n","\"각각 15석을 가지고 감사(監司)에서 아뢰기를,\n","\"각각 15석을 가지고 감사(監司)에서 아뢰기를,\n","\"각각 15석을 가지고 감사(監司)에서 아뢰기를,\n","\"각각 15석을 가지고 감사(監司)에서 아뢰기를,\n","\"각각 15석을 가지\n","\n","2364/2364 - 275s - loss: 1.2607 - accuracy: 0.5970\n","Epoch 22/100\n","2364/2364 - 273s - loss: 1.2478 - accuracy: 0.6010\n","Epoch 23/100\n","2364/2364 - 273s - loss: 1.2370 - accuracy: 0.6044\n","Epoch 24/100\n","2364/2364 - 273s - loss: 1.2262 - accuracy: 0.6075\n","Epoch 25/100\n","2364/2364 - 273s - loss: 1.2161 - accuracy: 0.6101\n","Epoch 26/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하였다. 임금이 말하기를,\n","\"이제 임금이 말하기를,\n","\"이제 임금이 말하기를,\n","\"이제 임금이 말하기를,\n","\"이제 임금이 말하기를,\n","\"이제 임금이 말하기를,\n","\"이제 임금이 말하기를,\n","\"이제 임금이 말하기를,\n","\"이제 임금이 말하기를,\n","\"이제 임금이 말하기를,\n","\"이제 임금이 말하기를,\n","\n","\n","2364/2364 - 275s - loss: 1.2050 - accuracy: 0.6134\n","Epoch 27/100\n","2364/2364 - 273s - loss: 1.1956 - accuracy: 0.6167\n","Epoch 28/100\n","2364/2364 - 273s - loss: 1.1863 - accuracy: 0.6193\n","Epoch 29/100\n","2364/2364 - 274s - loss: 1.1771 - accuracy: 0.6223\n","Epoch 30/100\n","2364/2364 - 274s - loss: 1.1682 - accuracy: 0.6246\n","Epoch 31/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하니, 임금이 말하기를,\n","\"이 때에 이르기를,\n","\"상석(成石)을 진향하게 하였다. 임금이 말하기를,\n","\"이 때에 이르기를,\n","\"그러나 이를 주게 하다\n","예조에서 아뢰기를,\n","\"이 때에 이르기를,\n","\"그러나 이를 주게 하다\n","예조에서 아뢰기를,\n","\"이 때에 이르기를,\n","\"그러나 이를 주게 하다\n","예조에서 아뢰기를,\n","\"이 ㄸ\n","\n","2364/2364 - 276s - loss: 1.1608 - accuracy: 0.6267\n","Epoch 32/100\n","2364/2364 - 273s - loss: 1.1522 - accuracy: 0.6293\n","Epoch 33/100\n","2364/2364 - 273s - loss: 1.1448 - accuracy: 0.6321\n","Epoch 34/100\n","2364/2364 - 273s - loss: 1.1370 - accuracy: 0.6344\n","Epoch 35/100\n","2364/2364 - 273s - loss: 1.1303 - accuracy: 0.6361\n","Epoch 36/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 할 것입니다. 이것은 이를 받았다. 임금이 이를 받았다. 임금이 이를 받았다. 임금이 이를 받았다. 임금이 이를 받았다. 임금이 이를 받았다. 임금이 이를 받았다. 임금이 이를 받았다. 임금이 이를 받았다. 임금이 이를 받았다. 임금이 이를 받았다. 임금이 \n","\n","2364/2364 - 275s - loss: 1.1220 - accuracy: 0.6390\n","Epoch 37/100\n","2364/2364 - 272s - loss: 1.1161 - accuracy: 0.6407\n","Epoch 38/100\n","2364/2364 - 273s - loss: 1.1087 - accuracy: 0.6429\n","Epoch 39/100\n","2364/2364 - 273s - loss: 1.1020 - accuracy: 0.6448\n","Epoch 40/100\n","2364/2364 - 272s - loss: 1.0957 - accuracy: 0.6467\n","Epoch 41/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 한다. 전하께서는 알지 못한 자가 있으면 나와서 아뢰다\n","예조에서 아뢰기를,\n","\"이 앞서 있는 것이 어떻게 아뢰다\n","예조에서 아뢰기를,\n","\"이 앞서 정지는 알지 못한 자가 있으면 날이 없으니, 이제 있는 것이 어떻겠습니까. 이제 상소하기를,\n","\"이 앞서 중에 있는 것은 알지 못한 작\n","\n","2364/2364 - 268s - loss: 1.0895 - accuracy: 0.6494\n","Epoch 42/100\n","2364/2364 - 265s - loss: 1.0821 - accuracy: 0.6507\n","Epoch 43/100\n","2364/2364 - 265s - loss: 1.0770 - accuracy: 0.6527\n","Epoch 44/100\n","2364/2364 - 265s - loss: 1.0712 - accuracy: 0.6547\n","Epoch 45/100\n","2364/2364 - 266s - loss: 1.0654 - accuracy: 0.6565\n","Epoch 46/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하여 그 직임을 만들어 보낸 자는 이러하였다. 임금이 말하기를,\n","\"근일의 일을 이루지 않는다면 어찌 그 직임을 만들어 주는 것이 아니었다. ’고 하였습니다. 이제 상상도 염려되는 것이 아니었다. ’고 하였습니다. 신 등이 상소하기를,\n","\"근일의 일을 이루지 않는다면 어ㅉ\n","\n","2364/2364 - 268s - loss: 1.0604 - accuracy: 0.6578\n","Epoch 47/100\n","2364/2364 - 266s - loss: 1.0563 - accuracy: 0.6588\n","Epoch 48/100\n","2364/2364 - 265s - loss: 1.0498 - accuracy: 0.6608\n","Epoch 49/100\n","2364/2364 - 266s - loss: 1.0455 - accuracy: 0.6626\n","Epoch 50/100\n","2364/2364 - 266s - loss: 1.0404 - accuracy: 0.6640\n","Epoch 51/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하였으니 그 장(狀)을 강하게 하고, 상소를 이루게 하고, 이를 죽입니다. 이제 이미 정한 사람은 그 장(狀)을 기다리기를 청하였으니, 이것은 그를 구경하고 서울에 의거하여 아뢰기를,\n","\"경연(經筵司) 이상의 아들이 이를 주고, 우의정 신주(春秋)를 사용하고, 한 사람은 그 장차 북쪽에 ㄷ\n","\n","2364/2364 - 270s - loss: 1.0354 - accuracy: 0.6654\n","Epoch 52/100\n","2364/2364 - 267s - loss: 1.0294 - accuracy: 0.6679\n","Epoch 53/100\n","2364/2364 - 265s - loss: 1.0260 - accuracy: 0.6683\n","Epoch 54/100\n","2364/2364 - 267s - loss: 1.0213 - accuracy: 0.6698\n","Epoch 55/100\n","2364/2364 - 270s - loss: 1.0165 - accuracy: 0.6715\n","Epoch 56/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하였다. 이를 주었다. 임금이 말하기를,\n","\"이 앞에 있어서 아뢰기를,\n","\"이 사람이 일찍이 행하고, 인도하여 아뢰기를,\n","\"이 사람이 있다. 그 아들이 아뢰기를,\n","\"근일에 이르러 있다. 그 아들이 이를 주었다. 임금이 말하기를,\n","\"이 앞에 있어서 아뢰기를,\n","\"이 앞에 드리게 하다\n","임금이 말\n","\n","2364/2364 - 272s - loss: 1.0129 - accuracy: 0.6727\n","Epoch 57/100\n","2364/2364 - 270s - loss: 1.0085 - accuracy: 0.6744\n","Epoch 58/100\n","2364/2364 - 271s - loss: 1.0048 - accuracy: 0.6753\n","Epoch 59/100\n","2364/2364 - 270s - loss: 1.0004 - accuracy: 0.6765\n","Epoch 60/100\n","2364/2364 - 270s - loss: 0.9973 - accuracy: 0.6772\n","Epoch 61/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하여 바라옵건대, 상소(上疏)하여 상고하여 아뢰기를,\n","\"이 사람은 반드시 사이에 있었으니, 이것을 아뢰다\n","의정부에서 아뢰기를,\n","\"이 사람은 임금이 말하기를, ‘고을의 각 고을의 성을 일으키고 돌아왔으나, 이는 이름을 인도하여 아뢰기를,\n","\"성상의 의논을 인도하여 아뢰기를,\n","\"이 ㅇ\n","\n","2364/2364 - 272s - loss: 0.9945 - accuracy: 0.6779\n","Epoch 62/100\n","2364/2364 - 270s - loss: 0.9906 - accuracy: 0.6801\n","Epoch 63/100\n","2364/2364 - 270s - loss: 0.9874 - accuracy: 0.6808\n","Epoch 64/100\n","2364/2364 - 270s - loss: 0.9834 - accuracy: 0.6817\n","Epoch 65/100\n","2364/2364 - 270s - loss: 0.9804 - accuracy: 0.6828\n","Epoch 66/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하고, 이에 이미 다행하게 되면 일이 있었다. 임금이 말하기를,\n","\"이 사람이 있었다. 임금이 말하기를,\n","\"이 사람의 상소를 인도하여 아뢰기를,\n","\"신 등이 이르기를,\n","\"만약 대마도는 이러한 일을 맡아서 연훙한 일이 없었으나, 윤허하지 않고 있으니, 청컨대 이제 앞에 의하여 알\n","\n","2364/2364 - 272s - loss: 0.9771 - accuracy: 0.6839\n","Epoch 67/100\n","2364/2364 - 270s - loss: 0.9758 - accuracy: 0.6841\n","Epoch 68/100\n","2364/2364 - 270s - loss: 0.9714 - accuracy: 0.6859\n","Epoch 69/100\n","2364/2364 - 270s - loss: 0.9699 - accuracy: 0.6862\n","Epoch 70/100\n","2364/2364 - 270s - loss: 0.9658 - accuracy: 0.6871\n","Epoch 71/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하여 그대로 따랐다.경상도 등을 아뢰다\n","상왕이 사신에게 말하기를,\n","\"이보다 큰 곳을 정지하기를,\n","\"이보다 큰 곳이 없었으므로 나와 같이 없어질 수 없는데, 이를 주다\n","의정부에서 상소하기를,\n","\"이보다 큰 곳을 정지하기를 의심하고 있었는데, 지금 남을 것이다. 이제 상(喪)에 ㅇ\n","\n","2364/2364 - 272s - loss: 0.9634 - accuracy: 0.6882\n","Epoch 72/100\n","2364/2364 - 270s - loss: 0.9626 - accuracy: 0.6882\n","Epoch 73/100\n","2364/2364 - 270s - loss: 0.9582 - accuracy: 0.6893\n","Epoch 74/100\n","2364/2364 - 270s - loss: 0.9563 - accuracy: 0.6894\n","Epoch 75/100\n","2364/2364 - 270s - loss: 0.9539 - accuracy: 0.6913\n","Epoch 76/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하겠습니다. 이를 금하게 하다가 집에 있으면 지금 아니라 이를 만들어 보내어 이를 만들어 보내어 이를 만약 관찰사(咸吉道都節制使) 윤장(印章)·정하여 인명하면서 군사를 가지고 있으니, 청컨대 이제부터는 이직(遞職)하여 아뢰기를,\n","\"이제 이미 전하께서 이를 주다\n","정사(慶事)가 만약 그 인ㅇ\n","\n","2364/2364 - 272s - loss: 0.9535 - accuracy: 0.6909\n","Epoch 77/100\n","2364/2364 - 270s - loss: 0.9502 - accuracy: 0.6919\n","Epoch 78/100\n","2364/2364 - 270s - loss: 0.9518 - accuracy: 0.6904\n","Epoch 79/100\n","2364/2364 - 270s - loss: 0.9459 - accuracy: 0.6932\n","Epoch 80/100\n","2364/2364 - 269s - loss: 0.9433 - accuracy: 0.6941\n","Epoch 81/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하다가 중국 종사를 보고 대장궁에 나아가 그 중에 있었으나, 이미 전에 의거하여 전하께서 아뢰기를,\n","\"전일의 의논을 거느리고 돌아간 공신이 불을 드리는 것은 이미 공사를 보고 같은 것을 몹아서 임금을 입었으나, 이미 종사를 보고 대장군의 집에 있었으나 윤허하지 않ㅇ\n","\n","2364/2364 - 272s - loss: 0.9425 - accuracy: 0.6940\n","Epoch 82/100\n","2364/2364 - 270s - loss: 0.9436 - accuracy: 0.6937\n","Epoch 83/100\n","2364/2364 - 272s - loss: 0.9405 - accuracy: 0.6945\n","Epoch 84/100\n","2364/2364 - 270s - loss: 0.9372 - accuracy: 0.6959\n","Epoch 85/100\n","2364/2364 - 268s - loss: 0.9354 - accuracy: 0.6963\n","Epoch 86/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하여, 일이 있으니, 청컨대 그 죄를 주고, 인사(人事)를 올리는 것이 없습니다. 그러나, 오직 관가(三文理)로 하여금 임금이 상소하여 사신에게 전지하기를,\n","\"신이 임금이 있었다. 임금이 상성(宮城)을 정하여 일어나 전하께서 상소하여 사신에게 장숙주(申叔舟)에서 일찍이 각기 그 공이 \n","\n","2364/2364 - 272s - loss: 0.9354 - accuracy: 0.6957\n","Epoch 87/100\n","2364/2364 - 271s - loss: 0.9322 - accuracy: 0.6968\n","Epoch 88/100\n","2364/2364 - 271s - loss: 0.9318 - accuracy: 0.6971\n","Epoch 89/100\n","2364/2364 - 271s - loss: 0.9336 - accuracy: 0.6964\n","Epoch 90/100\n","2364/2364 - 271s - loss: 0.9294 - accuracy: 0.6979\n","Epoch 91/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하였으니, 일찍이 일을 무엇이 있었다. 임금이 말하기를,\n","\"정성을 인송하게 하다\n","임금이 말하기를,\n","\"이제부터 그 죄를 내렸다. 임금이 말하기를,\n","\"이제부터 어려운 것이 없습니다. 신이 임금이 이를 비록 일으켜든 중일에 가서 주었다.상왕이 불을 다시 성하게 여기어 성서\n","\n","2364/2364 - 273s - loss: 0.9289 - accuracy: 0.6981\n","Epoch 92/100\n","2364/2364 - 272s - loss: 0.9283 - accuracy: 0.6979\n","Epoch 93/100\n","2364/2364 - 272s - loss: 0.9259 - accuracy: 0.6989\n","Epoch 94/100\n","2364/2364 - 272s - loss: 0.9252 - accuracy: 0.6992\n","Epoch 95/100\n","2364/2364 - 272s - loss: 0.9245 - accuracy: 0.6994\n","Epoch 96/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하였다. 임금이 말하기를,\n","\"정상이 들어온 자에게 정지하고, 이어서 상언(上言)하여 정하고, 또 정진수가 처음에 이르렀으니, 다음에는 아래에 있는 자가 있으면 마땅히 윤망한 것이 아니라, 이에 있어서 상언(上言)하여 상언(上言)하여 상언(上言)하여 상언(上言)하여 상언(上言)하여 정부에 \n","\n","2364/2364 - 273s - loss: 0.9235 - accuracy: 0.6991\n","Epoch 97/100\n","2364/2364 - 271s - loss: 0.9234 - accuracy: 0.6989\n","Epoch 98/100\n","2364/2364 - 271s - loss: 0.9217 - accuracy: 0.6998\n","Epoch 99/100\n","2364/2364 - 272s - loss: 0.9215 - accuracy: 0.7000\n","Epoch 100/100\n","\n","태조 이성계 선대의 가계. 목조 이안사가 전주에서 삼척·의주를 거쳐 알동에 정착하다 하여, 일이 있으면, 중국의 음사운의 청한 것은 아뢰기를,\n","\"각도의 아들을 보내어 여러 신하들이 이르기를, ‘군사의 임금이 말하기를,\n","\"이박한 그렇게 한 것은 아뢰기를,\n","\"각도에 이르렀던 것이 없습니다. 그러나 이에 가서 수령을 감동하다\n","사헌부에서 계하기를,\n","\"원산군(楊根\n","\n","2364/2364 - 274s - loss: 0.9206 - accuracy: 0.6999\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"i2PIJeXRvEw-","colab_type":"code","outputId":"9d2d26bd-2645-4330-eb4c-ef9276844bd0","executionInfo":{"status":"ok","timestamp":1565863014452,"user_tz":-540,"elapsed":2109,"user":{"displayName":"Hwanhee Kim","photoUrl":"https://lh6.googleusercontent.com/-nodxsDvEvZo/AAAAAAAAAAI/AAAAAAAABHE/Ybrj2myvr5Q/s64/photo.jpg","userId":"04863080312902369470"}},"colab":{"base_uri":"https://localhost:8080/","height":143}},"source":["# 7.51 임의의 문장을 사용한 생성 결과 확인\n","from tensorflow.keras.preprocessing.sequence import pad_sequences\n","test_sentence = '동헌에 나가 공무를 본 후 활 십오 순을 쏘았다'\n","test_sentence = jamotools.split_syllables(test_sentence)\n","\n","next_chars = 300\n","for _ in range(next_chars):\n"," test_text_X = test_sentence[-seq_length:]\n"," test_text_X = np.array([char2idx[c] if c in char2idx else char2idx['UNK'] for c in test_text_X])\n"," test_text_X = pad_sequences([test_text_X], maxlen=seq_length, padding='pre', value=char2idx['UNK'])\n"," \n"," output_idx = model.predict_classes(test_text_X)\n"," test_sentence += idx2char[output_idx[0]]\n"," \n","\n","print(jamotools.join_jamos(test_sentence))"],"execution_count":0,"outputs":[{"output_type":"stream","text":["동헌에 나가 공무를 본 후 활 십오 순을 쏘았다. 임금이 말하기를,\n","\"이보다 큰 공상은 그 집에 돌아오다\n","정사를 보았다. 임금이 말하기를,\n","\"이방성을 아뢰다\n","함길도 감사가 이미 나라를 행하였다.상왕이 그 사람을 금하다\n","임금이 말하기를,\n","\"이보다 큰 공상은 그 집에 돌아온다. 【모든 것을 보내어 여러 관원은 농산ㄱ\n"],"name":"stdout"}]}]} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 『시작하세요! 텐서플로 2.0 프로그래밍』 예제 코드 2 | 3 | 기초 이론부터 실전 예제까지 한번에 끝내는 머신러닝, 딥러닝 핵심 가이드 4 | 5 | 예제 파일 깃허브 저장소입니다. 6 | 7 | ![]() 8 | 9 | [출판사 페이지 링크]() 10 | 11 | 12 | 13 | ## 설치법 14 | 15 | 예제 코드를 다운받은 후 압축을 해제한 폴더에서 아래 명령으로 필요 라이브러리를 설치 후 주피터 노트북에서 실행합니다. 16 | 17 | ``` 18 | pip install -r requirements.txt 19 | ``` 20 | 21 | 22 | 23 | ## 주요 수정 사항 24 | 25 | - [2020.02.01] 257p. 예제 8.8에서 캐글에서 데이터세트를 받아오는 부분이 캐글측의 데이터 구조 변경으로 수정되었습니다. [구글 코랩](), [깃허브]() 26 | 27 | - [2020.04.08] 263p. 예제 8.16의 OOM(Out Of Memory) 발생 문제. 구글 코랩이 [유료 버전]()을 런칭하면서 대용량 RAM 모드를 무료 버전에서 지원하지 않기 때문에 발생한 문제입니다. 해당 부분을 수정한 노트북 파일을 [코랩](https://colab.research.google.com/drive/1oA-qEqoYr-NA4jxQ4SneTPv6NJffEzXQ)과 [깃허브](https://github.com/wikibook/tf2/blob/master/Chapter8_20200408%EC%88%98%EC%A0%95.ipynb)에 올려놓았습니다. 28 | 29 | 30 | ## 주의 사항 31 | 32 | - [2020.05.30] 현재 텐서플로 최신 버전에서 model.fit(), model.predict() 함수의 실행 속도가 느린 문제가 있습니다. 10장 강화학습에서는 한 게임에 몇백 번의 model.predict() 함수를 실행하기 때문에 속도가 문제가 될 수 있습니다. 텐서플로 임포트 후 즉시 실행 모드(eager execution)를 비활성화하면 일단 문제를 해결할 수 있습니다. 텐서플로 측에서 문제를 고치면 해당 내용을 삭제하도록 하겠습니다. 33 | ``` 34 | import tensorflow as tf 35 | tf.compat.v1.disable_eager_execution() 36 | ``` 37 | [관련 버그 이슈 링크]() 38 | 39 | 40 | ## 기타 41 | 42 | [구글 코랩]()에서도 예제 파일을 이용하실 수 있습니다. 43 | 44 | 버그, 개선 의견은 이슈(Issues)에 남겨주세요. 45 | 46 | [![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fwikibook%2Ftf2)](https://hits.seeyoufarm.com) 47 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | gym==0.15.4 2 | gym_2048==0.2.6 3 | imageio==2.6.1 4 | ipython==7.11.0 5 | jamotools==0.1.10 6 | keras==2.3.1 7 | matplotlib==3.1.2 8 | numpy==1.18.0 9 | pandas==0.25.3 10 | Pillow==6.2.1 11 | pyvirtualdisplay==0.2.5 12 | scikit_learn==0.22 13 | scipy==1.4.1 14 | seaborn==0.9.0 15 | tensorflow==2.0.1 16 | tensorflow_datasets==1.3.2 17 | tensorflow_hub==0.7.0 18 | -------------------------------------------------------------------------------- /tf2_book.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wikibook/tf2/308588b05096e38f8b3acca5217a81fd0bc5e470/tf2_book.jpg --------------------------------------------------------------------------------