├── .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 | ![](https://github.com/illustrated-series/deep-learning-illustrated/blob/master/img/bespectacled_trilobite.jpeg) 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 | "\"Open" 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 | "\"Open" 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 | "\"Open" 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 | "\"Open" 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 | "\"Open" 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 | } --------------------------------------------------------------------------------