├── .gitignore
├── LICENSE
├── README.md
└── notebooks
├── deep_net.ipynb
├── deep_net_DEMO.ipynb
├── lenet.ipynb
├── lstm.ipynb
├── shallow_net.ipynb
└── shallow_net_DEMO.ipynb
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | env/
12 | build/
13 | develop-eggs/
14 | dist/
15 | downloads/
16 | eggs/
17 | .eggs/
18 | lib/
19 | lib64/
20 | parts/
21 | sdist/
22 | var/
23 | *.egg-info/
24 | .installed.cfg
25 | *.egg
26 |
27 | # PyInstaller
28 | # Usually these files are written by a python script from a template
29 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
30 | *.manifest
31 | *.spec
32 |
33 | # Installer logs
34 | pip-log.txt
35 | pip-delete-this-directory.txt
36 |
37 | # Unit test / coverage reports
38 | htmlcov/
39 | .tox/
40 | .coverage
41 | .coverage.*
42 | .cache
43 | nosetests.xml
44 | coverage.xml
45 | *,cover
46 | .hypothesis/
47 |
48 | # Translations
49 | *.mo
50 | *.pot
51 |
52 | # Django stuff:
53 | *.log
54 | local_settings.py
55 |
56 | # Flask stuff:
57 | instance/
58 | .webassets-cache
59 |
60 | # Scrapy stuff:
61 | .scrapy
62 |
63 | # Sphinx documentation
64 | docs/_build/
65 |
66 | # PyBuilder
67 | target/
68 |
69 | # IPython Notebook
70 | .ipynb_checkpoints
71 |
72 | # pyenv
73 | .python-version
74 |
75 | # celery beat schedule file
76 | celerybeat-schedule
77 |
78 | # dotenv
79 | .env
80 |
81 | # virtualenv
82 | venv/
83 | ENV/
84 |
85 | # Spyder project settings
86 | .spyderproject
87 |
88 | # Rope project settings
89 | .ropeproject
90 |
91 | \.DS_Store
92 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # TensorFlow 2
2 |
3 | This repository is for TensorFlow 2.x Jupyter notebooks. They are intended for use within [Colab](https://colab.research.google.com), primarily for instructional purposes.
4 |
5 | Simply because people enjoy colourful visuals, here's a myopic trilobite created by Aglae Bassens, a co-author of the book [Deep Learning Illustrated](https://deeplearningillustrated.com):
6 |
7 | 
8 |
9 |
--------------------------------------------------------------------------------
/notebooks/deep_net.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "deep_net.ipynb",
7 | "provenance": [],
8 | "include_colab_link": true
9 | },
10 | "language_info": {
11 | "codemirror_mode": {
12 | "name": "ipython",
13 | "version": 3
14 | },
15 | "file_extension": ".py",
16 | "mimetype": "text/x-python",
17 | "name": "python",
18 | "nbconvert_exporter": "python",
19 | "pygments_lexer": "ipython3",
20 | "version": "3.6.5"
21 | },
22 | "kernelspec": {
23 | "name": "python3",
24 | "display_name": "Python 3"
25 | },
26 | "accelerator": "TPU"
27 | },
28 | "cells": [
29 | {
30 | "cell_type": "markdown",
31 | "metadata": {
32 | "id": "view-in-github",
33 | "colab_type": "text"
34 | },
35 | "source": [
36 | "
"
37 | ]
38 | },
39 | {
40 | "cell_type": "markdown",
41 | "metadata": {
42 | "id": "joI9Ck_HEEfQ",
43 | "colab_type": "text"
44 | },
45 | "source": [
46 | "# Deep Neural Net (in TensorFlow 2)"
47 | ]
48 | },
49 | {
50 | "cell_type": "markdown",
51 | "metadata": {
52 | "id": "eoM32EDzEEfR",
53 | "colab_type": "text"
54 | },
55 | "source": [
56 | "For classifying MNIST digits. \n",
57 | "\n",
58 | "_Remember to change your Runtime to GPU or TPU._"
59 | ]
60 | },
61 | {
62 | "cell_type": "markdown",
63 | "metadata": {
64 | "id": "lgNqpXcGEEfS",
65 | "colab_type": "text"
66 | },
67 | "source": [
68 | "#### Load dependencies"
69 | ]
70 | },
71 | {
72 | "cell_type": "code",
73 | "metadata": {
74 | "id": "gTGmqhLMFsx7",
75 | "colab_type": "code",
76 | "outputId": "a1747ae7-a801-44d7-90bd-fa667f700ce7",
77 | "colab": {
78 | "base_uri": "https://localhost:8080/",
79 | "height": 173
80 | }
81 | },
82 | "source": [
83 | "!pip freeze | grep tensorflow"
84 | ],
85 | "execution_count": 1,
86 | "outputs": [
87 | {
88 | "output_type": "stream",
89 | "text": [
90 | "tensorflow==2.2.0rc2\n",
91 | "tensorflow-addons==0.8.3\n",
92 | "tensorflow-datasets==2.1.0\n",
93 | "tensorflow-estimator==2.2.0rc0\n",
94 | "tensorflow-gcs-config==2.1.8\n",
95 | "tensorflow-hub==0.8.0\n",
96 | "tensorflow-metadata==0.21.1\n",
97 | "tensorflow-privacy==0.2.2\n",
98 | "tensorflow-probability==0.9.0\n"
99 | ],
100 | "name": "stdout"
101 | }
102 | ]
103 | },
104 | {
105 | "cell_type": "code",
106 | "metadata": {
107 | "id": "d3sEySBYEEfS",
108 | "colab_type": "code",
109 | "colab": {}
110 | },
111 | "source": [
112 | "import tensorflow as tf\n",
113 | "from tensorflow import keras"
114 | ],
115 | "execution_count": 0,
116 | "outputs": []
117 | },
118 | {
119 | "cell_type": "markdown",
120 | "metadata": {
121 | "id": "zo7uccB7EEfW",
122 | "colab_type": "text"
123 | },
124 | "source": [
125 | "#### Load data"
126 | ]
127 | },
128 | {
129 | "cell_type": "code",
130 | "metadata": {
131 | "id": "tEARWdhNEEfW",
132 | "colab_type": "code",
133 | "outputId": "947820a5-bef5-4043-f28a-b8c286ccd229",
134 | "colab": {
135 | "base_uri": "https://localhost:8080/",
136 | "height": 52
137 | }
138 | },
139 | "source": [
140 | "(X_train, y_train), (X_valid, y_valid) = keras.datasets.mnist.load_data()"
141 | ],
142 | "execution_count": 3,
143 | "outputs": [
144 | {
145 | "output_type": "stream",
146 | "text": [
147 | "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n",
148 | "11493376/11490434 [==============================] - 0s 0us/step\n"
149 | ],
150 | "name": "stdout"
151 | }
152 | ]
153 | },
154 | {
155 | "cell_type": "markdown",
156 | "metadata": {
157 | "id": "hPqUUAWKEEfY",
158 | "colab_type": "text"
159 | },
160 | "source": [
161 | "#### Preprocess data"
162 | ]
163 | },
164 | {
165 | "cell_type": "code",
166 | "metadata": {
167 | "id": "s5sd9UQeEEfZ",
168 | "colab_type": "code",
169 | "colab": {}
170 | },
171 | "source": [
172 | "X_train = X_train.reshape(60000, 784).astype('float32')\n",
173 | "X_valid = X_valid.reshape(10000, 784).astype('float32')"
174 | ],
175 | "execution_count": 0,
176 | "outputs": []
177 | },
178 | {
179 | "cell_type": "code",
180 | "metadata": {
181 | "id": "A5RfNSUfEEfb",
182 | "colab_type": "code",
183 | "colab": {}
184 | },
185 | "source": [
186 | "X_train /= 255\n",
187 | "X_valid /= 255"
188 | ],
189 | "execution_count": 0,
190 | "outputs": []
191 | },
192 | {
193 | "cell_type": "code",
194 | "metadata": {
195 | "id": "rgktXQNiEEfc",
196 | "colab_type": "code",
197 | "colab": {}
198 | },
199 | "source": [
200 | "n_classes = 10\n",
201 | "y_train = keras.utils.to_categorical(y_train, n_classes)\n",
202 | "y_valid = keras.utils.to_categorical(y_valid, n_classes)"
203 | ],
204 | "execution_count": 0,
205 | "outputs": []
206 | },
207 | {
208 | "cell_type": "markdown",
209 | "metadata": {
210 | "id": "JAU1Cyy1EEfe",
211 | "colab_type": "text"
212 | },
213 | "source": [
214 | "#### Design neural network architecture"
215 | ]
216 | },
217 | {
218 | "cell_type": "code",
219 | "metadata": {
220 | "id": "GIVzBGIfEEfh",
221 | "colab_type": "code",
222 | "colab": {}
223 | },
224 | "source": [
225 | "model = keras.models.Sequential([\n",
226 | " \n",
227 | " keras.layers.Dense(64, activation='relu', input_shape=(784,)),\n",
228 | " \n",
229 | " keras.layers.Dense(64, activation='relu'),\n",
230 | " \n",
231 | " keras.layers.Dense(64, activation='relu'),\n",
232 | " keras.layers.Dropout(0.2),\n",
233 | " \n",
234 | " keras.layers.Dense(10, activation='softmax'),\n",
235 | "])"
236 | ],
237 | "execution_count": 0,
238 | "outputs": []
239 | },
240 | {
241 | "cell_type": "code",
242 | "metadata": {
243 | "id": "OJIwNRLNEEfj",
244 | "colab_type": "code",
245 | "outputId": "91f81122-7305-4d82-93c3-6942432381a0",
246 | "colab": {
247 | "base_uri": "https://localhost:8080/",
248 | "height": 330
249 | }
250 | },
251 | "source": [
252 | "model.summary()"
253 | ],
254 | "execution_count": 0,
255 | "outputs": [
256 | {
257 | "output_type": "stream",
258 | "text": [
259 | "Model: \"sequential\"\n",
260 | "_________________________________________________________________\n",
261 | "Layer (type) Output Shape Param # \n",
262 | "=================================================================\n",
263 | "dense (Dense) (None, 64) 50240 \n",
264 | "_________________________________________________________________\n",
265 | "dense_1 (Dense) (None, 64) 4160 \n",
266 | "_________________________________________________________________\n",
267 | "dense_2 (Dense) (None, 64) 4160 \n",
268 | "_________________________________________________________________\n",
269 | "dropout (Dropout) (None, 64) 0 \n",
270 | "_________________________________________________________________\n",
271 | "dense_3 (Dense) (None, 10) 650 \n",
272 | "=================================================================\n",
273 | "Total params: 59,210\n",
274 | "Trainable params: 59,210\n",
275 | "Non-trainable params: 0\n",
276 | "_________________________________________________________________\n"
277 | ],
278 | "name": "stdout"
279 | }
280 | ]
281 | },
282 | {
283 | "cell_type": "markdown",
284 | "metadata": {
285 | "id": "o2hYUMTzEEfp",
286 | "colab_type": "text"
287 | },
288 | "source": [
289 | "#### Configure model"
290 | ]
291 | },
292 | {
293 | "cell_type": "code",
294 | "metadata": {
295 | "id": "ZANJM3AeEEfq",
296 | "colab_type": "code",
297 | "colab": {}
298 | },
299 | "source": [
300 | "model.compile(loss='categorical_crossentropy', optimizer='nadam', metrics=['accuracy'])"
301 | ],
302 | "execution_count": 0,
303 | "outputs": []
304 | },
305 | {
306 | "cell_type": "markdown",
307 | "metadata": {
308 | "id": "zq4UBoc5EEfs",
309 | "colab_type": "text"
310 | },
311 | "source": [
312 | "#### Train!"
313 | ]
314 | },
315 | {
316 | "cell_type": "code",
317 | "metadata": {
318 | "id": "ln4J2UMLEEfu",
319 | "colab_type": "code",
320 | "outputId": "8df30660-bf98-42ac-bab7-f53b42b52496",
321 | "colab": {
322 | "base_uri": "https://localhost:8080/",
323 | "height": 402
324 | }
325 | },
326 | "source": [
327 | "model.fit(X_train, y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_valid, y_valid))"
328 | ],
329 | "execution_count": 9,
330 | "outputs": [
331 | {
332 | "output_type": "stream",
333 | "text": [
334 | "Epoch 1/10\n",
335 | "469/469 [==============================] - 2s 4ms/step - loss: 0.4559 - accuracy: 0.8644 - val_loss: 0.1757 - val_accuracy: 0.9467\n",
336 | "Epoch 2/10\n",
337 | "469/469 [==============================] - 2s 3ms/step - loss: 0.1835 - accuracy: 0.9469 - val_loss: 0.1304 - val_accuracy: 0.9604\n",
338 | "Epoch 3/10\n",
339 | "469/469 [==============================] - 2s 3ms/step - loss: 0.1367 - accuracy: 0.9600 - val_loss: 0.1132 - val_accuracy: 0.9641\n",
340 | "Epoch 4/10\n",
341 | "469/469 [==============================] - 2s 3ms/step - loss: 0.1090 - accuracy: 0.9681 - val_loss: 0.0987 - val_accuracy: 0.9690\n",
342 | "Epoch 5/10\n",
343 | "469/469 [==============================] - 2s 3ms/step - loss: 0.0908 - accuracy: 0.9727 - val_loss: 0.0940 - val_accuracy: 0.9716\n",
344 | "Epoch 6/10\n",
345 | "469/469 [==============================] - 2s 3ms/step - loss: 0.0783 - accuracy: 0.9756 - val_loss: 0.0920 - val_accuracy: 0.9711\n",
346 | "Epoch 7/10\n",
347 | "469/469 [==============================] - 2s 3ms/step - loss: 0.0675 - accuracy: 0.9794 - val_loss: 0.0871 - val_accuracy: 0.9720\n",
348 | "Epoch 8/10\n",
349 | "469/469 [==============================] - 2s 3ms/step - loss: 0.0603 - accuracy: 0.9815 - val_loss: 0.0967 - val_accuracy: 0.9707\n",
350 | "Epoch 9/10\n",
351 | "469/469 [==============================] - 2s 3ms/step - loss: 0.0522 - accuracy: 0.9836 - val_loss: 0.0923 - val_accuracy: 0.9731\n",
352 | "Epoch 10/10\n",
353 | "469/469 [==============================] - 2s 3ms/step - loss: 0.0467 - accuracy: 0.9855 - val_loss: 0.0828 - val_accuracy: 0.9761\n"
354 | ],
355 | "name": "stdout"
356 | },
357 | {
358 | "output_type": "execute_result",
359 | "data": {
360 | "text/plain": [
361 | ""
362 | ]
363 | },
364 | "metadata": {
365 | "tags": []
366 | },
367 | "execution_count": 9
368 | }
369 | ]
370 | },
371 | {
372 | "cell_type": "markdown",
373 | "metadata": {
374 | "id": "yFJm3TV_mrmH",
375 | "colab_type": "text"
376 | },
377 | "source": [
378 | "#### Performing Inference"
379 | ]
380 | },
381 | {
382 | "cell_type": "code",
383 | "metadata": {
384 | "id": "sosuJg5cmnaU",
385 | "colab_type": "code",
386 | "colab": {}
387 | },
388 | "source": [
389 | "valid_0 = X_valid[0].reshape(1, 784)"
390 | ],
391 | "execution_count": 0,
392 | "outputs": []
393 | },
394 | {
395 | "cell_type": "code",
396 | "metadata": {
397 | "id": "V2yQfSRBmxIk",
398 | "colab_type": "code",
399 | "outputId": "3ca1bef6-73f8-4f27-a741-6108cbad357c",
400 | "colab": {
401 | "base_uri": "https://localhost:8080/",
402 | "height": 69
403 | }
404 | },
405 | "source": [
406 | "model.predict(valid_0)"
407 | ],
408 | "execution_count": 11,
409 | "outputs": [
410 | {
411 | "output_type": "execute_result",
412 | "data": {
413 | "text/plain": [
414 | "array([[1.28185818e-08, 4.61016998e-06, 1.29478713e-06, 8.06649132e-06,\n",
415 | " 1.30292142e-08, 1.17521665e-07, 1.21258364e-12, 9.99976039e-01,\n",
416 | " 1.06380096e-08, 9.72801445e-06]], dtype=float32)"
417 | ]
418 | },
419 | "metadata": {
420 | "tags": []
421 | },
422 | "execution_count": 11
423 | }
424 | ]
425 | },
426 | {
427 | "cell_type": "code",
428 | "metadata": {
429 | "id": "0MOL4f-smzKw",
430 | "colab_type": "code",
431 | "colab": {}
432 | },
433 | "source": [
434 | "import numpy as np"
435 | ],
436 | "execution_count": 0,
437 | "outputs": []
438 | },
439 | {
440 | "cell_type": "code",
441 | "metadata": {
442 | "id": "X3wvk6OWm2oz",
443 | "colab_type": "code",
444 | "colab": {
445 | "base_uri": "https://localhost:8080/",
446 | "height": 34
447 | },
448 | "outputId": "f409739f-9c79-416f-ec25-71f7a8f105b2"
449 | },
450 | "source": [
451 | "np.argmax(model.predict(valid_0), axis=-1)"
452 | ],
453 | "execution_count": 13,
454 | "outputs": [
455 | {
456 | "output_type": "execute_result",
457 | "data": {
458 | "text/plain": [
459 | "array([7])"
460 | ]
461 | },
462 | "metadata": {
463 | "tags": []
464 | },
465 | "execution_count": 13
466 | }
467 | ]
468 | },
469 | {
470 | "cell_type": "code",
471 | "metadata": {
472 | "id": "81RbHNnLwgpE",
473 | "colab_type": "code",
474 | "colab": {}
475 | },
476 | "source": [
477 | ""
478 | ],
479 | "execution_count": 0,
480 | "outputs": []
481 | }
482 | ]
483 | }
--------------------------------------------------------------------------------
/notebooks/deep_net_DEMO.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "deep_net.ipynb",
7 | "provenance": [],
8 | "include_colab_link": true
9 | },
10 | "language_info": {
11 | "codemirror_mode": {
12 | "name": "ipython",
13 | "version": 3
14 | },
15 | "file_extension": ".py",
16 | "mimetype": "text/x-python",
17 | "name": "python",
18 | "nbconvert_exporter": "python",
19 | "pygments_lexer": "ipython3",
20 | "version": "3.6.5"
21 | },
22 | "kernelspec": {
23 | "name": "python3",
24 | "display_name": "Python 3"
25 | },
26 | "accelerator": "TPU"
27 | },
28 | "cells": [
29 | {
30 | "cell_type": "markdown",
31 | "metadata": {
32 | "id": "view-in-github",
33 | "colab_type": "text"
34 | },
35 | "source": [
36 | "
"
37 | ]
38 | },
39 | {
40 | "cell_type": "markdown",
41 | "metadata": {
42 | "id": "joI9Ck_HEEfQ",
43 | "colab_type": "text"
44 | },
45 | "source": [
46 | "# Deep Neural Net (in TensorFlow 2) DEMO"
47 | ]
48 | },
49 | {
50 | "cell_type": "markdown",
51 | "metadata": {
52 | "id": "eoM32EDzEEfR",
53 | "colab_type": "text"
54 | },
55 | "source": [
56 | "For classifying MNIST digits. \n",
57 | "\n",
58 | "_Remember to change your Runtime to GPU or TPU._"
59 | ]
60 | },
61 | {
62 | "cell_type": "markdown",
63 | "metadata": {
64 | "id": "lgNqpXcGEEfS",
65 | "colab_type": "text"
66 | },
67 | "source": [
68 | "#### Load dependencies"
69 | ]
70 | },
71 | {
72 | "cell_type": "code",
73 | "metadata": {
74 | "id": "gTGmqhLMFsx7",
75 | "colab_type": "code",
76 | "colab": {}
77 | },
78 | "source": [
79 | "!pip freeze | grep tensorflow"
80 | ],
81 | "execution_count": 0,
82 | "outputs": []
83 | },
84 | {
85 | "cell_type": "code",
86 | "metadata": {
87 | "id": "d3sEySBYEEfS",
88 | "colab_type": "code",
89 | "colab": {}
90 | },
91 | "source": [
92 | "import tensorflow as tf\n",
93 | "from tensorflow import keras"
94 | ],
95 | "execution_count": 0,
96 | "outputs": []
97 | },
98 | {
99 | "cell_type": "markdown",
100 | "metadata": {
101 | "id": "zo7uccB7EEfW",
102 | "colab_type": "text"
103 | },
104 | "source": [
105 | "#### Load data"
106 | ]
107 | },
108 | {
109 | "cell_type": "code",
110 | "metadata": {
111 | "id": "tEARWdhNEEfW",
112 | "colab_type": "code",
113 | "colab": {}
114 | },
115 | "source": [
116 | "(X_train, y_train), (X_valid, y_valid) = keras.datasets.mnist.load_data()"
117 | ],
118 | "execution_count": 0,
119 | "outputs": []
120 | },
121 | {
122 | "cell_type": "markdown",
123 | "metadata": {
124 | "id": "hPqUUAWKEEfY",
125 | "colab_type": "text"
126 | },
127 | "source": [
128 | "#### Preprocess data"
129 | ]
130 | },
131 | {
132 | "cell_type": "code",
133 | "metadata": {
134 | "id": "s5sd9UQeEEfZ",
135 | "colab_type": "code",
136 | "colab": {}
137 | },
138 | "source": [
139 | "X_train = X_train.reshape(60000, 784).astype('float32')\n",
140 | "X_valid = X_valid.reshape(10000, 784).astype('float32')"
141 | ],
142 | "execution_count": 0,
143 | "outputs": []
144 | },
145 | {
146 | "cell_type": "code",
147 | "metadata": {
148 | "id": "A5RfNSUfEEfb",
149 | "colab_type": "code",
150 | "colab": {}
151 | },
152 | "source": [
153 | "X_train /= 255\n",
154 | "X_valid /= 255"
155 | ],
156 | "execution_count": 0,
157 | "outputs": []
158 | },
159 | {
160 | "cell_type": "code",
161 | "metadata": {
162 | "id": "rgktXQNiEEfc",
163 | "colab_type": "code",
164 | "colab": {}
165 | },
166 | "source": [
167 | "n_classes = 10\n",
168 | "y_train = keras.utils.to_categorical(y_train, n_classes)\n",
169 | "y_valid = keras.utils.to_categorical(y_valid, n_classes)"
170 | ],
171 | "execution_count": 0,
172 | "outputs": []
173 | },
174 | {
175 | "cell_type": "markdown",
176 | "metadata": {
177 | "id": "JAU1Cyy1EEfe",
178 | "colab_type": "text"
179 | },
180 | "source": [
181 | "#### Design neural network architecture"
182 | ]
183 | },
184 | {
185 | "cell_type": "code",
186 | "metadata": {
187 | "id": "GIVzBGIfEEfh",
188 | "colab_type": "code",
189 | "colab": {}
190 | },
191 | "source": [
192 | "model = keras.models.Sequential([\n",
193 | " \n",
194 | " # CODE HERE\n",
195 | " \n",
196 | "])"
197 | ],
198 | "execution_count": 0,
199 | "outputs": []
200 | },
201 | {
202 | "cell_type": "code",
203 | "metadata": {
204 | "id": "OJIwNRLNEEfj",
205 | "colab_type": "code",
206 | "colab": {}
207 | },
208 | "source": [
209 | "model.summary()"
210 | ],
211 | "execution_count": 0,
212 | "outputs": []
213 | },
214 | {
215 | "cell_type": "markdown",
216 | "metadata": {
217 | "id": "o2hYUMTzEEfp",
218 | "colab_type": "text"
219 | },
220 | "source": [
221 | "#### Configure model"
222 | ]
223 | },
224 | {
225 | "cell_type": "code",
226 | "metadata": {
227 | "id": "ZANJM3AeEEfq",
228 | "colab_type": "code",
229 | "colab": {}
230 | },
231 | "source": [
232 | "# CODE HERE"
233 | ],
234 | "execution_count": 0,
235 | "outputs": []
236 | },
237 | {
238 | "cell_type": "markdown",
239 | "metadata": {
240 | "id": "zq4UBoc5EEfs",
241 | "colab_type": "text"
242 | },
243 | "source": [
244 | "#### Train!"
245 | ]
246 | },
247 | {
248 | "cell_type": "code",
249 | "metadata": {
250 | "id": "ln4J2UMLEEfu",
251 | "colab_type": "code",
252 | "colab": {}
253 | },
254 | "source": [
255 | "# CODE HERE"
256 | ],
257 | "execution_count": 0,
258 | "outputs": []
259 | },
260 | {
261 | "cell_type": "markdown",
262 | "metadata": {
263 | "id": "aBz0GotbxsOG",
264 | "colab_type": "text"
265 | },
266 | "source": [
267 | "## Performing Inference"
268 | ]
269 | },
270 | {
271 | "cell_type": "code",
272 | "metadata": {
273 | "id": "KM-s3bc0xv5l",
274 | "colab_type": "code",
275 | "colab": {}
276 | },
277 | "source": [
278 | "valid_0 = X_valid[0].reshape(1, 784)"
279 | ],
280 | "execution_count": 0,
281 | "outputs": []
282 | },
283 | {
284 | "cell_type": "code",
285 | "metadata": {
286 | "id": "cKriXm-rxzCi",
287 | "colab_type": "code",
288 | "colab": {}
289 | },
290 | "source": [
291 | "model.predict(valid_0)"
292 | ],
293 | "execution_count": 0,
294 | "outputs": []
295 | },
296 | {
297 | "cell_type": "code",
298 | "metadata": {
299 | "id": "Yo81ddzyx1gm",
300 | "colab_type": "code",
301 | "colab": {}
302 | },
303 | "source": [
304 | "import numpy as np"
305 | ],
306 | "execution_count": 0,
307 | "outputs": []
308 | },
309 | {
310 | "cell_type": "code",
311 | "metadata": {
312 | "id": "e9M2On5Tx2z6",
313 | "colab_type": "code",
314 | "colab": {}
315 | },
316 | "source": [
317 | "np.argmax(model.predict(valid_0), axis=-1)"
318 | ],
319 | "execution_count": 0,
320 | "outputs": []
321 | }
322 | ]
323 | }
--------------------------------------------------------------------------------
/notebooks/lenet.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "lenet.ipynb",
7 | "version": "0.3.2",
8 | "provenance": [],
9 | "include_colab_link": true
10 | },
11 | "language_info": {
12 | "codemirror_mode": {
13 | "name": "ipython",
14 | "version": 3
15 | },
16 | "file_extension": ".py",
17 | "mimetype": "text/x-python",
18 | "name": "python",
19 | "nbconvert_exporter": "python",
20 | "pygments_lexer": "ipython3",
21 | "version": "3.6.5"
22 | },
23 | "kernelspec": {
24 | "name": "python3",
25 | "display_name": "Python 3"
26 | },
27 | "accelerator": "TPU"
28 | },
29 | "cells": [
30 | {
31 | "cell_type": "markdown",
32 | "metadata": {
33 | "id": "view-in-github",
34 | "colab_type": "text"
35 | },
36 | "source": [
37 | "
"
38 | ]
39 | },
40 | {
41 | "cell_type": "markdown",
42 | "metadata": {
43 | "id": "qrQAHE0rTJ5J",
44 | "colab_type": "text"
45 | },
46 | "source": [
47 | "# Deep Convolutional Neural Net in TensorFlow 2.0"
48 | ]
49 | },
50 | {
51 | "cell_type": "markdown",
52 | "metadata": {
53 | "id": "vz26vnVkTJ5K",
54 | "colab_type": "text"
55 | },
56 | "source": [
57 | "LeNet-5 inspired model for classifying MNIST digits\n",
58 | "\n",
59 | "_Remember to change your Runtime to GPU or TPU._"
60 | ]
61 | },
62 | {
63 | "cell_type": "markdown",
64 | "metadata": {
65 | "id": "4oeaGj_bTJ5K",
66 | "colab_type": "text"
67 | },
68 | "source": [
69 | "#### Load dependencies"
70 | ]
71 | },
72 | {
73 | "cell_type": "code",
74 | "metadata": {
75 | "id": "jRCfDloJT7yz",
76 | "colab_type": "code",
77 | "colab": {
78 | "base_uri": "https://localhost:8080/",
79 | "height": 763
80 | },
81 | "outputId": "05e7ea1e-b7a4-4d57-b4cc-168c247c468c"
82 | },
83 | "source": [
84 | "pip install tensorflow==2.0.0-beta0"
85 | ],
86 | "execution_count": 1,
87 | "outputs": [
88 | {
89 | "output_type": "stream",
90 | "text": [
91 | "Collecting tensorflow==2.0.0-beta0\n",
92 | "\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/19/0d0c7f240db7bcd6b83783b9a89a67f38584d100e23ad5ae93114be92232/tensorflow-2.0.0b0-cp36-cp36m-manylinux1_x86_64.whl (87.9MB)\n",
93 | "\u001b[K |████████████████████████████████| 87.9MB 225kB/s \n",
94 | "\u001b[?25hRequirement already satisfied: keras-applications>=1.0.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta0) (1.0.8)\n",
95 | "Requirement already satisfied: gast>=0.2.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta0) (0.2.2)\n",
96 | "Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta0) (1.1.0)\n",
97 | "Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta0) (1.15.0)\n",
98 | "Collecting google-pasta>=0.1.6 (from tensorflow==2.0.0-beta0)\n",
99 | "\u001b[?25l Downloading https://files.pythonhosted.org/packages/d0/33/376510eb8d6246f3c30545f416b2263eee461e40940c2a4413c711bdf62d/google_pasta-0.1.7-py3-none-any.whl (52kB)\n",
100 | "\u001b[K |████████████████████████████████| 61kB 14.8MB/s \n",
101 | "\u001b[?25hRequirement already satisfied: numpy<2.0,>=1.14.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta0) (1.16.4)\n",
102 | "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta0) (1.1.0)\n",
103 | "Collecting tb-nightly<1.14.0a20190604,>=1.14.0a20190603 (from tensorflow==2.0.0-beta0)\n",
104 | "\u001b[?25l Downloading https://files.pythonhosted.org/packages/a4/96/571b875cd81dda9d5dfa1422a4f9d749e67c0a8d4f4f0b33a4e5f5f35e27/tb_nightly-1.14.0a20190603-py3-none-any.whl (3.1MB)\n",
105 | "\u001b[K |████████████████████████████████| 3.1MB 34.1MB/s \n",
106 | "\u001b[?25hCollecting wrapt>=1.11.1 (from tensorflow==2.0.0-beta0)\n",
107 | " Downloading https://files.pythonhosted.org/packages/67/b2/0f71ca90b0ade7fad27e3d20327c996c6252a2ffe88f50a95bba7434eda9/wrapt-1.11.1.tar.gz\n",
108 | "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta0) (1.12.0)\n",
109 | "Requirement already satisfied: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta0) (0.7.1)\n",
110 | "Collecting tf-estimator-nightly<1.14.0.dev2019060502,>=1.14.0.dev2019060501 (from tensorflow==2.0.0-beta0)\n",
111 | "\u001b[?25l Downloading https://files.pythonhosted.org/packages/32/dd/99c47dd007dcf10d63fd895611b063732646f23059c618a373e85019eb0e/tf_estimator_nightly-1.14.0.dev2019060501-py2.py3-none-any.whl (496kB)\n",
112 | "\u001b[K |████████████████████████████████| 501kB 40.7MB/s \n",
113 | "\u001b[?25hRequirement already satisfied: protobuf>=3.6.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta0) (3.7.1)\n",
114 | "Requirement already satisfied: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta0) (0.8.0)\n",
115 | "Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta0) (0.33.4)\n",
116 | "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.6->tensorflow==2.0.0-beta0) (2.8.0)\n",
117 | "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tb-nightly<1.14.0a20190604,>=1.14.0a20190603->tensorflow==2.0.0-beta0) (0.15.4)\n",
118 | "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tb-nightly<1.14.0a20190604,>=1.14.0a20190603->tensorflow==2.0.0-beta0) (3.1.1)\n",
119 | "Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.6/dist-packages (from tb-nightly<1.14.0a20190604,>=1.14.0a20190603->tensorflow==2.0.0-beta0) (41.0.1)\n",
120 | "Building wheels for collected packages: wrapt\n",
121 | " Building wheel for wrapt (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
122 | " Stored in directory: /root/.cache/pip/wheels/89/67/41/63cbf0f6ac0a6156588b9587be4db5565f8c6d8ccef98202fc\n",
123 | "Successfully built wrapt\n",
124 | "\u001b[31mERROR: thinc 6.12.1 has requirement wrapt<1.11.0,>=1.10.0, but you'll have wrapt 1.11.1 which is incompatible.\u001b[0m\n",
125 | "Installing collected packages: google-pasta, tb-nightly, wrapt, tf-estimator-nightly, tensorflow\n",
126 | " Found existing installation: wrapt 1.10.11\n",
127 | " Uninstalling wrapt-1.10.11:\n",
128 | " Successfully uninstalled wrapt-1.10.11\n",
129 | " Found existing installation: tensorflow 1.13.1\n",
130 | " Uninstalling tensorflow-1.13.1:\n",
131 | " Successfully uninstalled tensorflow-1.13.1\n",
132 | "Successfully installed google-pasta-0.1.7 tb-nightly-1.14.0a20190603 tensorflow-2.0.0b0 tf-estimator-nightly-1.14.0.dev2019060501 wrapt-1.11.1\n"
133 | ],
134 | "name": "stdout"
135 | }
136 | ]
137 | },
138 | {
139 | "cell_type": "code",
140 | "metadata": {
141 | "id": "RLLDzFaJTJ5L",
142 | "colab_type": "code",
143 | "colab": {}
144 | },
145 | "source": [
146 | "import tensorflow as tf\n",
147 | "from tensorflow import keras"
148 | ],
149 | "execution_count": 0,
150 | "outputs": []
151 | },
152 | {
153 | "cell_type": "markdown",
154 | "metadata": {
155 | "id": "thKzNKN_TJ5O",
156 | "colab_type": "text"
157 | },
158 | "source": [
159 | "#### Load data"
160 | ]
161 | },
162 | {
163 | "cell_type": "code",
164 | "metadata": {
165 | "id": "Syr8C6gOTJ5P",
166 | "colab_type": "code",
167 | "colab": {
168 | "base_uri": "https://localhost:8080/",
169 | "height": 52
170 | },
171 | "outputId": "2bb0738f-6156-40ef-fb14-49d8ae6d2604"
172 | },
173 | "source": [
174 | "(X_train, y_train), (X_valid, y_valid) = keras.datasets.mnist.load_data()"
175 | ],
176 | "execution_count": 3,
177 | "outputs": [
178 | {
179 | "output_type": "stream",
180 | "text": [
181 | "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n",
182 | "11493376/11490434 [==============================] - 0s 0us/step\n"
183 | ],
184 | "name": "stdout"
185 | }
186 | ]
187 | },
188 | {
189 | "cell_type": "markdown",
190 | "metadata": {
191 | "id": "fTNJnG1cTJ5R",
192 | "colab_type": "text"
193 | },
194 | "source": [
195 | "#### Preprocess data"
196 | ]
197 | },
198 | {
199 | "cell_type": "code",
200 | "metadata": {
201 | "id": "-3gWmfdaTJ5S",
202 | "colab_type": "code",
203 | "colab": {}
204 | },
205 | "source": [
206 | "X_train = X_train.reshape(60000, 28, 28, 1).astype('float32')\n",
207 | "X_valid = X_valid.reshape(10000, 28, 28, 1).astype('float32')"
208 | ],
209 | "execution_count": 0,
210 | "outputs": []
211 | },
212 | {
213 | "cell_type": "code",
214 | "metadata": {
215 | "id": "NTOqhUN3TJ5V",
216 | "colab_type": "code",
217 | "colab": {}
218 | },
219 | "source": [
220 | "X_train /= 255\n",
221 | "X_valid /= 255"
222 | ],
223 | "execution_count": 0,
224 | "outputs": []
225 | },
226 | {
227 | "cell_type": "code",
228 | "metadata": {
229 | "id": "SYnteIpgTJ5X",
230 | "colab_type": "code",
231 | "colab": {}
232 | },
233 | "source": [
234 | "n_classes = 10\n",
235 | "y_train = keras.utils.to_categorical(y_train, n_classes)\n",
236 | "y_valid = keras.utils.to_categorical(y_valid, n_classes)"
237 | ],
238 | "execution_count": 0,
239 | "outputs": []
240 | },
241 | {
242 | "cell_type": "markdown",
243 | "metadata": {
244 | "id": "dPFo1PufTJ5Z",
245 | "colab_type": "text"
246 | },
247 | "source": [
248 | "#### Design neural network architecture"
249 | ]
250 | },
251 | {
252 | "cell_type": "code",
253 | "metadata": {
254 | "id": "dHjiH8wcTJ5a",
255 | "colab_type": "code",
256 | "colab": {}
257 | },
258 | "source": [
259 | "model = keras.models.Sequential([\n",
260 | " \n",
261 | " keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),\n",
262 | " \n",
263 | " keras.layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),\n",
264 | " keras.layers.MaxPooling2D(pool_size=(2, 2)),\n",
265 | " keras.layers.Flatten(),\n",
266 | " \n",
267 | " keras.layers.Dense(128, activation='relu'),\n",
268 | " # keras.layers.BatchNormalization(),\n",
269 | " keras.layers.Dropout(0.2),\n",
270 | " \n",
271 | " keras.layers.Dense(10, activation='softmax'),\n",
272 | "])"
273 | ],
274 | "execution_count": 0,
275 | "outputs": []
276 | },
277 | {
278 | "cell_type": "code",
279 | "metadata": {
280 | "id": "JhSLQiWdTJ5c",
281 | "colab_type": "code",
282 | "colab": {
283 | "base_uri": "https://localhost:8080/",
284 | "height": 397
285 | },
286 | "outputId": "853f2d29-3d25-4d3d-f871-eefdb94e06d9"
287 | },
288 | "source": [
289 | "model.summary()"
290 | ],
291 | "execution_count": 8,
292 | "outputs": [
293 | {
294 | "output_type": "stream",
295 | "text": [
296 | "Model: \"sequential\"\n",
297 | "_________________________________________________________________\n",
298 | "Layer (type) Output Shape Param # \n",
299 | "=================================================================\n",
300 | "conv2d (Conv2D) (None, 26, 26, 32) 320 \n",
301 | "_________________________________________________________________\n",
302 | "conv2d_1 (Conv2D) (None, 24, 24, 64) 18496 \n",
303 | "_________________________________________________________________\n",
304 | "max_pooling2d (MaxPooling2D) (None, 12, 12, 64) 0 \n",
305 | "_________________________________________________________________\n",
306 | "flatten (Flatten) (None, 9216) 0 \n",
307 | "_________________________________________________________________\n",
308 | "dense (Dense) (None, 128) 1179776 \n",
309 | "_________________________________________________________________\n",
310 | "dropout (Dropout) (None, 128) 0 \n",
311 | "_________________________________________________________________\n",
312 | "dense_1 (Dense) (None, 10) 1290 \n",
313 | "=================================================================\n",
314 | "Total params: 1,199,882\n",
315 | "Trainable params: 1,199,882\n",
316 | "Non-trainable params: 0\n",
317 | "_________________________________________________________________\n"
318 | ],
319 | "name": "stdout"
320 | }
321 | ]
322 | },
323 | {
324 | "cell_type": "markdown",
325 | "metadata": {
326 | "id": "M9KCEWw3TJ5g",
327 | "colab_type": "text"
328 | },
329 | "source": [
330 | "#### Configure model"
331 | ]
332 | },
333 | {
334 | "cell_type": "code",
335 | "metadata": {
336 | "id": "1Y3V8nIxTJ5g",
337 | "colab_type": "code",
338 | "colab": {}
339 | },
340 | "source": [
341 | "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])"
342 | ],
343 | "execution_count": 0,
344 | "outputs": []
345 | },
346 | {
347 | "cell_type": "markdown",
348 | "metadata": {
349 | "id": "OX6ewIJETJ5i",
350 | "colab_type": "text"
351 | },
352 | "source": [
353 | "#### Train!"
354 | ]
355 | },
356 | {
357 | "cell_type": "code",
358 | "metadata": {
359 | "id": "6J1NjdvlTJ5j",
360 | "colab_type": "code",
361 | "colab": {
362 | "base_uri": "https://localhost:8080/",
363 | "height": 486
364 | },
365 | "outputId": "4f5e8996-6b86-4466-a04f-e93db814bf71"
366 | },
367 | "source": [
368 | "model.fit(X_train, y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_valid, y_valid))"
369 | ],
370 | "execution_count": 10,
371 | "outputs": [
372 | {
373 | "output_type": "stream",
374 | "text": [
375 | "WARNING: Logging before flag parsing goes to stderr.\n",
376 | "W0608 18:20:28.407932 140289758394240 deprecation.py:323] From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_grad.py:1250: add_dispatch_support..wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
377 | "Instructions for updating:\n",
378 | "Use tf.where in 2.0, which has the same broadcast rule as np.where\n"
379 | ],
380 | "name": "stderr"
381 | },
382 | {
383 | "output_type": "stream",
384 | "text": [
385 | "Train on 60000 samples, validate on 10000 samples\n",
386 | "Epoch 1/10\n",
387 | "60000/60000 [==============================] - 147s 2ms/sample - loss: 0.1724 - accuracy: 0.9470 - val_loss: 0.0495 - val_accuracy: 0.9844\n",
388 | "Epoch 2/10\n",
389 | "60000/60000 [==============================] - 146s 2ms/sample - loss: 0.0522 - accuracy: 0.9839 - val_loss: 0.0348 - val_accuracy: 0.9882\n",
390 | "Epoch 3/10\n",
391 | "60000/60000 [==============================] - 146s 2ms/sample - loss: 0.0337 - accuracy: 0.9894 - val_loss: 0.0320 - val_accuracy: 0.9897\n",
392 | "Epoch 4/10\n",
393 | "60000/60000 [==============================] - 146s 2ms/sample - loss: 0.0262 - accuracy: 0.9917 - val_loss: 0.0327 - val_accuracy: 0.9886\n",
394 | "Epoch 5/10\n",
395 | "60000/60000 [==============================] - 146s 2ms/sample - loss: 0.0193 - accuracy: 0.9936 - val_loss: 0.0337 - val_accuracy: 0.9891\n",
396 | "Epoch 6/10\n",
397 | "60000/60000 [==============================] - 145s 2ms/sample - loss: 0.0167 - accuracy: 0.9942 - val_loss: 0.0340 - val_accuracy: 0.9896\n",
398 | "Epoch 7/10\n",
399 | "60000/60000 [==============================] - 146s 2ms/sample - loss: 0.0128 - accuracy: 0.9958 - val_loss: 0.0371 - val_accuracy: 0.9901\n",
400 | "Epoch 8/10\n",
401 | "60000/60000 [==============================] - 146s 2ms/sample - loss: 0.0120 - accuracy: 0.9962 - val_loss: 0.0358 - val_accuracy: 0.9887\n",
402 | "Epoch 9/10\n",
403 | "60000/60000 [==============================] - 146s 2ms/sample - loss: 0.0097 - accuracy: 0.9968 - val_loss: 0.0337 - val_accuracy: 0.9903\n",
404 | "Epoch 10/10\n",
405 | "60000/60000 [==============================] - 145s 2ms/sample - loss: 0.0080 - accuracy: 0.9972 - val_loss: 0.0372 - val_accuracy: 0.9902\n"
406 | ],
407 | "name": "stdout"
408 | },
409 | {
410 | "output_type": "execute_result",
411 | "data": {
412 | "text/plain": [
413 | ""
414 | ]
415 | },
416 | "metadata": {
417 | "tags": []
418 | },
419 | "execution_count": 10
420 | }
421 | ]
422 | },
423 | {
424 | "cell_type": "code",
425 | "metadata": {
426 | "id": "OZqELNIVTJ5m",
427 | "colab_type": "code",
428 | "colab": {}
429 | },
430 | "source": [
431 | ""
432 | ],
433 | "execution_count": 0,
434 | "outputs": []
435 | }
436 | ]
437 | }
--------------------------------------------------------------------------------
/notebooks/lstm.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Stacked Bidirectional LSTM Sentiment Classifier"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "For classifying IMBD film reviews "
15 | ]
16 | },
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {},
20 | "source": [
21 | "#### Load dependencies"
22 | ]
23 | },
24 | {
25 | "cell_type": "code",
26 | "execution_count": 1,
27 | "metadata": {},
28 | "outputs": [
29 | {
30 | "name": "stderr",
31 | "output_type": "stream",
32 | "text": [
33 | "/opt/conda/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
34 | " from ._conv import register_converters as _register_converters\n"
35 | ]
36 | }
37 | ],
38 | "source": [
39 | "import tensorflow as tf\n",
40 | "from tensorflow import keras"
41 | ]
42 | },
43 | {
44 | "cell_type": "markdown",
45 | "metadata": {},
46 | "source": [
47 | "#### Set hyperparameters"
48 | ]
49 | },
50 | {
51 | "cell_type": "code",
52 | "execution_count": 2,
53 | "metadata": {},
54 | "outputs": [],
55 | "source": [
56 | "# output directory name:\n",
57 | "output_dir = 'model_output/stackedLSTM'\n",
58 | "\n",
59 | "# training:\n",
60 | "epochs = 4\n",
61 | "batch_size = 128\n",
62 | "\n",
63 | "# vector-space embedding: \n",
64 | "n_dim = 64 \n",
65 | "n_unique_words = 10000 \n",
66 | "max_review_length = 200 \n",
67 | "pad_type = trunc_type = 'pre'\n",
68 | "drop_embed = 0.2 \n",
69 | "\n",
70 | "# LSTM layer architecture:\n",
71 | "n_lstm_1 = 64 \n",
72 | "n_lstm_2 = 64 \n",
73 | "drop_lstm = 0.2"
74 | ]
75 | },
76 | {
77 | "cell_type": "markdown",
78 | "metadata": {},
79 | "source": [
80 | "#### Load data"
81 | ]
82 | },
83 | {
84 | "cell_type": "code",
85 | "execution_count": 3,
86 | "metadata": {},
87 | "outputs": [
88 | {
89 | "name": "stdout",
90 | "output_type": "stream",
91 | "text": [
92 | "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz\n",
93 | "17465344/17464789 [==============================] - 0s 0us/step\n"
94 | ]
95 | }
96 | ],
97 | "source": [
98 | "(x_train, y_train), (x_valid, y_valid) = keras.datasets.imdb.load_data(num_words=n_unique_words)"
99 | ]
100 | },
101 | {
102 | "cell_type": "code",
103 | "execution_count": null,
104 | "metadata": {},
105 | "outputs": [],
106 | "source": [
107 | "x_train = keras.preprocessing.sequence import pad_se"
108 | ]
109 | }
110 | ],
111 | "metadata": {
112 | "kernelspec": {
113 | "display_name": "Python 3",
114 | "language": "python",
115 | "name": "python3"
116 | },
117 | "language_info": {
118 | "codemirror_mode": {
119 | "name": "ipython",
120 | "version": 3
121 | },
122 | "file_extension": ".py",
123 | "mimetype": "text/x-python",
124 | "name": "python",
125 | "nbconvert_exporter": "python",
126 | "pygments_lexer": "ipython3",
127 | "version": "3.6.5"
128 | }
129 | },
130 | "nbformat": 4,
131 | "nbformat_minor": 2
132 | }
133 |
--------------------------------------------------------------------------------
/notebooks/shallow_net.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "shallow_net.ipynb",
7 | "provenance": [],
8 | "include_colab_link": true
9 | },
10 | "kernelspec": {
11 | "name": "python3",
12 | "display_name": "Python 3"
13 | },
14 | "accelerator": "TPU"
15 | },
16 | "cells": [
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {
20 | "id": "view-in-github",
21 | "colab_type": "text"
22 | },
23 | "source": [
24 | "
"
25 | ]
26 | },
27 | {
28 | "cell_type": "markdown",
29 | "metadata": {
30 | "id": "iXlSZrKWUrKe",
31 | "colab_type": "text"
32 | },
33 | "source": [
34 | "# Shallow Neural Network (in TensorFlow 2)\n",
35 | "\n",
36 | "A shallow neural network that classifies MNIST digits.\n",
37 | "\n",
38 | "_Remember to change your Runtime to GPU or TPU._"
39 | ]
40 | },
41 | {
42 | "cell_type": "markdown",
43 | "metadata": {
44 | "id": "73o58FcYZ0zM",
45 | "colab_type": "text"
46 | },
47 | "source": [
48 | "#### Load dependencies"
49 | ]
50 | },
51 | {
52 | "cell_type": "code",
53 | "metadata": {
54 | "id": "dENc85VWa7OZ",
55 | "colab_type": "code",
56 | "outputId": "8e84324e-0370-488a-8f0d-1a8ff673a1dd",
57 | "colab": {
58 | "base_uri": "https://localhost:8080/",
59 | "height": 173
60 | }
61 | },
62 | "source": [
63 | "!pip freeze | grep tensorflow"
64 | ],
65 | "execution_count": 2,
66 | "outputs": [
67 | {
68 | "output_type": "stream",
69 | "text": [
70 | "tensorflow==2.2.0rc2\n",
71 | "tensorflow-addons==0.8.3\n",
72 | "tensorflow-datasets==2.1.0\n",
73 | "tensorflow-estimator==2.2.0rc0\n",
74 | "tensorflow-gcs-config==2.1.8\n",
75 | "tensorflow-hub==0.8.0\n",
76 | "tensorflow-metadata==0.21.1\n",
77 | "tensorflow-privacy==0.2.2\n",
78 | "tensorflow-probability==0.9.0\n"
79 | ],
80 | "name": "stdout"
81 | }
82 | ]
83 | },
84 | {
85 | "cell_type": "code",
86 | "metadata": {
87 | "id": "QTF7OhJQbBut",
88 | "colab_type": "code",
89 | "colab": {}
90 | },
91 | "source": [
92 | "import tensorflow as tf\n",
93 | "from tensorflow import keras"
94 | ],
95 | "execution_count": 0,
96 | "outputs": []
97 | },
98 | {
99 | "cell_type": "markdown",
100 | "metadata": {
101 | "id": "MxdWaDnMbrw9",
102 | "colab_type": "text"
103 | },
104 | "source": [
105 | "#### Load data"
106 | ]
107 | },
108 | {
109 | "cell_type": "code",
110 | "metadata": {
111 | "id": "wH9kdTH8bxty",
112 | "colab_type": "code",
113 | "outputId": "0666c8d4-bb85-406c-9af5-c07cb45444be",
114 | "colab": {
115 | "base_uri": "https://localhost:8080/",
116 | "height": 52
117 | }
118 | },
119 | "source": [
120 | "(X_train, y_train), (X_valid, y_valid) = keras.datasets.mnist.load_data()"
121 | ],
122 | "execution_count": 4,
123 | "outputs": [
124 | {
125 | "output_type": "stream",
126 | "text": [
127 | "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n",
128 | "11493376/11490434 [==============================] - 0s 0us/step\n"
129 | ],
130 | "name": "stdout"
131 | }
132 | ]
133 | },
134 | {
135 | "cell_type": "code",
136 | "metadata": {
137 | "id": "uZ2PPkMKcC1S",
138 | "colab_type": "code",
139 | "outputId": "4654b08d-d513-420c-80b5-e5c777875a6d",
140 | "colab": {
141 | "base_uri": "https://localhost:8080/",
142 | "height": 34
143 | }
144 | },
145 | "source": [
146 | "X_train.shape"
147 | ],
148 | "execution_count": 5,
149 | "outputs": [
150 | {
151 | "output_type": "execute_result",
152 | "data": {
153 | "text/plain": [
154 | "(60000, 28, 28)"
155 | ]
156 | },
157 | "metadata": {
158 | "tags": []
159 | },
160 | "execution_count": 5
161 | }
162 | ]
163 | },
164 | {
165 | "cell_type": "code",
166 | "metadata": {
167 | "id": "B_oHXNAgcGn-",
168 | "colab_type": "code",
169 | "outputId": "79de300c-876c-4cfd-94ed-2937ded7972d",
170 | "colab": {
171 | "base_uri": "https://localhost:8080/",
172 | "height": 34
173 | }
174 | },
175 | "source": [
176 | "y_train.shape"
177 | ],
178 | "execution_count": 6,
179 | "outputs": [
180 | {
181 | "output_type": "execute_result",
182 | "data": {
183 | "text/plain": [
184 | "(60000,)"
185 | ]
186 | },
187 | "metadata": {
188 | "tags": []
189 | },
190 | "execution_count": 6
191 | }
192 | ]
193 | },
194 | {
195 | "cell_type": "code",
196 | "metadata": {
197 | "id": "KfHwa61ycLZc",
198 | "colab_type": "code",
199 | "outputId": "5694f516-7a98-4e68-be06-a40d315b9313",
200 | "colab": {
201 | "base_uri": "https://localhost:8080/",
202 | "height": 34
203 | }
204 | },
205 | "source": [
206 | "y_train[0:12]"
207 | ],
208 | "execution_count": 7,
209 | "outputs": [
210 | {
211 | "output_type": "execute_result",
212 | "data": {
213 | "text/plain": [
214 | "array([5, 0, 4, 1, 9, 2, 1, 3, 1, 4, 3, 5], dtype=uint8)"
215 | ]
216 | },
217 | "metadata": {
218 | "tags": []
219 | },
220 | "execution_count": 7
221 | }
222 | ]
223 | },
224 | {
225 | "cell_type": "code",
226 | "metadata": {
227 | "id": "btF3_fWOegzU",
228 | "colab_type": "code",
229 | "outputId": "8c2289b8-56c0-44b2-877f-fd9f86718c10",
230 | "colab": {
231 | "base_uri": "https://localhost:8080/",
232 | "height": 327
233 | }
234 | },
235 | "source": [
236 | "from matplotlib import pyplot as plt\n",
237 | "plt.figure(figsize=(5,5))\n",
238 | "for k in range(12):\n",
239 | " plt.subplot(3, 4, k+1)\n",
240 | " plt.imshow(X_train[k], cmap='Greys')\n",
241 | " plt.axis('off')\n",
242 | "plt.tight_layout()\n",
243 | "plt.show()"
244 | ],
245 | "execution_count": 8,
246 | "outputs": [
247 | {
248 | "output_type": "display_data",
249 | "data": {
250 | "image/png": "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\n",
251 | "text/plain": [
252 | ""
253 | ]
254 | },
255 | "metadata": {
256 | "tags": []
257 | }
258 | }
259 | ]
260 | },
261 | {
262 | "cell_type": "code",
263 | "metadata": {
264 | "id": "pFT_CIJbep24",
265 | "colab_type": "code",
266 | "outputId": "73ea0cac-25fe-4e4a-88ec-daaed6dc5aee",
267 | "colab": {
268 | "base_uri": "https://localhost:8080/",
269 | "height": 34
270 | }
271 | },
272 | "source": [
273 | "X_valid.shape"
274 | ],
275 | "execution_count": 0,
276 | "outputs": [
277 | {
278 | "output_type": "execute_result",
279 | "data": {
280 | "text/plain": [
281 | "(10000, 28, 28)"
282 | ]
283 | },
284 | "metadata": {
285 | "tags": []
286 | },
287 | "execution_count": 8
288 | }
289 | ]
290 | },
291 | {
292 | "cell_type": "code",
293 | "metadata": {
294 | "id": "CgQi3oC4esYo",
295 | "colab_type": "code",
296 | "outputId": "0d25901e-0bdf-4a7d-b3d3-7845d5307f66",
297 | "colab": {
298 | "base_uri": "https://localhost:8080/",
299 | "height": 34
300 | }
301 | },
302 | "source": [
303 | "y_valid.shape"
304 | ],
305 | "execution_count": 9,
306 | "outputs": [
307 | {
308 | "output_type": "execute_result",
309 | "data": {
310 | "text/plain": [
311 | "(10000,)"
312 | ]
313 | },
314 | "metadata": {
315 | "tags": []
316 | },
317 | "execution_count": 9
318 | }
319 | ]
320 | },
321 | {
322 | "cell_type": "code",
323 | "metadata": {
324 | "id": "GwwJ04ZOettt",
325 | "colab_type": "code",
326 | "outputId": "2eea3a2d-7ab0-467d-ebf4-e1d3f637ae2d",
327 | "colab": {
328 | "base_uri": "https://localhost:8080/",
329 | "height": 282
330 | }
331 | },
332 | "source": [
333 | "plt.imshow(X_valid[0], cmap=\"Greys\")"
334 | ],
335 | "execution_count": 10,
336 | "outputs": [
337 | {
338 | "output_type": "execute_result",
339 | "data": {
340 | "text/plain": [
341 | ""
342 | ]
343 | },
344 | "metadata": {
345 | "tags": []
346 | },
347 | "execution_count": 10
348 | },
349 | {
350 | "output_type": "display_data",
351 | "data": {
352 | "image/png": "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\nRK5CYII=\n",
353 | "text/plain": [
354 | ""
355 | ]
356 | },
357 | "metadata": {
358 | "tags": []
359 | }
360 | }
361 | ]
362 | },
363 | {
364 | "cell_type": "code",
365 | "metadata": {
366 | "id": "yKQKR_AIezMg",
367 | "colab_type": "code",
368 | "outputId": "da4b9ef4-21ee-4871-f8a1-63caab521296",
369 | "colab": {
370 | "base_uri": "https://localhost:8080/",
371 | "height": 1000
372 | }
373 | },
374 | "source": [
375 | "X_valid[0]"
376 | ],
377 | "execution_count": 11,
378 | "outputs": [
379 | {
380 | "output_type": "execute_result",
381 | "data": {
382 | "text/plain": [
383 | "array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
384 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
385 | " 0, 0],\n",
386 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
387 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
388 | " 0, 0],\n",
389 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
390 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
391 | " 0, 0],\n",
392 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
393 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
394 | " 0, 0],\n",
395 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
396 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
397 | " 0, 0],\n",
398 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
399 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
400 | " 0, 0],\n",
401 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
402 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
403 | " 0, 0],\n",
404 | " [ 0, 0, 0, 0, 0, 0, 84, 185, 159, 151, 60, 36, 0,\n",
405 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
406 | " 0, 0],\n",
407 | " [ 0, 0, 0, 0, 0, 0, 222, 254, 254, 254, 254, 241, 198,\n",
408 | " 198, 198, 198, 198, 198, 198, 198, 170, 52, 0, 0, 0, 0,\n",
409 | " 0, 0],\n",
410 | " [ 0, 0, 0, 0, 0, 0, 67, 114, 72, 114, 163, 227, 254,\n",
411 | " 225, 254, 254, 254, 250, 229, 254, 254, 140, 0, 0, 0, 0,\n",
412 | " 0, 0],\n",
413 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 66,\n",
414 | " 14, 67, 67, 67, 59, 21, 236, 254, 106, 0, 0, 0, 0,\n",
415 | " 0, 0],\n",
416 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
417 | " 0, 0, 0, 0, 0, 83, 253, 209, 18, 0, 0, 0, 0,\n",
418 | " 0, 0],\n",
419 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
420 | " 0, 0, 0, 0, 22, 233, 255, 83, 0, 0, 0, 0, 0,\n",
421 | " 0, 0],\n",
422 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
423 | " 0, 0, 0, 0, 129, 254, 238, 44, 0, 0, 0, 0, 0,\n",
424 | " 0, 0],\n",
425 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
426 | " 0, 0, 0, 59, 249, 254, 62, 0, 0, 0, 0, 0, 0,\n",
427 | " 0, 0],\n",
428 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
429 | " 0, 0, 0, 133, 254, 187, 5, 0, 0, 0, 0, 0, 0,\n",
430 | " 0, 0],\n",
431 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
432 | " 0, 0, 9, 205, 248, 58, 0, 0, 0, 0, 0, 0, 0,\n",
433 | " 0, 0],\n",
434 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
435 | " 0, 0, 126, 254, 182, 0, 0, 0, 0, 0, 0, 0, 0,\n",
436 | " 0, 0],\n",
437 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
438 | " 0, 75, 251, 240, 57, 0, 0, 0, 0, 0, 0, 0, 0,\n",
439 | " 0, 0],\n",
440 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
441 | " 19, 221, 254, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
442 | " 0, 0],\n",
443 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,\n",
444 | " 203, 254, 219, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
445 | " 0, 0],\n",
446 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38,\n",
447 | " 254, 254, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
448 | " 0, 0],\n",
449 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 224,\n",
450 | " 254, 115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
451 | " 0, 0],\n",
452 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 254,\n",
453 | " 254, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
454 | " 0, 0],\n",
455 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 242, 254,\n",
456 | " 254, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
457 | " 0, 0],\n",
458 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 254, 254,\n",
459 | " 219, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
460 | " 0, 0],\n",
461 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 254, 207,\n",
462 | " 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
463 | " 0, 0],\n",
464 | " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
465 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
466 | " 0, 0]], dtype=uint8)"
467 | ]
468 | },
469 | "metadata": {
470 | "tags": []
471 | },
472 | "execution_count": 11
473 | }
474 | ]
475 | },
476 | {
477 | "cell_type": "code",
478 | "metadata": {
479 | "id": "RZ6J0L1fe1m4",
480 | "colab_type": "code",
481 | "outputId": "6fe95543-5948-4632-9472-e088df0e1108",
482 | "colab": {
483 | "base_uri": "https://localhost:8080/",
484 | "height": 34
485 | }
486 | },
487 | "source": [
488 | "y_valid[0]"
489 | ],
490 | "execution_count": 12,
491 | "outputs": [
492 | {
493 | "output_type": "execute_result",
494 | "data": {
495 | "text/plain": [
496 | "7"
497 | ]
498 | },
499 | "metadata": {
500 | "tags": []
501 | },
502 | "execution_count": 12
503 | }
504 | ]
505 | },
506 | {
507 | "cell_type": "markdown",
508 | "metadata": {
509 | "id": "jyMuVQvibzRu",
510 | "colab_type": "text"
511 | },
512 | "source": [
513 | "#### Preprocess data"
514 | ]
515 | },
516 | {
517 | "cell_type": "code",
518 | "metadata": {
519 | "id": "Hw0FtUpYb4Ik",
520 | "colab_type": "code",
521 | "colab": {}
522 | },
523 | "source": [
524 | "X_train = X_train.reshape(60000, 784).astype('float32')\n",
525 | "X_valid = X_valid.reshape(10000, 784).astype('float32')"
526 | ],
527 | "execution_count": 0,
528 | "outputs": []
529 | },
530 | {
531 | "cell_type": "code",
532 | "metadata": {
533 | "id": "EkyGxyRIb5md",
534 | "colab_type": "code",
535 | "colab": {}
536 | },
537 | "source": [
538 | "X_train /= 255\n",
539 | "X_valid /= 255"
540 | ],
541 | "execution_count": 0,
542 | "outputs": []
543 | },
544 | {
545 | "cell_type": "code",
546 | "metadata": {
547 | "id": "kxRjPNpNe-Gm",
548 | "colab_type": "code",
549 | "outputId": "b4e4cb26-ca8f-4705-bdf2-010f158b6279",
550 | "colab": {
551 | "base_uri": "https://localhost:8080/",
552 | "height": 1000
553 | }
554 | },
555 | "source": [
556 | "X_valid[0]"
557 | ],
558 | "execution_count": 15,
559 | "outputs": [
560 | {
561 | "output_type": "execute_result",
562 | "data": {
563 | "text/plain": [
564 | "array([0. , 0. , 0. , 0. , 0. ,\n",
565 | " 0. , 0. , 0. , 0. , 0. ,\n",
566 | " 0. , 0. , 0. , 0. , 0. ,\n",
567 | " 0. , 0. , 0. , 0. , 0. ,\n",
568 | " 0. , 0. , 0. , 0. , 0. ,\n",
569 | " 0. , 0. , 0. , 0. , 0. ,\n",
570 | " 0. , 0. , 0. , 0. , 0. ,\n",
571 | " 0. , 0. , 0. , 0. , 0. ,\n",
572 | " 0. , 0. , 0. , 0. , 0. ,\n",
573 | " 0. , 0. , 0. , 0. , 0. ,\n",
574 | " 0. , 0. , 0. , 0. , 0. ,\n",
575 | " 0. , 0. , 0. , 0. , 0. ,\n",
576 | " 0. , 0. , 0. , 0. , 0. ,\n",
577 | " 0. , 0. , 0. , 0. , 0. ,\n",
578 | " 0. , 0. , 0. , 0. , 0. ,\n",
579 | " 0. , 0. , 0. , 0. , 0. ,\n",
580 | " 0. , 0. , 0. , 0. , 0. ,\n",
581 | " 0. , 0. , 0. , 0. , 0. ,\n",
582 | " 0. , 0. , 0. , 0. , 0. ,\n",
583 | " 0. , 0. , 0. , 0. , 0. ,\n",
584 | " 0. , 0. , 0. , 0. , 0. ,\n",
585 | " 0. , 0. , 0. , 0. , 0. ,\n",
586 | " 0. , 0. , 0. , 0. , 0. ,\n",
587 | " 0. , 0. , 0. , 0. , 0. ,\n",
588 | " 0. , 0. , 0. , 0. , 0. ,\n",
589 | " 0. , 0. , 0. , 0. , 0. ,\n",
590 | " 0. , 0. , 0. , 0. , 0. ,\n",
591 | " 0. , 0. , 0. , 0. , 0. ,\n",
592 | " 0. , 0. , 0. , 0. , 0. ,\n",
593 | " 0. , 0. , 0. , 0. , 0. ,\n",
594 | " 0. , 0. , 0. , 0. , 0. ,\n",
595 | " 0. , 0. , 0. , 0. , 0. ,\n",
596 | " 0. , 0. , 0. , 0. , 0. ,\n",
597 | " 0. , 0. , 0. , 0. , 0. ,\n",
598 | " 0. , 0. , 0. , 0. , 0. ,\n",
599 | " 0. , 0. , 0. , 0. , 0. ,\n",
600 | " 0. , 0. , 0. , 0. , 0. ,\n",
601 | " 0. , 0. , 0. , 0. , 0. ,\n",
602 | " 0. , 0. , 0. , 0. , 0. ,\n",
603 | " 0. , 0. , 0. , 0. , 0. ,\n",
604 | " 0. , 0. , 0.32941177, 0.7254902 , 0.62352943,\n",
605 | " 0.5921569 , 0.23529412, 0.14117648, 0. , 0. ,\n",
606 | " 0. , 0. , 0. , 0. , 0. ,\n",
607 | " 0. , 0. , 0. , 0. , 0. ,\n",
608 | " 0. , 0. , 0. , 0. , 0. ,\n",
609 | " 0. , 0. , 0. , 0. , 0. ,\n",
610 | " 0.87058824, 0.99607843, 0.99607843, 0.99607843, 0.99607843,\n",
611 | " 0.94509804, 0.7764706 , 0.7764706 , 0.7764706 , 0.7764706 ,\n",
612 | " 0.7764706 , 0.7764706 , 0.7764706 , 0.7764706 , 0.6666667 ,\n",
613 | " 0.20392157, 0. , 0. , 0. , 0. ,\n",
614 | " 0. , 0. , 0. , 0. , 0. ,\n",
615 | " 0. , 0. , 0. , 0.2627451 , 0.44705883,\n",
616 | " 0.28235295, 0.44705883, 0.6392157 , 0.8901961 , 0.99607843,\n",
617 | " 0.88235295, 0.99607843, 0.99607843, 0.99607843, 0.98039216,\n",
618 | " 0.8980392 , 0.99607843, 0.99607843, 0.54901963, 0. ,\n",
619 | " 0. , 0. , 0. , 0. , 0. ,\n",
620 | " 0. , 0. , 0. , 0. , 0. ,\n",
621 | " 0. , 0. , 0. , 0. , 0. ,\n",
622 | " 0. , 0.06666667, 0.25882354, 0.05490196, 0.2627451 ,\n",
623 | " 0.2627451 , 0.2627451 , 0.23137255, 0.08235294, 0.9254902 ,\n",
624 | " 0.99607843, 0.41568628, 0. , 0. , 0. ,\n",
625 | " 0. , 0. , 0. , 0. , 0. ,\n",
626 | " 0. , 0. , 0. , 0. , 0. ,\n",
627 | " 0. , 0. , 0. , 0. , 0. ,\n",
628 | " 0. , 0. , 0. , 0. , 0. ,\n",
629 | " 0. , 0.3254902 , 0.99215686, 0.81960785, 0.07058824,\n",
630 | " 0. , 0. , 0. , 0. , 0. ,\n",
631 | " 0. , 0. , 0. , 0. , 0. ,\n",
632 | " 0. , 0. , 0. , 0. , 0. ,\n",
633 | " 0. , 0. , 0. , 0. , 0. ,\n",
634 | " 0. , 0. , 0. , 0.08627451, 0.9137255 ,\n",
635 | " 1. , 0.3254902 , 0. , 0. , 0. ,\n",
636 | " 0. , 0. , 0. , 0. , 0. ,\n",
637 | " 0. , 0. , 0. , 0. , 0. ,\n",
638 | " 0. , 0. , 0. , 0. , 0. ,\n",
639 | " 0. , 0. , 0. , 0. , 0. ,\n",
640 | " 0. , 0.5058824 , 0.99607843, 0.93333334, 0.17254902,\n",
641 | " 0. , 0. , 0. , 0. , 0. ,\n",
642 | " 0. , 0. , 0. , 0. , 0. ,\n",
643 | " 0. , 0. , 0. , 0. , 0. ,\n",
644 | " 0. , 0. , 0. , 0. , 0. ,\n",
645 | " 0. , 0. , 0. , 0.23137255, 0.9764706 ,\n",
646 | " 0.99607843, 0.24313726, 0. , 0. , 0. ,\n",
647 | " 0. , 0. , 0. , 0. , 0. ,\n",
648 | " 0. , 0. , 0. , 0. , 0. ,\n",
649 | " 0. , 0. , 0. , 0. , 0. ,\n",
650 | " 0. , 0. , 0. , 0. , 0. ,\n",
651 | " 0. , 0.52156866, 0.99607843, 0.73333335, 0.01960784,\n",
652 | " 0. , 0. , 0. , 0. , 0. ,\n",
653 | " 0. , 0. , 0. , 0. , 0. ,\n",
654 | " 0. , 0. , 0. , 0. , 0. ,\n",
655 | " 0. , 0. , 0. , 0. , 0. ,\n",
656 | " 0. , 0. , 0. , 0.03529412, 0.8039216 ,\n",
657 | " 0.972549 , 0.22745098, 0. , 0. , 0. ,\n",
658 | " 0. , 0. , 0. , 0. , 0. ,\n",
659 | " 0. , 0. , 0. , 0. , 0. ,\n",
660 | " 0. , 0. , 0. , 0. , 0. ,\n",
661 | " 0. , 0. , 0. , 0. , 0. ,\n",
662 | " 0. , 0.49411765, 0.99607843, 0.7137255 , 0. ,\n",
663 | " 0. , 0. , 0. , 0. , 0. ,\n",
664 | " 0. , 0. , 0. , 0. , 0. ,\n",
665 | " 0. , 0. , 0. , 0. , 0. ,\n",
666 | " 0. , 0. , 0. , 0. , 0. ,\n",
667 | " 0. , 0. , 0. , 0.29411766, 0.9843137 ,\n",
668 | " 0.9411765 , 0.22352941, 0. , 0. , 0. ,\n",
669 | " 0. , 0. , 0. , 0. , 0. ,\n",
670 | " 0. , 0. , 0. , 0. , 0. ,\n",
671 | " 0. , 0. , 0. , 0. , 0. ,\n",
672 | " 0. , 0. , 0. , 0. , 0. ,\n",
673 | " 0.07450981, 0.8666667 , 0.99607843, 0.6509804 , 0. ,\n",
674 | " 0. , 0. , 0. , 0. , 0. ,\n",
675 | " 0. , 0. , 0. , 0. , 0. ,\n",
676 | " 0. , 0. , 0. , 0. , 0. ,\n",
677 | " 0. , 0. , 0. , 0. , 0. ,\n",
678 | " 0. , 0. , 0.01176471, 0.79607844, 0.99607843,\n",
679 | " 0.85882354, 0.13725491, 0. , 0. , 0. ,\n",
680 | " 0. , 0. , 0. , 0. , 0. ,\n",
681 | " 0. , 0. , 0. , 0. , 0. ,\n",
682 | " 0. , 0. , 0. , 0. , 0. ,\n",
683 | " 0. , 0. , 0. , 0. , 0. ,\n",
684 | " 0.14901961, 0.99607843, 0.99607843, 0.3019608 , 0. ,\n",
685 | " 0. , 0. , 0. , 0. , 0. ,\n",
686 | " 0. , 0. , 0. , 0. , 0. ,\n",
687 | " 0. , 0. , 0. , 0. , 0. ,\n",
688 | " 0. , 0. , 0. , 0. , 0. ,\n",
689 | " 0. , 0. , 0.12156863, 0.8784314 , 0.99607843,\n",
690 | " 0.4509804 , 0.00392157, 0. , 0. , 0. ,\n",
691 | " 0. , 0. , 0. , 0. , 0. ,\n",
692 | " 0. , 0. , 0. , 0. , 0. ,\n",
693 | " 0. , 0. , 0. , 0. , 0. ,\n",
694 | " 0. , 0. , 0. , 0. , 0. ,\n",
695 | " 0.52156866, 0.99607843, 0.99607843, 0.20392157, 0. ,\n",
696 | " 0. , 0. , 0. , 0. , 0. ,\n",
697 | " 0. , 0. , 0. , 0. , 0. ,\n",
698 | " 0. , 0. , 0. , 0. , 0. ,\n",
699 | " 0. , 0. , 0. , 0. , 0. ,\n",
700 | " 0. , 0. , 0.23921569, 0.9490196 , 0.99607843,\n",
701 | " 0.99607843, 0.20392157, 0. , 0. , 0. ,\n",
702 | " 0. , 0. , 0. , 0. , 0. ,\n",
703 | " 0. , 0. , 0. , 0. , 0. ,\n",
704 | " 0. , 0. , 0. , 0. , 0. ,\n",
705 | " 0. , 0. , 0. , 0. , 0. ,\n",
706 | " 0.4745098 , 0.99607843, 0.99607843, 0.85882354, 0.15686275,\n",
707 | " 0. , 0. , 0. , 0. , 0. ,\n",
708 | " 0. , 0. , 0. , 0. , 0. ,\n",
709 | " 0. , 0. , 0. , 0. , 0. ,\n",
710 | " 0. , 0. , 0. , 0. , 0. ,\n",
711 | " 0. , 0. , 0. , 0.4745098 , 0.99607843,\n",
712 | " 0.8117647 , 0.07058824, 0. , 0. , 0. ,\n",
713 | " 0. , 0. , 0. , 0. , 0. ,\n",
714 | " 0. , 0. , 0. , 0. , 0. ,\n",
715 | " 0. , 0. , 0. , 0. , 0. ,\n",
716 | " 0. , 0. , 0. , 0. , 0. ,\n",
717 | " 0. , 0. , 0. , 0. , 0. ,\n",
718 | " 0. , 0. , 0. , 0. , 0. ,\n",
719 | " 0. , 0. , 0. , 0. , 0. ,\n",
720 | " 0. , 0. , 0. , 0. ], dtype=float32)"
721 | ]
722 | },
723 | "metadata": {
724 | "tags": []
725 | },
726 | "execution_count": 15
727 | }
728 | ]
729 | },
730 | {
731 | "cell_type": "code",
732 | "metadata": {
733 | "id": "M7rJ2C_ob6e9",
734 | "colab_type": "code",
735 | "colab": {}
736 | },
737 | "source": [
738 | "n_classes = 10\n",
739 | "y_train = keras.utils.to_categorical(y_train, n_classes)\n",
740 | "y_valid = keras.utils.to_categorical(y_valid, n_classes)"
741 | ],
742 | "execution_count": 0,
743 | "outputs": []
744 | },
745 | {
746 | "cell_type": "code",
747 | "metadata": {
748 | "id": "20zL0e_ZfDxo",
749 | "colab_type": "code",
750 | "outputId": "dda548fe-0a84-493f-de3a-9040b00e6bff",
751 | "colab": {
752 | "base_uri": "https://localhost:8080/",
753 | "height": 34
754 | }
755 | },
756 | "source": [
757 | "y_valid[0]"
758 | ],
759 | "execution_count": 17,
760 | "outputs": [
761 | {
762 | "output_type": "execute_result",
763 | "data": {
764 | "text/plain": [
765 | "array([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], dtype=float32)"
766 | ]
767 | },
768 | "metadata": {
769 | "tags": []
770 | },
771 | "execution_count": 17
772 | }
773 | ]
774 | },
775 | {
776 | "cell_type": "markdown",
777 | "metadata": {
778 | "id": "FrDbdiVqb7eN",
779 | "colab_type": "text"
780 | },
781 | "source": [
782 | "#### Design neural network architecture"
783 | ]
784 | },
785 | {
786 | "cell_type": "code",
787 | "metadata": {
788 | "id": "pTgQAJCFb-Tm",
789 | "colab_type": "code",
790 | "colab": {}
791 | },
792 | "source": [
793 | "model = keras.models.Sequential([\n",
794 | " \n",
795 | " keras.layers.Dense(64, activation='sigmoid', input_shape=(784,)),\n",
796 | " keras.layers.Dense(10, activation='softmax')\n",
797 | " \n",
798 | "])"
799 | ],
800 | "execution_count": 0,
801 | "outputs": []
802 | },
803 | {
804 | "cell_type": "code",
805 | "metadata": {
806 | "id": "EzSU6ALogRJv",
807 | "colab_type": "code",
808 | "outputId": "701792c1-f7f5-4ef6-d934-e543dfaba942",
809 | "colab": {
810 | "base_uri": "https://localhost:8080/",
811 | "height": 225
812 | }
813 | },
814 | "source": [
815 | "model.summary()"
816 | ],
817 | "execution_count": 0,
818 | "outputs": [
819 | {
820 | "output_type": "stream",
821 | "text": [
822 | "Model: \"sequential\"\n",
823 | "_________________________________________________________________\n",
824 | "Layer (type) Output Shape Param # \n",
825 | "=================================================================\n",
826 | "dense (Dense) (None, 64) 50240 \n",
827 | "_________________________________________________________________\n",
828 | "dense_1 (Dense) (None, 10) 650 \n",
829 | "=================================================================\n",
830 | "Total params: 50,890\n",
831 | "Trainable params: 50,890\n",
832 | "Non-trainable params: 0\n",
833 | "_________________________________________________________________\n"
834 | ],
835 | "name": "stdout"
836 | }
837 | ]
838 | },
839 | {
840 | "cell_type": "code",
841 | "metadata": {
842 | "id": "ZmKYRyaTgTTx",
843 | "colab_type": "code",
844 | "outputId": "e38679c6-49b1-45aa-e52c-b394f107f9e5",
845 | "colab": {
846 | "base_uri": "https://localhost:8080/",
847 | "height": 34
848 | }
849 | },
850 | "source": [
851 | "64*784"
852 | ],
853 | "execution_count": 19,
854 | "outputs": [
855 | {
856 | "output_type": "execute_result",
857 | "data": {
858 | "text/plain": [
859 | "50176"
860 | ]
861 | },
862 | "metadata": {
863 | "tags": []
864 | },
865 | "execution_count": 19
866 | }
867 | ]
868 | },
869 | {
870 | "cell_type": "code",
871 | "metadata": {
872 | "id": "yLgX7mIMgXVR",
873 | "colab_type": "code",
874 | "outputId": "e58c6fd7-7161-478f-a08d-8c63fab687de",
875 | "colab": {
876 | "base_uri": "https://localhost:8080/",
877 | "height": 34
878 | }
879 | },
880 | "source": [
881 | "(64*784)+64"
882 | ],
883 | "execution_count": 20,
884 | "outputs": [
885 | {
886 | "output_type": "execute_result",
887 | "data": {
888 | "text/plain": [
889 | "50240"
890 | ]
891 | },
892 | "metadata": {
893 | "tags": []
894 | },
895 | "execution_count": 20
896 | }
897 | ]
898 | },
899 | {
900 | "cell_type": "code",
901 | "metadata": {
902 | "id": "Ep92qZmsgarR",
903 | "colab_type": "code",
904 | "outputId": "736b13b5-0e3e-4923-d97f-75d20b690ce0",
905 | "colab": {
906 | "base_uri": "https://localhost:8080/",
907 | "height": 34
908 | }
909 | },
910 | "source": [
911 | "(10*64)+10"
912 | ],
913 | "execution_count": 21,
914 | "outputs": [
915 | {
916 | "output_type": "execute_result",
917 | "data": {
918 | "text/plain": [
919 | "650"
920 | ]
921 | },
922 | "metadata": {
923 | "tags": []
924 | },
925 | "execution_count": 21
926 | }
927 | ]
928 | },
929 | {
930 | "cell_type": "markdown",
931 | "metadata": {
932 | "id": "-W1ljeaGgdpA",
933 | "colab_type": "text"
934 | },
935 | "source": [
936 | "#### Configure model"
937 | ]
938 | },
939 | {
940 | "cell_type": "code",
941 | "metadata": {
942 | "id": "2YI73ZvYgheG",
943 | "colab_type": "code",
944 | "colab": {}
945 | },
946 | "source": [
947 | "model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])"
948 | ],
949 | "execution_count": 0,
950 | "outputs": []
951 | },
952 | {
953 | "cell_type": "markdown",
954 | "metadata": {
955 | "id": "NV9-heXwgqO2",
956 | "colab_type": "text"
957 | },
958 | "source": [
959 | "#### Train!"
960 | ]
961 | },
962 | {
963 | "cell_type": "code",
964 | "metadata": {
965 | "id": "WtgS2Xhmgx4X",
966 | "colab_type": "code",
967 | "outputId": "387d6dae-37a1-4b2f-d6a1-53446f5d4231",
968 | "colab": {
969 | "base_uri": "https://localhost:8080/",
970 | "height": 1000
971 | }
972 | },
973 | "source": [
974 | "model.fit(X_train, y_train, batch_size=128, epochs=200, verbose=1, validation_data=(X_valid, y_valid))"
975 | ],
976 | "execution_count": 23,
977 | "outputs": [
978 | {
979 | "output_type": "stream",
980 | "text": [
981 | "Epoch 1/200\n",
982 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0932 - accuracy: 0.0992 - val_loss: 0.0916 - val_accuracy: 0.1009\n",
983 | "Epoch 2/200\n",
984 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0910 - accuracy: 0.0993 - val_loss: 0.0906 - val_accuracy: 0.1005\n",
985 | "Epoch 3/200\n",
986 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0903 - accuracy: 0.1036 - val_loss: 0.0900 - val_accuracy: 0.1181\n",
987 | "Epoch 4/200\n",
988 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0898 - accuracy: 0.1253 - val_loss: 0.0895 - val_accuracy: 0.1499\n",
989 | "Epoch 5/200\n",
990 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0894 - accuracy: 0.1651 - val_loss: 0.0892 - val_accuracy: 0.1931\n",
991 | "Epoch 6/200\n",
992 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0890 - accuracy: 0.2072 - val_loss: 0.0888 - val_accuracy: 0.2276\n",
993 | "Epoch 7/200\n",
994 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0887 - accuracy: 0.2410 - val_loss: 0.0885 - val_accuracy: 0.2572\n",
995 | "Epoch 8/200\n",
996 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0884 - accuracy: 0.2652 - val_loss: 0.0882 - val_accuracy: 0.2791\n",
997 | "Epoch 9/200\n",
998 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0881 - accuracy: 0.2833 - val_loss: 0.0879 - val_accuracy: 0.2958\n",
999 | "Epoch 10/200\n",
1000 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0878 - accuracy: 0.3007 - val_loss: 0.0876 - val_accuracy: 0.3104\n",
1001 | "Epoch 11/200\n",
1002 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0875 - accuracy: 0.3165 - val_loss: 0.0873 - val_accuracy: 0.3297\n",
1003 | "Epoch 12/200\n",
1004 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0872 - accuracy: 0.3348 - val_loss: 0.0870 - val_accuracy: 0.3507\n",
1005 | "Epoch 13/200\n",
1006 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0869 - accuracy: 0.3561 - val_loss: 0.0866 - val_accuracy: 0.3707\n",
1007 | "Epoch 14/200\n",
1008 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0866 - accuracy: 0.3763 - val_loss: 0.0863 - val_accuracy: 0.3910\n",
1009 | "Epoch 15/200\n",
1010 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0863 - accuracy: 0.3963 - val_loss: 0.0860 - val_accuracy: 0.4105\n",
1011 | "Epoch 16/200\n",
1012 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0860 - accuracy: 0.4135 - val_loss: 0.0857 - val_accuracy: 0.4287\n",
1013 | "Epoch 17/200\n",
1014 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0856 - accuracy: 0.4288 - val_loss: 0.0854 - val_accuracy: 0.4441\n",
1015 | "Epoch 18/200\n",
1016 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0853 - accuracy: 0.4423 - val_loss: 0.0850 - val_accuracy: 0.4555\n",
1017 | "Epoch 19/200\n",
1018 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0850 - accuracy: 0.4521 - val_loss: 0.0847 - val_accuracy: 0.4649\n",
1019 | "Epoch 20/200\n",
1020 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0846 - accuracy: 0.4608 - val_loss: 0.0843 - val_accuracy: 0.4730\n",
1021 | "Epoch 21/200\n",
1022 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0843 - accuracy: 0.4675 - val_loss: 0.0840 - val_accuracy: 0.4787\n",
1023 | "Epoch 22/200\n",
1024 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0839 - accuracy: 0.4729 - val_loss: 0.0836 - val_accuracy: 0.4825\n",
1025 | "Epoch 23/200\n",
1026 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0836 - accuracy: 0.4794 - val_loss: 0.0832 - val_accuracy: 0.4875\n",
1027 | "Epoch 24/200\n",
1028 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0832 - accuracy: 0.4824 - val_loss: 0.0828 - val_accuracy: 0.4899\n",
1029 | "Epoch 25/200\n",
1030 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0828 - accuracy: 0.4851 - val_loss: 0.0824 - val_accuracy: 0.4942\n",
1031 | "Epoch 26/200\n",
1032 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0824 - accuracy: 0.4876 - val_loss: 0.0820 - val_accuracy: 0.4962\n",
1033 | "Epoch 27/200\n",
1034 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0820 - accuracy: 0.4906 - val_loss: 0.0816 - val_accuracy: 0.4988\n",
1035 | "Epoch 28/200\n",
1036 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0816 - accuracy: 0.4933 - val_loss: 0.0812 - val_accuracy: 0.5008\n",
1037 | "Epoch 29/200\n",
1038 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0812 - accuracy: 0.4935 - val_loss: 0.0807 - val_accuracy: 0.5038\n",
1039 | "Epoch 30/200\n",
1040 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0807 - accuracy: 0.4962 - val_loss: 0.0803 - val_accuracy: 0.5071\n",
1041 | "Epoch 31/200\n",
1042 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0803 - accuracy: 0.4972 - val_loss: 0.0798 - val_accuracy: 0.5100\n",
1043 | "Epoch 32/200\n",
1044 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0798 - accuracy: 0.5007 - val_loss: 0.0794 - val_accuracy: 0.5122\n",
1045 | "Epoch 33/200\n",
1046 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0794 - accuracy: 0.5027 - val_loss: 0.0789 - val_accuracy: 0.5143\n",
1047 | "Epoch 34/200\n",
1048 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0789 - accuracy: 0.5063 - val_loss: 0.0784 - val_accuracy: 0.5170\n",
1049 | "Epoch 35/200\n",
1050 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0784 - accuracy: 0.5103 - val_loss: 0.0779 - val_accuracy: 0.5206\n",
1051 | "Epoch 36/200\n",
1052 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0780 - accuracy: 0.5117 - val_loss: 0.0774 - val_accuracy: 0.5248\n",
1053 | "Epoch 37/200\n",
1054 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0775 - accuracy: 0.5171 - val_loss: 0.0769 - val_accuracy: 0.5283\n",
1055 | "Epoch 38/200\n",
1056 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0770 - accuracy: 0.5213 - val_loss: 0.0764 - val_accuracy: 0.5324\n",
1057 | "Epoch 39/200\n",
1058 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0765 - accuracy: 0.5256 - val_loss: 0.0759 - val_accuracy: 0.5361\n",
1059 | "Epoch 40/200\n",
1060 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0760 - accuracy: 0.5298 - val_loss: 0.0754 - val_accuracy: 0.5394\n",
1061 | "Epoch 41/200\n",
1062 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0754 - accuracy: 0.5333 - val_loss: 0.0748 - val_accuracy: 0.5431\n",
1063 | "Epoch 42/200\n",
1064 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0749 - accuracy: 0.5379 - val_loss: 0.0743 - val_accuracy: 0.5489\n",
1065 | "Epoch 43/200\n",
1066 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0744 - accuracy: 0.5428 - val_loss: 0.0738 - val_accuracy: 0.5527\n",
1067 | "Epoch 44/200\n",
1068 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0739 - accuracy: 0.5480 - val_loss: 0.0732 - val_accuracy: 0.5592\n",
1069 | "Epoch 45/200\n",
1070 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0733 - accuracy: 0.5524 - val_loss: 0.0727 - val_accuracy: 0.5630\n",
1071 | "Epoch 46/200\n",
1072 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0728 - accuracy: 0.5578 - val_loss: 0.0722 - val_accuracy: 0.5682\n",
1073 | "Epoch 47/200\n",
1074 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0723 - accuracy: 0.5635 - val_loss: 0.0716 - val_accuracy: 0.5742\n",
1075 | "Epoch 48/200\n",
1076 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0717 - accuracy: 0.5678 - val_loss: 0.0711 - val_accuracy: 0.5803\n",
1077 | "Epoch 49/200\n",
1078 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0712 - accuracy: 0.5736 - val_loss: 0.0705 - val_accuracy: 0.5848\n",
1079 | "Epoch 50/200\n",
1080 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0707 - accuracy: 0.5792 - val_loss: 0.0700 - val_accuracy: 0.5905\n",
1081 | "Epoch 51/200\n",
1082 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0702 - accuracy: 0.5846 - val_loss: 0.0694 - val_accuracy: 0.5942\n",
1083 | "Epoch 52/200\n",
1084 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0696 - accuracy: 0.5903 - val_loss: 0.0689 - val_accuracy: 0.5991\n",
1085 | "Epoch 53/200\n",
1086 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0691 - accuracy: 0.5959 - val_loss: 0.0684 - val_accuracy: 0.6052\n",
1087 | "Epoch 54/200\n",
1088 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0686 - accuracy: 0.6006 - val_loss: 0.0678 - val_accuracy: 0.6111\n",
1089 | "Epoch 55/200\n",
1090 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0680 - accuracy: 0.6063 - val_loss: 0.0673 - val_accuracy: 0.6165\n",
1091 | "Epoch 56/200\n",
1092 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0675 - accuracy: 0.6112 - val_loss: 0.0667 - val_accuracy: 0.6211\n",
1093 | "Epoch 57/200\n",
1094 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0670 - accuracy: 0.6149 - val_loss: 0.0662 - val_accuracy: 0.6250\n",
1095 | "Epoch 58/200\n",
1096 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0665 - accuracy: 0.6197 - val_loss: 0.0657 - val_accuracy: 0.6287\n",
1097 | "Epoch 59/200\n",
1098 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0659 - accuracy: 0.6243 - val_loss: 0.0652 - val_accuracy: 0.6335\n",
1099 | "Epoch 60/200\n",
1100 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0654 - accuracy: 0.6282 - val_loss: 0.0646 - val_accuracy: 0.6381\n",
1101 | "Epoch 61/200\n",
1102 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0649 - accuracy: 0.6331 - val_loss: 0.0641 - val_accuracy: 0.6430\n",
1103 | "Epoch 62/200\n",
1104 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0644 - accuracy: 0.6366 - val_loss: 0.0636 - val_accuracy: 0.6476\n",
1105 | "Epoch 63/200\n",
1106 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0639 - accuracy: 0.6403 - val_loss: 0.0631 - val_accuracy: 0.6520\n",
1107 | "Epoch 64/200\n",
1108 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0634 - accuracy: 0.6446 - val_loss: 0.0625 - val_accuracy: 0.6567\n",
1109 | "Epoch 65/200\n",
1110 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0629 - accuracy: 0.6485 - val_loss: 0.0620 - val_accuracy: 0.6606\n",
1111 | "Epoch 66/200\n",
1112 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0624 - accuracy: 0.6526 - val_loss: 0.0615 - val_accuracy: 0.6645\n",
1113 | "Epoch 67/200\n",
1114 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0619 - accuracy: 0.6563 - val_loss: 0.0610 - val_accuracy: 0.6686\n",
1115 | "Epoch 68/200\n",
1116 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0614 - accuracy: 0.6601 - val_loss: 0.0605 - val_accuracy: 0.6727\n",
1117 | "Epoch 69/200\n",
1118 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0609 - accuracy: 0.6644 - val_loss: 0.0600 - val_accuracy: 0.6768\n",
1119 | "Epoch 70/200\n",
1120 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0604 - accuracy: 0.6673 - val_loss: 0.0595 - val_accuracy: 0.6804\n",
1121 | "Epoch 71/200\n",
1122 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0599 - accuracy: 0.6715 - val_loss: 0.0590 - val_accuracy: 0.6843\n",
1123 | "Epoch 72/200\n",
1124 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0594 - accuracy: 0.6754 - val_loss: 0.0585 - val_accuracy: 0.6876\n",
1125 | "Epoch 73/200\n",
1126 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0589 - accuracy: 0.6787 - val_loss: 0.0581 - val_accuracy: 0.6922\n",
1127 | "Epoch 74/200\n",
1128 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0585 - accuracy: 0.6827 - val_loss: 0.0576 - val_accuracy: 0.6965\n",
1129 | "Epoch 75/200\n",
1130 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0580 - accuracy: 0.6851 - val_loss: 0.0571 - val_accuracy: 0.6986\n",
1131 | "Epoch 76/200\n",
1132 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0575 - accuracy: 0.6884 - val_loss: 0.0566 - val_accuracy: 0.7009\n",
1133 | "Epoch 77/200\n",
1134 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0571 - accuracy: 0.6921 - val_loss: 0.0562 - val_accuracy: 0.7047\n",
1135 | "Epoch 78/200\n",
1136 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0566 - accuracy: 0.6950 - val_loss: 0.0557 - val_accuracy: 0.7078\n",
1137 | "Epoch 79/200\n",
1138 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0562 - accuracy: 0.6981 - val_loss: 0.0552 - val_accuracy: 0.7114\n",
1139 | "Epoch 80/200\n",
1140 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0557 - accuracy: 0.7018 - val_loss: 0.0548 - val_accuracy: 0.7148\n",
1141 | "Epoch 81/200\n",
1142 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0553 - accuracy: 0.7040 - val_loss: 0.0543 - val_accuracy: 0.7189\n",
1143 | "Epoch 82/200\n",
1144 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0548 - accuracy: 0.7077 - val_loss: 0.0539 - val_accuracy: 0.7222\n",
1145 | "Epoch 83/200\n",
1146 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0544 - accuracy: 0.7109 - val_loss: 0.0534 - val_accuracy: 0.7245\n",
1147 | "Epoch 84/200\n",
1148 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0540 - accuracy: 0.7133 - val_loss: 0.0530 - val_accuracy: 0.7282\n",
1149 | "Epoch 85/200\n",
1150 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0535 - accuracy: 0.7164 - val_loss: 0.0526 - val_accuracy: 0.7303\n",
1151 | "Epoch 86/200\n",
1152 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0531 - accuracy: 0.7193 - val_loss: 0.0522 - val_accuracy: 0.7330\n",
1153 | "Epoch 87/200\n",
1154 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0527 - accuracy: 0.7220 - val_loss: 0.0517 - val_accuracy: 0.7357\n",
1155 | "Epoch 88/200\n",
1156 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0523 - accuracy: 0.7242 - val_loss: 0.0513 - val_accuracy: 0.7381\n",
1157 | "Epoch 89/200\n",
1158 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0519 - accuracy: 0.7267 - val_loss: 0.0509 - val_accuracy: 0.7408\n",
1159 | "Epoch 90/200\n",
1160 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0515 - accuracy: 0.7294 - val_loss: 0.0505 - val_accuracy: 0.7440\n",
1161 | "Epoch 91/200\n",
1162 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0511 - accuracy: 0.7326 - val_loss: 0.0501 - val_accuracy: 0.7453\n",
1163 | "Epoch 92/200\n",
1164 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0507 - accuracy: 0.7348 - val_loss: 0.0497 - val_accuracy: 0.7482\n",
1165 | "Epoch 93/200\n",
1166 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0503 - accuracy: 0.7371 - val_loss: 0.0493 - val_accuracy: 0.7501\n",
1167 | "Epoch 94/200\n",
1168 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0499 - accuracy: 0.7395 - val_loss: 0.0489 - val_accuracy: 0.7515\n",
1169 | "Epoch 95/200\n",
1170 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0495 - accuracy: 0.7413 - val_loss: 0.0485 - val_accuracy: 0.7523\n",
1171 | "Epoch 96/200\n",
1172 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0492 - accuracy: 0.7431 - val_loss: 0.0482 - val_accuracy: 0.7548\n",
1173 | "Epoch 97/200\n",
1174 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0488 - accuracy: 0.7450 - val_loss: 0.0478 - val_accuracy: 0.7562\n",
1175 | "Epoch 98/200\n",
1176 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0484 - accuracy: 0.7471 - val_loss: 0.0474 - val_accuracy: 0.7575\n",
1177 | "Epoch 99/200\n",
1178 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0481 - accuracy: 0.7491 - val_loss: 0.0471 - val_accuracy: 0.7586\n",
1179 | "Epoch 100/200\n",
1180 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0477 - accuracy: 0.7506 - val_loss: 0.0467 - val_accuracy: 0.7607\n",
1181 | "Epoch 101/200\n",
1182 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0474 - accuracy: 0.7520 - val_loss: 0.0464 - val_accuracy: 0.7626\n",
1183 | "Epoch 102/200\n",
1184 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0470 - accuracy: 0.7542 - val_loss: 0.0460 - val_accuracy: 0.7642\n",
1185 | "Epoch 103/200\n",
1186 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0467 - accuracy: 0.7554 - val_loss: 0.0457 - val_accuracy: 0.7656\n",
1187 | "Epoch 104/200\n",
1188 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0464 - accuracy: 0.7571 - val_loss: 0.0453 - val_accuracy: 0.7665\n",
1189 | "Epoch 105/200\n",
1190 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0460 - accuracy: 0.7582 - val_loss: 0.0450 - val_accuracy: 0.7681\n",
1191 | "Epoch 106/200\n",
1192 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0457 - accuracy: 0.7600 - val_loss: 0.0447 - val_accuracy: 0.7692\n",
1193 | "Epoch 107/200\n",
1194 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0454 - accuracy: 0.7608 - val_loss: 0.0443 - val_accuracy: 0.7703\n",
1195 | "Epoch 108/200\n",
1196 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0451 - accuracy: 0.7623 - val_loss: 0.0440 - val_accuracy: 0.7715\n",
1197 | "Epoch 109/200\n",
1198 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0447 - accuracy: 0.7634 - val_loss: 0.0437 - val_accuracy: 0.7730\n",
1199 | "Epoch 110/200\n",
1200 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0444 - accuracy: 0.7649 - val_loss: 0.0434 - val_accuracy: 0.7746\n",
1201 | "Epoch 111/200\n",
1202 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0441 - accuracy: 0.7659 - val_loss: 0.0431 - val_accuracy: 0.7762\n",
1203 | "Epoch 112/200\n",
1204 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0438 - accuracy: 0.7670 - val_loss: 0.0428 - val_accuracy: 0.7770\n",
1205 | "Epoch 113/200\n",
1206 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0435 - accuracy: 0.7684 - val_loss: 0.0425 - val_accuracy: 0.7781\n",
1207 | "Epoch 114/200\n",
1208 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0432 - accuracy: 0.7696 - val_loss: 0.0422 - val_accuracy: 0.7793\n",
1209 | "Epoch 115/200\n",
1210 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0429 - accuracy: 0.7704 - val_loss: 0.0419 - val_accuracy: 0.7798\n",
1211 | "Epoch 116/200\n",
1212 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0427 - accuracy: 0.7718 - val_loss: 0.0416 - val_accuracy: 0.7812\n",
1213 | "Epoch 117/200\n",
1214 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0424 - accuracy: 0.7732 - val_loss: 0.0413 - val_accuracy: 0.7827\n",
1215 | "Epoch 118/200\n",
1216 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0421 - accuracy: 0.7745 - val_loss: 0.0411 - val_accuracy: 0.7845\n",
1217 | "Epoch 119/200\n",
1218 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0418 - accuracy: 0.7757 - val_loss: 0.0408 - val_accuracy: 0.7865\n",
1219 | "Epoch 120/200\n",
1220 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0415 - accuracy: 0.7771 - val_loss: 0.0405 - val_accuracy: 0.7878\n",
1221 | "Epoch 121/200\n",
1222 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0413 - accuracy: 0.7785 - val_loss: 0.0402 - val_accuracy: 0.7887\n",
1223 | "Epoch 122/200\n",
1224 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0410 - accuracy: 0.7797 - val_loss: 0.0400 - val_accuracy: 0.7901\n",
1225 | "Epoch 123/200\n",
1226 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0408 - accuracy: 0.7817 - val_loss: 0.0397 - val_accuracy: 0.7915\n",
1227 | "Epoch 124/200\n",
1228 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0405 - accuracy: 0.7836 - val_loss: 0.0394 - val_accuracy: 0.7930\n",
1229 | "Epoch 125/200\n",
1230 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0402 - accuracy: 0.7848 - val_loss: 0.0392 - val_accuracy: 0.7942\n",
1231 | "Epoch 126/200\n",
1232 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0400 - accuracy: 0.7863 - val_loss: 0.0389 - val_accuracy: 0.7958\n",
1233 | "Epoch 127/200\n",
1234 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0397 - accuracy: 0.7878 - val_loss: 0.0387 - val_accuracy: 0.7985\n",
1235 | "Epoch 128/200\n",
1236 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0395 - accuracy: 0.7895 - val_loss: 0.0384 - val_accuracy: 0.8010\n",
1237 | "Epoch 129/200\n",
1238 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0392 - accuracy: 0.7913 - val_loss: 0.0382 - val_accuracy: 0.8033\n",
1239 | "Epoch 130/200\n",
1240 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0390 - accuracy: 0.7928 - val_loss: 0.0379 - val_accuracy: 0.8048\n",
1241 | "Epoch 131/200\n",
1242 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0388 - accuracy: 0.7950 - val_loss: 0.0377 - val_accuracy: 0.8066\n",
1243 | "Epoch 132/200\n",
1244 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0385 - accuracy: 0.7965 - val_loss: 0.0375 - val_accuracy: 0.8087\n",
1245 | "Epoch 133/200\n",
1246 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0383 - accuracy: 0.7983 - val_loss: 0.0372 - val_accuracy: 0.8101\n",
1247 | "Epoch 134/200\n",
1248 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0381 - accuracy: 0.7996 - val_loss: 0.0370 - val_accuracy: 0.8119\n",
1249 | "Epoch 135/200\n",
1250 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0378 - accuracy: 0.8017 - val_loss: 0.0368 - val_accuracy: 0.8139\n",
1251 | "Epoch 136/200\n",
1252 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0376 - accuracy: 0.8032 - val_loss: 0.0365 - val_accuracy: 0.8160\n",
1253 | "Epoch 137/200\n",
1254 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0374 - accuracy: 0.8051 - val_loss: 0.0363 - val_accuracy: 0.8190\n",
1255 | "Epoch 138/200\n",
1256 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0372 - accuracy: 0.8069 - val_loss: 0.0361 - val_accuracy: 0.8201\n",
1257 | "Epoch 139/200\n",
1258 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0370 - accuracy: 0.8084 - val_loss: 0.0359 - val_accuracy: 0.8219\n",
1259 | "Epoch 140/200\n",
1260 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0367 - accuracy: 0.8104 - val_loss: 0.0357 - val_accuracy: 0.8234\n",
1261 | "Epoch 141/200\n",
1262 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0365 - accuracy: 0.8121 - val_loss: 0.0355 - val_accuracy: 0.8246\n",
1263 | "Epoch 142/200\n",
1264 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0363 - accuracy: 0.8138 - val_loss: 0.0352 - val_accuracy: 0.8261\n",
1265 | "Epoch 143/200\n",
1266 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0361 - accuracy: 0.8150 - val_loss: 0.0350 - val_accuracy: 0.8271\n",
1267 | "Epoch 144/200\n",
1268 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0359 - accuracy: 0.8165 - val_loss: 0.0348 - val_accuracy: 0.8284\n",
1269 | "Epoch 145/200\n",
1270 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0357 - accuracy: 0.8182 - val_loss: 0.0346 - val_accuracy: 0.8295\n",
1271 | "Epoch 146/200\n",
1272 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0355 - accuracy: 0.8193 - val_loss: 0.0344 - val_accuracy: 0.8307\n",
1273 | "Epoch 147/200\n",
1274 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0353 - accuracy: 0.8208 - val_loss: 0.0342 - val_accuracy: 0.8310\n",
1275 | "Epoch 148/200\n",
1276 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0351 - accuracy: 0.8222 - val_loss: 0.0340 - val_accuracy: 0.8327\n",
1277 | "Epoch 149/200\n",
1278 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0349 - accuracy: 0.8238 - val_loss: 0.0338 - val_accuracy: 0.8338\n",
1279 | "Epoch 150/200\n",
1280 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0347 - accuracy: 0.8251 - val_loss: 0.0336 - val_accuracy: 0.8352\n",
1281 | "Epoch 151/200\n",
1282 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0345 - accuracy: 0.8261 - val_loss: 0.0334 - val_accuracy: 0.8355\n",
1283 | "Epoch 152/200\n",
1284 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0344 - accuracy: 0.8273 - val_loss: 0.0333 - val_accuracy: 0.8367\n",
1285 | "Epoch 153/200\n",
1286 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0342 - accuracy: 0.8281 - val_loss: 0.0331 - val_accuracy: 0.8380\n",
1287 | "Epoch 154/200\n",
1288 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0340 - accuracy: 0.8294 - val_loss: 0.0329 - val_accuracy: 0.8402\n",
1289 | "Epoch 155/200\n",
1290 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0338 - accuracy: 0.8305 - val_loss: 0.0327 - val_accuracy: 0.8412\n",
1291 | "Epoch 156/200\n",
1292 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0336 - accuracy: 0.8319 - val_loss: 0.0325 - val_accuracy: 0.8415\n",
1293 | "Epoch 157/200\n",
1294 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0335 - accuracy: 0.8329 - val_loss: 0.0324 - val_accuracy: 0.8426\n",
1295 | "Epoch 158/200\n",
1296 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0333 - accuracy: 0.8339 - val_loss: 0.0322 - val_accuracy: 0.8429\n",
1297 | "Epoch 159/200\n",
1298 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0331 - accuracy: 0.8347 - val_loss: 0.0320 - val_accuracy: 0.8436\n",
1299 | "Epoch 160/200\n",
1300 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0329 - accuracy: 0.8359 - val_loss: 0.0318 - val_accuracy: 0.8451\n",
1301 | "Epoch 161/200\n",
1302 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0328 - accuracy: 0.8368 - val_loss: 0.0317 - val_accuracy: 0.8456\n",
1303 | "Epoch 162/200\n",
1304 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0326 - accuracy: 0.8378 - val_loss: 0.0315 - val_accuracy: 0.8467\n",
1305 | "Epoch 163/200\n",
1306 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0324 - accuracy: 0.8383 - val_loss: 0.0313 - val_accuracy: 0.8472\n",
1307 | "Epoch 164/200\n",
1308 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0323 - accuracy: 0.8394 - val_loss: 0.0312 - val_accuracy: 0.8474\n",
1309 | "Epoch 165/200\n",
1310 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0321 - accuracy: 0.8401 - val_loss: 0.0310 - val_accuracy: 0.8488\n",
1311 | "Epoch 166/200\n",
1312 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0320 - accuracy: 0.8408 - val_loss: 0.0309 - val_accuracy: 0.8494\n",
1313 | "Epoch 167/200\n",
1314 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0318 - accuracy: 0.8414 - val_loss: 0.0307 - val_accuracy: 0.8500\n",
1315 | "Epoch 168/200\n",
1316 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0316 - accuracy: 0.8422 - val_loss: 0.0305 - val_accuracy: 0.8508\n",
1317 | "Epoch 169/200\n",
1318 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0315 - accuracy: 0.8429 - val_loss: 0.0304 - val_accuracy: 0.8521\n",
1319 | "Epoch 170/200\n",
1320 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0313 - accuracy: 0.8436 - val_loss: 0.0302 - val_accuracy: 0.8525\n",
1321 | "Epoch 171/200\n",
1322 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0312 - accuracy: 0.8443 - val_loss: 0.0301 - val_accuracy: 0.8535\n",
1323 | "Epoch 172/200\n",
1324 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0310 - accuracy: 0.8449 - val_loss: 0.0299 - val_accuracy: 0.8547\n",
1325 | "Epoch 173/200\n",
1326 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0309 - accuracy: 0.8455 - val_loss: 0.0298 - val_accuracy: 0.8552\n",
1327 | "Epoch 174/200\n",
1328 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0308 - accuracy: 0.8462 - val_loss: 0.0297 - val_accuracy: 0.8560\n",
1329 | "Epoch 175/200\n",
1330 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0306 - accuracy: 0.8470 - val_loss: 0.0295 - val_accuracy: 0.8565\n",
1331 | "Epoch 176/200\n",
1332 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0305 - accuracy: 0.8474 - val_loss: 0.0294 - val_accuracy: 0.8572\n",
1333 | "Epoch 177/200\n",
1334 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0303 - accuracy: 0.8479 - val_loss: 0.0292 - val_accuracy: 0.8576\n",
1335 | "Epoch 178/200\n",
1336 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0302 - accuracy: 0.8486 - val_loss: 0.0291 - val_accuracy: 0.8582\n",
1337 | "Epoch 179/200\n",
1338 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0301 - accuracy: 0.8494 - val_loss: 0.0290 - val_accuracy: 0.8590\n",
1339 | "Epoch 180/200\n",
1340 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0299 - accuracy: 0.8499 - val_loss: 0.0288 - val_accuracy: 0.8596\n",
1341 | "Epoch 181/200\n",
1342 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0298 - accuracy: 0.8505 - val_loss: 0.0287 - val_accuracy: 0.8601\n",
1343 | "Epoch 182/200\n",
1344 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0297 - accuracy: 0.8513 - val_loss: 0.0286 - val_accuracy: 0.8606\n",
1345 | "Epoch 183/200\n",
1346 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0295 - accuracy: 0.8519 - val_loss: 0.0284 - val_accuracy: 0.8612\n",
1347 | "Epoch 184/200\n",
1348 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0294 - accuracy: 0.8523 - val_loss: 0.0283 - val_accuracy: 0.8618\n",
1349 | "Epoch 185/200\n",
1350 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0293 - accuracy: 0.8529 - val_loss: 0.0282 - val_accuracy: 0.8625\n",
1351 | "Epoch 186/200\n",
1352 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0292 - accuracy: 0.8533 - val_loss: 0.0281 - val_accuracy: 0.8630\n",
1353 | "Epoch 187/200\n",
1354 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0290 - accuracy: 0.8538 - val_loss: 0.0279 - val_accuracy: 0.8633\n",
1355 | "Epoch 188/200\n",
1356 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0289 - accuracy: 0.8543 - val_loss: 0.0278 - val_accuracy: 0.8637\n",
1357 | "Epoch 189/200\n",
1358 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0288 - accuracy: 0.8547 - val_loss: 0.0277 - val_accuracy: 0.8640\n",
1359 | "Epoch 190/200\n",
1360 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0287 - accuracy: 0.8552 - val_loss: 0.0276 - val_accuracy: 0.8648\n",
1361 | "Epoch 191/200\n",
1362 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0286 - accuracy: 0.8557 - val_loss: 0.0275 - val_accuracy: 0.8653\n",
1363 | "Epoch 192/200\n",
1364 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0284 - accuracy: 0.8561 - val_loss: 0.0273 - val_accuracy: 0.8655\n",
1365 | "Epoch 193/200\n",
1366 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0283 - accuracy: 0.8566 - val_loss: 0.0272 - val_accuracy: 0.8663\n",
1367 | "Epoch 194/200\n",
1368 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0282 - accuracy: 0.8570 - val_loss: 0.0271 - val_accuracy: 0.8665\n",
1369 | "Epoch 195/200\n",
1370 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0281 - accuracy: 0.8574 - val_loss: 0.0270 - val_accuracy: 0.8669\n",
1371 | "Epoch 196/200\n",
1372 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0280 - accuracy: 0.8577 - val_loss: 0.0269 - val_accuracy: 0.8672\n",
1373 | "Epoch 197/200\n",
1374 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0279 - accuracy: 0.8583 - val_loss: 0.0268 - val_accuracy: 0.8675\n",
1375 | "Epoch 198/200\n",
1376 | "469/469 [==============================] - 1s 2ms/step - loss: 0.0278 - accuracy: 0.8589 - val_loss: 0.0267 - val_accuracy: 0.8681\n",
1377 | "Epoch 199/200\n",
1378 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0277 - accuracy: 0.8592 - val_loss: 0.0266 - val_accuracy: 0.8684\n",
1379 | "Epoch 200/200\n",
1380 | "469/469 [==============================] - 1s 3ms/step - loss: 0.0276 - accuracy: 0.8596 - val_loss: 0.0265 - val_accuracy: 0.8689\n"
1381 | ],
1382 | "name": "stdout"
1383 | },
1384 | {
1385 | "output_type": "execute_result",
1386 | "data": {
1387 | "text/plain": [
1388 | ""
1389 | ]
1390 | },
1391 | "metadata": {
1392 | "tags": []
1393 | },
1394 | "execution_count": 23
1395 | }
1396 | ]
1397 | },
1398 | {
1399 | "cell_type": "markdown",
1400 | "metadata": {
1401 | "id": "hzhKX6mHjjrV",
1402 | "colab_type": "text"
1403 | },
1404 | "source": [
1405 | "#### Performing Inference"
1406 | ]
1407 | },
1408 | {
1409 | "cell_type": "code",
1410 | "metadata": {
1411 | "id": "iobxsDEPkenJ",
1412 | "colab_type": "code",
1413 | "colab": {}
1414 | },
1415 | "source": [
1416 | "valid_0 = X_valid[0].reshape(1, 784)"
1417 | ],
1418 | "execution_count": 0,
1419 | "outputs": []
1420 | },
1421 | {
1422 | "cell_type": "code",
1423 | "metadata": {
1424 | "id": "wUc2kS7DkieS",
1425 | "colab_type": "code",
1426 | "outputId": "636f29b3-f4ae-46c6-82b0-20d13ca7fec5",
1427 | "colab": {
1428 | "base_uri": "https://localhost:8080/",
1429 | "height": 69
1430 | }
1431 | },
1432 | "source": [
1433 | "model.predict(valid_0)"
1434 | ],
1435 | "execution_count": 25,
1436 | "outputs": [
1437 | {
1438 | "output_type": "execute_result",
1439 | "data": {
1440 | "text/plain": [
1441 | "array([[3.7457894e-03, 1.3807167e-03, 1.5720883e-03, 5.4541784e-03,\n",
1442 | " 4.0015448e-03, 5.8186613e-03, 5.3481519e-04, 9.4548440e-01,\n",
1443 | " 1.8646236e-03, 3.0143155e-02]], dtype=float32)"
1444 | ]
1445 | },
1446 | "metadata": {
1447 | "tags": []
1448 | },
1449 | "execution_count": 25
1450 | }
1451 | ]
1452 | },
1453 | {
1454 | "cell_type": "code",
1455 | "metadata": {
1456 | "id": "q0gXelFOrrtp",
1457 | "colab_type": "code",
1458 | "colab": {}
1459 | },
1460 | "source": [
1461 | "import numpy as np"
1462 | ],
1463 | "execution_count": 0,
1464 | "outputs": []
1465 | },
1466 | {
1467 | "cell_type": "code",
1468 | "metadata": {
1469 | "id": "eAyaOgPdkldm",
1470 | "colab_type": "code",
1471 | "outputId": "c2351a42-f85a-4ac7-a064-eb6c9fbdef77",
1472 | "colab": {
1473 | "base_uri": "https://localhost:8080/",
1474 | "height": 34
1475 | }
1476 | },
1477 | "source": [
1478 | "np.argmax(model.predict(valid_0), axis=-1)"
1479 | ],
1480 | "execution_count": 30,
1481 | "outputs": [
1482 | {
1483 | "output_type": "execute_result",
1484 | "data": {
1485 | "text/plain": [
1486 | "array([7])"
1487 | ]
1488 | },
1489 | "metadata": {
1490 | "tags": []
1491 | },
1492 | "execution_count": 30
1493 | }
1494 | ]
1495 | },
1496 | {
1497 | "cell_type": "code",
1498 | "metadata": {
1499 | "id": "sWAx8Xs_kolW",
1500 | "colab_type": "code",
1501 | "colab": {}
1502 | },
1503 | "source": [
1504 | ""
1505 | ],
1506 | "execution_count": 0,
1507 | "outputs": []
1508 | }
1509 | ]
1510 | }
--------------------------------------------------------------------------------
/notebooks/shallow_net_DEMO.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "shallow_net.ipynb",
7 | "provenance": [],
8 | "include_colab_link": true
9 | },
10 | "kernelspec": {
11 | "name": "python3",
12 | "display_name": "Python 3"
13 | },
14 | "accelerator": "TPU"
15 | },
16 | "cells": [
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {
20 | "id": "view-in-github",
21 | "colab_type": "text"
22 | },
23 | "source": [
24 | "
"
25 | ]
26 | },
27 | {
28 | "cell_type": "markdown",
29 | "metadata": {
30 | "id": "iXlSZrKWUrKe",
31 | "colab_type": "text"
32 | },
33 | "source": [
34 | "# Shallow Neural Network (in TensorFlow 2) DEMO\n",
35 | "\n",
36 | "A shallow neural network that classifies MNIST digits.\n",
37 | "\n",
38 | "_Remember to change your Runtime to GPU or TPU._"
39 | ]
40 | },
41 | {
42 | "cell_type": "markdown",
43 | "metadata": {
44 | "id": "73o58FcYZ0zM",
45 | "colab_type": "text"
46 | },
47 | "source": [
48 | "#### Load dependencies"
49 | ]
50 | },
51 | {
52 | "cell_type": "code",
53 | "metadata": {
54 | "id": "dENc85VWa7OZ",
55 | "colab_type": "code",
56 | "colab": {}
57 | },
58 | "source": [
59 | "!pip freeze | grep tensorflow"
60 | ],
61 | "execution_count": 0,
62 | "outputs": []
63 | },
64 | {
65 | "cell_type": "code",
66 | "metadata": {
67 | "id": "QTF7OhJQbBut",
68 | "colab_type": "code",
69 | "colab": {}
70 | },
71 | "source": [
72 | "import tensorflow as tf\n",
73 | "from tensorflow import keras"
74 | ],
75 | "execution_count": 0,
76 | "outputs": []
77 | },
78 | {
79 | "cell_type": "markdown",
80 | "metadata": {
81 | "id": "MxdWaDnMbrw9",
82 | "colab_type": "text"
83 | },
84 | "source": [
85 | "#### Load data"
86 | ]
87 | },
88 | {
89 | "cell_type": "code",
90 | "metadata": {
91 | "id": "wH9kdTH8bxty",
92 | "colab_type": "code",
93 | "colab": {}
94 | },
95 | "source": [
96 | "(X_train, y_train), (X_valid, y_valid) = keras.datasets.mnist.load_data()"
97 | ],
98 | "execution_count": 0,
99 | "outputs": []
100 | },
101 | {
102 | "cell_type": "code",
103 | "metadata": {
104 | "id": "uZ2PPkMKcC1S",
105 | "colab_type": "code",
106 | "colab": {}
107 | },
108 | "source": [
109 | "X_train.shape"
110 | ],
111 | "execution_count": 0,
112 | "outputs": []
113 | },
114 | {
115 | "cell_type": "code",
116 | "metadata": {
117 | "id": "B_oHXNAgcGn-",
118 | "colab_type": "code",
119 | "colab": {}
120 | },
121 | "source": [
122 | "y_train.shape"
123 | ],
124 | "execution_count": 0,
125 | "outputs": []
126 | },
127 | {
128 | "cell_type": "code",
129 | "metadata": {
130 | "id": "KfHwa61ycLZc",
131 | "colab_type": "code",
132 | "colab": {}
133 | },
134 | "source": [
135 | "y_train[0:12]"
136 | ],
137 | "execution_count": 0,
138 | "outputs": []
139 | },
140 | {
141 | "cell_type": "code",
142 | "metadata": {
143 | "id": "btF3_fWOegzU",
144 | "colab_type": "code",
145 | "colab": {}
146 | },
147 | "source": [
148 | "from matplotlib import pyplot as plt\n",
149 | "plt.figure(figsize=(5,5))\n",
150 | "for k in range(12):\n",
151 | " plt.subplot(3, 4, k+1)\n",
152 | " plt.imshow(X_train[k], cmap='Greys')\n",
153 | " plt.axis('off')\n",
154 | "plt.tight_layout()\n",
155 | "plt.show()"
156 | ],
157 | "execution_count": 0,
158 | "outputs": []
159 | },
160 | {
161 | "cell_type": "code",
162 | "metadata": {
163 | "id": "pFT_CIJbep24",
164 | "colab_type": "code",
165 | "colab": {}
166 | },
167 | "source": [
168 | "X_valid.shape"
169 | ],
170 | "execution_count": 0,
171 | "outputs": []
172 | },
173 | {
174 | "cell_type": "code",
175 | "metadata": {
176 | "id": "CgQi3oC4esYo",
177 | "colab_type": "code",
178 | "colab": {}
179 | },
180 | "source": [
181 | "y_valid.shape"
182 | ],
183 | "execution_count": 0,
184 | "outputs": []
185 | },
186 | {
187 | "cell_type": "code",
188 | "metadata": {
189 | "id": "GwwJ04ZOettt",
190 | "colab_type": "code",
191 | "colab": {}
192 | },
193 | "source": [
194 | "plt.imshow(X_valid[0], cmap=\"Greys\")"
195 | ],
196 | "execution_count": 0,
197 | "outputs": []
198 | },
199 | {
200 | "cell_type": "code",
201 | "metadata": {
202 | "id": "yKQKR_AIezMg",
203 | "colab_type": "code",
204 | "colab": {}
205 | },
206 | "source": [
207 | "X_valid[0]"
208 | ],
209 | "execution_count": 0,
210 | "outputs": []
211 | },
212 | {
213 | "cell_type": "code",
214 | "metadata": {
215 | "id": "RZ6J0L1fe1m4",
216 | "colab_type": "code",
217 | "colab": {}
218 | },
219 | "source": [
220 | "y_valid[0]"
221 | ],
222 | "execution_count": 0,
223 | "outputs": []
224 | },
225 | {
226 | "cell_type": "markdown",
227 | "metadata": {
228 | "id": "jyMuVQvibzRu",
229 | "colab_type": "text"
230 | },
231 | "source": [
232 | "#### Preprocess data"
233 | ]
234 | },
235 | {
236 | "cell_type": "code",
237 | "metadata": {
238 | "id": "Hw0FtUpYb4Ik",
239 | "colab_type": "code",
240 | "colab": {}
241 | },
242 | "source": [
243 | "X_train = X_train.reshape(60000, 784).astype('float32')\n",
244 | "X_valid = X_valid.reshape(10000, 784).astype('float32')"
245 | ],
246 | "execution_count": 0,
247 | "outputs": []
248 | },
249 | {
250 | "cell_type": "code",
251 | "metadata": {
252 | "id": "EkyGxyRIb5md",
253 | "colab_type": "code",
254 | "colab": {}
255 | },
256 | "source": [
257 | "X_train /= 255\n",
258 | "X_valid /= 255"
259 | ],
260 | "execution_count": 0,
261 | "outputs": []
262 | },
263 | {
264 | "cell_type": "code",
265 | "metadata": {
266 | "id": "kxRjPNpNe-Gm",
267 | "colab_type": "code",
268 | "colab": {}
269 | },
270 | "source": [
271 | "X_valid[0]"
272 | ],
273 | "execution_count": 0,
274 | "outputs": []
275 | },
276 | {
277 | "cell_type": "code",
278 | "metadata": {
279 | "id": "M7rJ2C_ob6e9",
280 | "colab_type": "code",
281 | "colab": {}
282 | },
283 | "source": [
284 | "n_classes = 10\n",
285 | "y_train = keras.utils.to_categorical(y_train, n_classes)\n",
286 | "y_valid = keras.utils.to_categorical(y_valid, n_classes)"
287 | ],
288 | "execution_count": 0,
289 | "outputs": []
290 | },
291 | {
292 | "cell_type": "code",
293 | "metadata": {
294 | "id": "20zL0e_ZfDxo",
295 | "colab_type": "code",
296 | "colab": {}
297 | },
298 | "source": [
299 | "y_valid[0]"
300 | ],
301 | "execution_count": 0,
302 | "outputs": []
303 | },
304 | {
305 | "cell_type": "markdown",
306 | "metadata": {
307 | "id": "FrDbdiVqb7eN",
308 | "colab_type": "text"
309 | },
310 | "source": [
311 | "#### Design neural network architecture"
312 | ]
313 | },
314 | {
315 | "cell_type": "code",
316 | "metadata": {
317 | "id": "pTgQAJCFb-Tm",
318 | "colab_type": "code",
319 | "colab": {}
320 | },
321 | "source": [
322 | "model = keras.models.Sequential([\n",
323 | " \n",
324 | " keras.layers.Dense(64, activation='sigmoid', input_shape=(784,)),\n",
325 | " keras.layers.Dense(10, activation='softmax')\n",
326 | " \n",
327 | "])"
328 | ],
329 | "execution_count": 0,
330 | "outputs": []
331 | },
332 | {
333 | "cell_type": "code",
334 | "metadata": {
335 | "id": "EzSU6ALogRJv",
336 | "colab_type": "code",
337 | "colab": {}
338 | },
339 | "source": [
340 | "model.summary()"
341 | ],
342 | "execution_count": 0,
343 | "outputs": []
344 | },
345 | {
346 | "cell_type": "code",
347 | "metadata": {
348 | "id": "ZmKYRyaTgTTx",
349 | "colab_type": "code",
350 | "colab": {}
351 | },
352 | "source": [
353 | "64*784"
354 | ],
355 | "execution_count": 0,
356 | "outputs": []
357 | },
358 | {
359 | "cell_type": "code",
360 | "metadata": {
361 | "id": "yLgX7mIMgXVR",
362 | "colab_type": "code",
363 | "colab": {}
364 | },
365 | "source": [
366 | "(64*784)+64"
367 | ],
368 | "execution_count": 0,
369 | "outputs": []
370 | },
371 | {
372 | "cell_type": "code",
373 | "metadata": {
374 | "id": "Ep92qZmsgarR",
375 | "colab_type": "code",
376 | "colab": {}
377 | },
378 | "source": [
379 | "(10*64)+10"
380 | ],
381 | "execution_count": 0,
382 | "outputs": []
383 | },
384 | {
385 | "cell_type": "markdown",
386 | "metadata": {
387 | "id": "-W1ljeaGgdpA",
388 | "colab_type": "text"
389 | },
390 | "source": [
391 | "#### Configure model"
392 | ]
393 | },
394 | {
395 | "cell_type": "code",
396 | "metadata": {
397 | "id": "2YI73ZvYgheG",
398 | "colab_type": "code",
399 | "colab": {}
400 | },
401 | "source": [
402 | "model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])"
403 | ],
404 | "execution_count": 0,
405 | "outputs": []
406 | },
407 | {
408 | "cell_type": "markdown",
409 | "metadata": {
410 | "id": "NV9-heXwgqO2",
411 | "colab_type": "text"
412 | },
413 | "source": [
414 | "#### Train!"
415 | ]
416 | },
417 | {
418 | "cell_type": "code",
419 | "metadata": {
420 | "id": "WtgS2Xhmgx4X",
421 | "colab_type": "code",
422 | "colab": {}
423 | },
424 | "source": [
425 | "model.fit(X_train, y_train, batch_size=128, epochs=200, verbose=1, validation_data=(X_valid, y_valid))"
426 | ],
427 | "execution_count": 0,
428 | "outputs": []
429 | },
430 | {
431 | "cell_type": "markdown",
432 | "metadata": {
433 | "id": "pxDdPXjzQPU2",
434 | "colab_type": "text"
435 | },
436 | "source": [
437 | "#### Perform inference"
438 | ]
439 | },
440 | {
441 | "cell_type": "code",
442 | "metadata": {
443 | "id": "vBihHgunQDtT",
444 | "colab_type": "code",
445 | "colab": {}
446 | },
447 | "source": [
448 | "valid_0 = X_valid[0].reshape(1, 784)"
449 | ],
450 | "execution_count": 0,
451 | "outputs": []
452 | },
453 | {
454 | "cell_type": "code",
455 | "metadata": {
456 | "id": "Vf5hJOTgQX78",
457 | "colab_type": "code",
458 | "colab": {}
459 | },
460 | "source": [
461 | "model.predict(valid_0)"
462 | ],
463 | "execution_count": 0,
464 | "outputs": []
465 | },
466 | {
467 | "cell_type": "code",
468 | "metadata": {
469 | "id": "A-MS2axlQZYy",
470 | "colab_type": "code",
471 | "colab": {}
472 | },
473 | "source": [
474 | "import numpy as np"
475 | ],
476 | "execution_count": 0,
477 | "outputs": []
478 | },
479 | {
480 | "cell_type": "code",
481 | "metadata": {
482 | "id": "zqPu9wfvtdGY",
483 | "colab_type": "code",
484 | "colab": {}
485 | },
486 | "source": [
487 | "np.argmax(model.predict(valid_0), axis=-1)"
488 | ],
489 | "execution_count": 0,
490 | "outputs": []
491 | }
492 | ]
493 | }
--------------------------------------------------------------------------------