├── CNN.ipynb ├── DataAug.ipynb ├── DeepLearning.ipynb ├── Keras_Prerequisites.ipynb ├── MobileNet.ipynb ├── README.md ├── SimpleSequentialModel.ipynb └── flask_apps ├── README.md ├── hello_app.py ├── predict_app.py ├── sample_app.py └── static ├── hello.html ├── predict-with-visuals.html └── predict.html /DeepLearning.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Deep Learning Playlist\n", 8 | "### Discussion\n", 9 | "\n", 10 | "Deep learning terms and topics\n", 11 | "\n", 12 | "- Understand what they mean\n", 13 | "- How they fit in to the overall deep learning framework\n", 14 | "- How certain topics are implemented in code\n", 15 | " - Using Keras" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "## Machine Learning (ML)" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "Machine Learning is the practice of using algorithms to analyze data, learn from that data, and then make a determination or prediction about new data. " 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "### Machine Learning vs. Traditional Programming" 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "metadata": {}, 42 | "source": [ 43 | "Example: Analyzing the sentament of a popular media outlet and classifying that sentiment as positive or negative\n", 44 | "\n", 45 | "- Traditional Programming approach\n", 46 | " - The algorithm may first look for particular words associated with a negative or positive sentiment.\n", 47 | " - With conditional statements, the algorithm would classify articles as positive or negative based on the words that it knows are positive or negative.\n", 48 | " \n", 49 | "- Machine Learning approach\n", 50 | " - The algorithm would analyze large amounts of given media data and *learn* the features that classify what a negative article looks like versus a positive article.\n", 51 | " - With what it's learned, the algorithm could then classify new articles as positive or negative." 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "## Deep Learning (DL)" 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": {}, 64 | "source": [ 65 | "This video will cover the most basic idea about what deep learning is and how it’s used. In later videos, we’ll be cover more detailed concepts, terms, and tools within the field of deep learning.\n", 66 | "\n", 67 | "**Definition:**\n", 68 | "\n", 69 | "- Deep learning is a subfield of machine learning that uses algorithms inspired by the structure and function of the brain’s neural networks. \n", 70 | "- As a subfield of ML, DL also algorithms to analyze data, learn from that data, and then make a determination or prediction about new data." 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "**Supervised Learning** occurs when your deep learning model learns and makes inferences from data that has already been *labeled*.\n", 78 | "\n", 79 | "**Unsupervised Learning** occurs when the model learns and makes inferences from *unlabeled* data. " 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "**Labeled vs. Unlabeled example**\n", 87 | "\n", 88 | "- Classify images of cats and dogs" 89 | ] 90 | }, 91 | { 92 | "cell_type": "markdown", 93 | "metadata": {}, 94 | "source": [ 95 | "### Artificial Neural Networks" 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "metadata": {}, 101 | "source": [ 102 | "Artificial neural networks are deep learning models that are based on the structure of the brain's neural networks. \n", 103 | "\n", 104 | "- Artificial neural networks are used interchangeably with the terms\n", 105 | " - neural net\n", 106 | " - net\n", 107 | " - model" 108 | ] 109 | }, 110 | { 111 | "cell_type": "markdown", 112 | "metadata": {}, 113 | "source": [ 114 | "## Artificial Neural Networks (ANNs)" 115 | ] 116 | }, 117 | { 118 | "cell_type": "markdown", 119 | "metadata": {}, 120 | "source": [ 121 | "Artificial neural networks are computing systems that are inspired by the brain’s neural networks.\n", 122 | "\n", 123 | "- These networks are based on a collection of connected units called **artificial neurons**, or **neurons**. \n", 124 | "- Each connection between neurons can transmit a signal from one neuron to another. \n", 125 | "- The receiving neuron processes the signal and signals downstream neurons connected to it.\n", 126 | "- Neurons are organized in layers.\n", 127 | " - Input layer\n", 128 | " - Hidden layers\n", 129 | " - Output layer" 130 | ] 131 | }, 132 | { 133 | "cell_type": "markdown", 134 | "metadata": {}, 135 | "source": [ 136 | "### Keras Sequential Model" 137 | ] 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "metadata": {}, 142 | "source": [ 143 | "The Sequential model is a linear stack of layers." 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": null, 149 | "metadata": { 150 | "collapsed": true 151 | }, 152 | "outputs": [], 153 | "source": [ 154 | "from keras.models import Sequential\n", 155 | "from keras.layers import Dense, Activation\n", 156 | "\n", 157 | "model = Sequential([\n", 158 | " Dense(32, input_shape=(10,), activation='relu'),\n", 159 | " Dense(2, activation='softmax'),\n", 160 | "])" 161 | ] 162 | }, 163 | { 164 | "cell_type": "markdown", 165 | "metadata": { 166 | "collapsed": true 167 | }, 168 | "source": [ 169 | "## Layers in an ANN" 170 | ] 171 | }, 172 | { 173 | "cell_type": "markdown", 174 | "metadata": { 175 | "collapsed": true 176 | }, 177 | "source": [ 178 | "Artificial neural network are typically organized in layers. \n", 179 | "Different types of layers include\n", 180 | "\n", 181 | "- Dense (or fully connected) Layers\n", 182 | "- Convolutional layers\n", 183 | "- Pooling Layers\n", 184 | "- Recurrent Layers\n", 185 | "- Normalization Layers\n", 186 | "- Many others" 187 | ] 188 | }, 189 | { 190 | "cell_type": "code", 191 | "execution_count": 42, 192 | "metadata": { 193 | "collapsed": true 194 | }, 195 | "outputs": [], 196 | "source": [ 197 | "from keras.models import Sequential\n", 198 | "from keras.layers import Dense, Activation\n", 199 | "\n", 200 | "model = Sequential([\n", 201 | " Dense(5, input_shape=(3,), activation='relu'),\n", 202 | " Dense(2, activation='softmax'),\n", 203 | "])" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 17, 209 | "metadata": { 210 | "collapsed": false 211 | }, 212 | "outputs": [ 213 | { 214 | "data": { 215 | "text/plain": [ 216 | "" 217 | ] 218 | }, 219 | "execution_count": 17, 220 | "metadata": {}, 221 | "output_type": "execute_result" 222 | }, 223 | { 224 | "data": { 225 | "image/png": "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\n", 226 | "text/plain": [ 227 | "" 228 | ] 229 | }, 230 | "metadata": {}, 231 | "output_type": "display_data" 232 | } 233 | ], 234 | "source": [ 235 | "import numpy as np\n", 236 | "from scipy import ndimage\n", 237 | "import matplotlib.pyplot as plt\n", 238 | "%matplotlib inline\n", 239 | "\n", 240 | "img = np.expand_dims(ndimage.imread('NN.PNG'),0)\n", 241 | "plt.imshow(img[0])" 242 | ] 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "metadata": { 247 | "collapsed": true 248 | }, 249 | "source": [ 250 | "## Activation Functions" 251 | ] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": { 256 | "collapsed": true 257 | }, 258 | "source": [ 259 | "In an artificial neural network, the activation function of a neuron defines the output of that neuron given a set of inputs.\n", 260 | "\n", 261 | "- Biologically inspired by activity in our brains, where different neurons fire, or are *activated*, by different stimuli. " 262 | ] 263 | }, 264 | { 265 | "cell_type": "code", 266 | "execution_count": 43, 267 | "metadata": { 268 | "collapsed": true 269 | }, 270 | "outputs": [], 271 | "source": [ 272 | "from keras.models import Sequential\n", 273 | "from keras.layers import Dense, Activation\n", 274 | "\n", 275 | "model = Sequential([\n", 276 | " Dense(5, input_shape=(3,), activation='relu')\n", 277 | "])" 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": 44, 283 | "metadata": { 284 | "collapsed": true 285 | }, 286 | "outputs": [], 287 | "source": [ 288 | "model = Sequential()\n", 289 | "model.add(Dense(5, input_shape=(3,)))\n", 290 | "model.add(Activation('relu'))" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "metadata": {}, 296 | "source": [ 297 | "### Pre-process data for training" 298 | ] 299 | }, 300 | { 301 | "cell_type": "code", 302 | "execution_count": 1, 303 | "metadata": { 304 | "collapsed": true 305 | }, 306 | "outputs": [], 307 | "source": [ 308 | "import numpy as np\n", 309 | "from random import randint\n", 310 | "from sklearn.preprocessing import MinMaxScaler" 311 | ] 312 | }, 313 | { 314 | "cell_type": "code", 315 | "execution_count": 50, 316 | "metadata": { 317 | "collapsed": true 318 | }, 319 | "outputs": [], 320 | "source": [ 321 | "train_labels = []\n", 322 | "train_samples = []" 323 | ] 324 | }, 325 | { 326 | "cell_type": "markdown", 327 | "metadata": {}, 328 | "source": [ 329 | "Example data: \n", 330 | "- An experiemental drug was tested on individuals from ages 13 to 100. \n", 331 | "- The trial had 2100 participants. Half were under 65 years old, half were over 65 years old.\n", 332 | "- 95% of patientes 65 or older experienced side effects.\n", 333 | "- 95% of patients under 65 experienced no side effects." 334 | ] 335 | }, 336 | { 337 | "cell_type": "code", 338 | "execution_count": 51, 339 | "metadata": { 340 | "collapsed": true 341 | }, 342 | "outputs": [], 343 | "source": [ 344 | "for i in range(50):\n", 345 | " # The 5% of younger individuals who did experience side effects\n", 346 | " random_younger = randint(13,64)\n", 347 | " train_samples.append(random_younger)\n", 348 | " train_labels.append(1)\n", 349 | " \n", 350 | " # The 5% of older individuals who did not experience side effects\n", 351 | " random_older = randint(65,100)\n", 352 | " train_samples.append(random_older)\n", 353 | " train_labels.append(0)\n", 354 | "\n", 355 | "for i in range(1000):\n", 356 | " # The 95% of younger individuals who did not experience side effects\n", 357 | " random_younger = randint(13,64)\n", 358 | " train_samples.append(random_younger)\n", 359 | " train_labels.append(0)\n", 360 | " \n", 361 | " # The 95% of older individuals who did experience side effects\n", 362 | " random_older = randint(65,100)\n", 363 | " train_samples.append(random_older)\n", 364 | " train_labels.append(1)" 365 | ] 366 | }, 367 | { 368 | "cell_type": "code", 369 | "execution_count": 52, 370 | "metadata": { 371 | "collapsed": true 372 | }, 373 | "outputs": [], 374 | "source": [ 375 | "train_labels = np.array(train_labels)\n", 376 | "train_samples = np.array(train_samples)" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": 53, 382 | "metadata": { 383 | "collapsed": false 384 | }, 385 | "outputs": [ 386 | { 387 | "name": "stderr", 388 | "output_type": "stream", 389 | "text": [ 390 | "/home/epoch/anaconda2/envs/fastai34/lib/python3.4/site-packages/sklearn/utils/validation.py:429: DataConversionWarning: Data with input dtype int64 was converted to float64 by MinMaxScaler.\n", 391 | " warnings.warn(msg, _DataConversionWarning)\n" 392 | ] 393 | } 394 | ], 395 | "source": [ 396 | "scaler = MinMaxScaler(feature_range=(0,1))\n", 397 | "scaled_train_samples = scaler.fit_transform((train_samples).reshape(-1,1))" 398 | ] 399 | }, 400 | { 401 | "cell_type": "code", 402 | "execution_count": 45, 403 | "metadata": { 404 | "collapsed": false, 405 | "scrolled": true 406 | }, 407 | "outputs": [ 408 | { 409 | "data": { 410 | "text/plain": [ 411 | "" 412 | ] 413 | }, 414 | "execution_count": 45, 415 | "metadata": {}, 416 | "output_type": "execute_result" 417 | }, 418 | { 419 | "data": { 420 | "image/png": "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\n", 421 | "text/plain": [ 422 | "" 423 | ] 424 | }, 425 | "metadata": {}, 426 | "output_type": "display_data" 427 | } 428 | ], 429 | "source": [ 430 | "import numpy as np\n", 431 | "from scipy import ndimage\n", 432 | "import matplotlib.pyplot as plt\n", 433 | "%matplotlib inline\n", 434 | "\n", 435 | "img = np.expand_dims(ndimage.imread('NN.PNG'),0)\n", 436 | "plt.imshow(img[0])" 437 | ] 438 | }, 439 | { 440 | "cell_type": "markdown", 441 | "metadata": { 442 | "collapsed": true 443 | }, 444 | "source": [ 445 | "## Training" 446 | ] 447 | }, 448 | { 449 | "cell_type": "markdown", 450 | "metadata": { 451 | "collapsed": true 452 | }, 453 | "source": [ 454 | "Solving an optimization problem\n", 455 | " - Optimizing weights \n", 456 | " - with Stochastic Gradient Descent (SGD)\n", 457 | " - Objective: Minimize the loss function" 458 | ] 459 | }, 460 | { 461 | "cell_type": "markdown", 462 | "metadata": {}, 463 | "source": [ 464 | "## Learning" 465 | ] 466 | }, 467 | { 468 | "cell_type": "code", 469 | "execution_count": 79, 470 | "metadata": { 471 | "collapsed": true 472 | }, 473 | "outputs": [], 474 | "source": [ 475 | "import keras\n", 476 | "from keras import backend as K\n", 477 | "from keras.models import Sequential\n", 478 | "from keras.layers import Activation\n", 479 | "from keras.layers.core import Dense\n", 480 | "from keras.optimizers import Adam\n", 481 | "from keras.metrics import categorical_crossentropy" 482 | ] 483 | }, 484 | { 485 | "cell_type": "code", 486 | "execution_count": 80, 487 | "metadata": { 488 | "collapsed": true 489 | }, 490 | "outputs": [], 491 | "source": [ 492 | "model = Sequential([\n", 493 | " Dense(16, input_shape=(1,), activation='relu'),\n", 494 | " Dense(32, activation='relu'),\n", 495 | " Dense(2, activation='sigmoid')\n", 496 | "])" 497 | ] 498 | }, 499 | { 500 | "cell_type": "code", 501 | "execution_count": 81, 502 | "metadata": { 503 | "collapsed": false 504 | }, 505 | "outputs": [], 506 | "source": [ 507 | "model.compile(Adam(lr=.0001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])" 508 | ] 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": 74, 513 | "metadata": { 514 | "collapsed": false 515 | }, 516 | "outputs": [], 517 | "source": [ 518 | "model.loss = 'sparse_categorical_crossentropy'" 519 | ] 520 | }, 521 | { 522 | "cell_type": "code", 523 | "execution_count": 75, 524 | "metadata": { 525 | "collapsed": false 526 | }, 527 | "outputs": [ 528 | { 529 | "data": { 530 | "text/plain": [ 531 | "'sparse_categorical_crossentropy'" 532 | ] 533 | }, 534 | "execution_count": 75, 535 | "metadata": {}, 536 | "output_type": "execute_result" 537 | } 538 | ], 539 | "source": [ 540 | "model.loss" 541 | ] 542 | }, 543 | { 544 | "cell_type": "code", 545 | "execution_count": 58, 546 | "metadata": { 547 | "collapsed": false 548 | }, 549 | "outputs": [ 550 | { 551 | "name": "stdout", 552 | "output_type": "stream", 553 | "text": [ 554 | "Epoch 1/20\n", 555 | "0s - loss: 0.6400 - acc: 0.5576\n", 556 | "Epoch 2/20\n", 557 | "0s - loss: 0.6061 - acc: 0.6310\n", 558 | "Epoch 3/20\n", 559 | "0s - loss: 0.5748 - acc: 0.7010\n", 560 | "Epoch 4/20\n", 561 | "0s - loss: 0.5401 - acc: 0.7633\n", 562 | "Epoch 5/20\n", 563 | "0s - loss: 0.5050 - acc: 0.7990\n", 564 | "Epoch 6/20\n", 565 | "0s - loss: 0.4702 - acc: 0.8300\n", 566 | "Epoch 7/20\n", 567 | "0s - loss: 0.4366 - acc: 0.8495\n", 568 | "Epoch 8/20\n", 569 | "0s - loss: 0.4066 - acc: 0.8767\n", 570 | "Epoch 9/20\n", 571 | "0s - loss: 0.3808 - acc: 0.8814\n", 572 | "Epoch 10/20\n", 573 | "0s - loss: 0.3596 - acc: 0.8962\n", 574 | "Epoch 11/20\n", 575 | "0s - loss: 0.3420 - acc: 0.9043\n", 576 | "Epoch 12/20\n", 577 | "0s - loss: 0.3282 - acc: 0.9090\n", 578 | "Epoch 13/20\n", 579 | "0s - loss: 0.3170 - acc: 0.9129\n", 580 | "Epoch 14/20\n", 581 | "0s - loss: 0.3081 - acc: 0.9210\n", 582 | "Epoch 15/20\n", 583 | "0s - loss: 0.3014 - acc: 0.9190\n", 584 | "Epoch 16/20\n", 585 | "0s - loss: 0.2959 - acc: 0.9205\n", 586 | "Epoch 17/20\n", 587 | "0s - loss: 0.2916 - acc: 0.9238\n", 588 | "Epoch 18/20\n", 589 | "0s - loss: 0.2879 - acc: 0.9267\n", 590 | "Epoch 19/20\n", 591 | "0s - loss: 0.2848 - acc: 0.9252\n", 592 | "Epoch 20/20\n", 593 | "0s - loss: 0.2824 - acc: 0.9286\n" 594 | ] 595 | }, 596 | { 597 | "data": { 598 | "text/plain": [ 599 | "" 600 | ] 601 | }, 602 | "execution_count": 58, 603 | "metadata": {}, 604 | "output_type": "execute_result" 605 | } 606 | ], 607 | "source": [ 608 | "model.fit(scaled_train_samples, train_labels, batch_size=10, epochs=20, shuffle=True, verbose=2)" 609 | ] 610 | }, 611 | { 612 | "cell_type": "markdown", 613 | "metadata": {}, 614 | "source": [ 615 | "## Data Sets" 616 | ] 617 | }, 618 | { 619 | "cell_type": "code", 620 | "execution_count": 82, 621 | "metadata": { 622 | "collapsed": false 623 | }, 624 | "outputs": [ 625 | { 626 | "data": { 627 | "text/plain": [ 628 | "array([[ 0.27586207],\n", 629 | " [ 0.87356322],\n", 630 | " [ 0.26436782],\n", 631 | " ..., \n", 632 | " [ 0.96551724],\n", 633 | " [ 0.2183908 ],\n", 634 | " [ 0.75862069]])" 635 | ] 636 | }, 637 | "execution_count": 82, 638 | "metadata": {}, 639 | "output_type": "execute_result" 640 | } 641 | ], 642 | "source": [ 643 | "scaled_train_samples" 644 | ] 645 | }, 646 | { 647 | "cell_type": "code", 648 | "execution_count": 83, 649 | "metadata": { 650 | "collapsed": false 651 | }, 652 | "outputs": [ 653 | { 654 | "data": { 655 | "text/plain": [ 656 | "array([1, 0, 1, ..., 1, 0, 1])" 657 | ] 658 | }, 659 | "execution_count": 83, 660 | "metadata": {}, 661 | "output_type": "execute_result" 662 | } 663 | ], 664 | "source": [ 665 | "train_labels" 666 | ] 667 | }, 668 | { 669 | "cell_type": "code", 670 | "execution_count": 84, 671 | "metadata": { 672 | "collapsed": false 673 | }, 674 | "outputs": [ 675 | { 676 | "name": "stdout", 677 | "output_type": "stream", 678 | "text": [ 679 | "Train on 1680 samples, validate on 420 samples\n", 680 | "Epoch 1/20\n", 681 | "0s - loss: 0.6994 - acc: 0.4970 - val_loss: 0.6960 - val_acc: 0.5000\n", 682 | "Epoch 2/20\n", 683 | "0s - loss: 0.6906 - acc: 0.5774 - val_loss: 0.6815 - val_acc: 0.6952\n", 684 | "Epoch 3/20\n", 685 | "0s - loss: 0.6754 - acc: 0.7179 - val_loss: 0.6613 - val_acc: 0.7857\n", 686 | "Epoch 4/20\n", 687 | "0s - loss: 0.6548 - acc: 0.7720 - val_loss: 0.6341 - val_acc: 0.8333\n", 688 | "Epoch 5/20\n", 689 | "0s - loss: 0.6296 - acc: 0.7958 - val_loss: 0.6001 - val_acc: 0.8571\n", 690 | "Epoch 6/20\n", 691 | "0s - loss: 0.5951 - acc: 0.8161 - val_loss: 0.5516 - val_acc: 0.8714\n", 692 | "Epoch 7/20\n", 693 | "0s - loss: 0.5545 - acc: 0.8250 - val_loss: 0.5004 - val_acc: 0.8881\n", 694 | "Epoch 8/20\n", 695 | "0s - loss: 0.5091 - acc: 0.8446 - val_loss: 0.4400 - val_acc: 0.9119\n", 696 | "Epoch 9/20\n", 697 | "0s - loss: 0.4637 - acc: 0.8726 - val_loss: 0.3886 - val_acc: 0.9310\n", 698 | "Epoch 10/20\n", 699 | "0s - loss: 0.4283 - acc: 0.8798 - val_loss: 0.3454 - val_acc: 0.9381\n", 700 | "Epoch 11/20\n", 701 | "0s - loss: 0.3997 - acc: 0.8863 - val_loss: 0.3096 - val_acc: 0.9524\n", 702 | "Epoch 12/20\n", 703 | "0s - loss: 0.3776 - acc: 0.8917 - val_loss: 0.2805 - val_acc: 0.9524\n", 704 | "Epoch 13/20\n", 705 | "0s - loss: 0.3602 - acc: 0.8988 - val_loss: 0.2572 - val_acc: 0.9643\n", 706 | "Epoch 14/20\n", 707 | "0s - loss: 0.3467 - acc: 0.9083 - val_loss: 0.2369 - val_acc: 0.9643\n", 708 | "Epoch 15/20\n", 709 | "0s - loss: 0.3364 - acc: 0.9113 - val_loss: 0.2214 - val_acc: 0.9643\n", 710 | "Epoch 16/20\n", 711 | "0s - loss: 0.3288 - acc: 0.9119 - val_loss: 0.2083 - val_acc: 0.9714\n", 712 | "Epoch 17/20\n", 713 | "0s - loss: 0.3227 - acc: 0.9155 - val_loss: 0.1971 - val_acc: 0.9643\n", 714 | "Epoch 18/20\n", 715 | "0s - loss: 0.3182 - acc: 0.9137 - val_loss: 0.1889 - val_acc: 0.9786\n", 716 | "Epoch 19/20\n", 717 | "0s - loss: 0.3144 - acc: 0.9167 - val_loss: 0.1809 - val_acc: 0.9714\n", 718 | "Epoch 20/20\n", 719 | "0s - loss: 0.3115 - acc: 0.9161 - val_loss: 0.1749 - val_acc: 0.9714\n" 720 | ] 721 | }, 722 | { 723 | "data": { 724 | "text/plain": [ 725 | "" 726 | ] 727 | }, 728 | "execution_count": 84, 729 | "metadata": {}, 730 | "output_type": "execute_result" 731 | } 732 | ], 733 | "source": [ 734 | "model.fit(scaled_train_samples, train_labels, validation_split = 0.20, batch_size=10, \n", 735 | " epochs=20, shuffle=True, verbose=2)" 736 | ] 737 | }, 738 | { 739 | "cell_type": "code", 740 | "execution_count": null, 741 | "metadata": { 742 | "collapsed": true 743 | }, 744 | "outputs": [], 745 | "source": [ 746 | "valid_set = [(sample, label), (sample, label), ... , (sample, label)]" 747 | ] 748 | }, 749 | { 750 | "cell_type": "code", 751 | "execution_count": null, 752 | "metadata": { 753 | "collapsed": true 754 | }, 755 | "outputs": [], 756 | "source": [ 757 | "model.fit(scaled_train_samples, train_labels, validation_data = valid_set, batch_size=10, \n", 758 | " epochs=20, shuffle=True, verbose=2)" 759 | ] 760 | }, 761 | { 762 | "cell_type": "markdown", 763 | "metadata": {}, 764 | "source": [ 765 | "## Regularization" 766 | ] 767 | }, 768 | { 769 | "cell_type": "code", 770 | "execution_count": 108, 771 | "metadata": { 772 | "collapsed": false 773 | }, 774 | "outputs": [], 775 | "source": [ 776 | "import keras\n", 777 | "from keras import backend as K\n", 778 | "from keras.models import Sequential\n", 779 | "from keras.layers import Activation\n", 780 | "from keras.layers.core import Dense\n", 781 | "from keras.optimizers import Adam\n", 782 | "from keras import regularizers" 783 | ] 784 | }, 785 | { 786 | "cell_type": "code", 787 | "execution_count": 109, 788 | "metadata": { 789 | "collapsed": false 790 | }, 791 | "outputs": [], 792 | "source": [ 793 | "model = Sequential([\n", 794 | " Dense(16, input_shape=(1,), activation='relu'),\n", 795 | " Dense(32, activation='relu', kernel_regularizer=regularizers.l2(0.01)),\n", 796 | " Dense(2, activation='sigmoid')\n", 797 | "])" 798 | ] 799 | }, 800 | { 801 | "cell_type": "markdown", 802 | "metadata": {}, 803 | "source": [ 804 | "## Learning Rate" 805 | ] 806 | }, 807 | { 808 | "cell_type": "code", 809 | "execution_count": 116, 810 | "metadata": { 811 | "collapsed": true 812 | }, 813 | "outputs": [], 814 | "source": [ 815 | "model.compile(Adam(lr=0.0001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])" 816 | ] 817 | }, 818 | { 819 | "cell_type": "code", 820 | "execution_count": 120, 821 | "metadata": { 822 | "collapsed": false 823 | }, 824 | "outputs": [], 825 | "source": [ 826 | "model.optimizer.lr = 0.01" 827 | ] 828 | }, 829 | { 830 | "cell_type": "code", 831 | "execution_count": 122, 832 | "metadata": { 833 | "collapsed": false 834 | }, 835 | "outputs": [ 836 | { 837 | "data": { 838 | "text/plain": [ 839 | "0.01" 840 | ] 841 | }, 842 | "execution_count": 122, 843 | "metadata": {}, 844 | "output_type": "execute_result" 845 | } 846 | ], 847 | "source": [ 848 | "model.optimizer.lr" 849 | ] 850 | }, 851 | { 852 | "cell_type": "markdown", 853 | "metadata": {}, 854 | "source": [ 855 | "## Batch Size" 856 | ] 857 | }, 858 | { 859 | "cell_type": "code", 860 | "execution_count": null, 861 | "metadata": { 862 | "collapsed": true 863 | }, 864 | "outputs": [], 865 | "source": [ 866 | "model.fit(scaled_train_samples, train_labels, validation_data = valid_set, batch_size=10, \n", 867 | " epochs=20, shuffle=True, verbose=2)" 868 | ] 869 | }, 870 | { 871 | "cell_type": "markdown", 872 | "metadata": { 873 | "collapsed": true 874 | }, 875 | "source": [ 876 | "## Predicting" 877 | ] 878 | }, 879 | { 880 | "cell_type": "code", 881 | "execution_count": 18, 882 | "metadata": { 883 | "collapsed": false 884 | }, 885 | "outputs": [], 886 | "source": [ 887 | "import keras\n", 888 | "from keras import backend as K\n", 889 | "from keras.models import Sequential\n", 890 | "from keras.layers import Activation\n", 891 | "from keras.layers.core import Dense\n", 892 | "from keras.optimizers import Adam\n", 893 | "from keras.metrics import categorical_crossentropy" 894 | ] 895 | }, 896 | { 897 | "cell_type": "code", 898 | "execution_count": 63, 899 | "metadata": { 900 | "collapsed": false 901 | }, 902 | "outputs": [], 903 | "source": [ 904 | "model = Sequential([\n", 905 | " Dense(16, input_shape=(1,), activation='relu'),\n", 906 | " Dense(32, activation='relu'),\n", 907 | " Dense(2, activation='sigmoid')\n", 908 | "])" 909 | ] 910 | }, 911 | { 912 | "cell_type": "code", 913 | "execution_count": 64, 914 | "metadata": { 915 | "collapsed": false 916 | }, 917 | "outputs": [], 918 | "source": [ 919 | "model.compile(Adam(lr=.0001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])" 920 | ] 921 | }, 922 | { 923 | "cell_type": "code", 924 | "execution_count": 65, 925 | "metadata": { 926 | "collapsed": false 927 | }, 928 | "outputs": [ 929 | { 930 | "name": "stdout", 931 | "output_type": "stream", 932 | "text": [ 933 | "Epoch 1/20\n", 934 | "0s - loss: 0.6933 - acc: 0.6419\n", 935 | "Epoch 2/20\n", 936 | "0s - loss: 0.6710 - acc: 0.7857\n", 937 | "Epoch 3/20\n", 938 | "0s - loss: 0.6397 - acc: 0.8443\n", 939 | "Epoch 4/20\n", 940 | "0s - loss: 0.6061 - acc: 0.8476\n", 941 | "Epoch 5/20\n", 942 | "0s - loss: 0.5678 - acc: 0.8505\n", 943 | "Epoch 6/20\n", 944 | "0s - loss: 0.5228 - acc: 0.8600\n", 945 | "Epoch 7/20\n", 946 | "0s - loss: 0.4681 - acc: 0.8733\n", 947 | "Epoch 8/20\n", 948 | "0s - loss: 0.4105 - acc: 0.8962\n", 949 | "Epoch 9/20\n", 950 | "0s - loss: 0.3670 - acc: 0.9119\n", 951 | "Epoch 10/20\n", 952 | "0s - loss: 0.3329 - acc: 0.9167\n", 953 | "Epoch 11/20\n", 954 | "0s - loss: 0.3100 - acc: 0.9243\n", 955 | "Epoch 12/20\n", 956 | "0s - loss: 0.2925 - acc: 0.9271\n", 957 | "Epoch 13/20\n", 958 | "0s - loss: 0.2820 - acc: 0.9300\n", 959 | "Epoch 14/20\n", 960 | "0s - loss: 0.2757 - acc: 0.9338\n", 961 | "Epoch 15/20\n", 962 | "0s - loss: 0.2712 - acc: 0.9319\n", 963 | "Epoch 16/20\n", 964 | "0s - loss: 0.2681 - acc: 0.9381\n", 965 | "Epoch 17/20\n", 966 | "0s - loss: 0.2655 - acc: 0.9376\n", 967 | "Epoch 18/20\n", 968 | "0s - loss: 0.2634 - acc: 0.9352\n", 969 | "Epoch 19/20\n", 970 | "0s - loss: 0.2618 - acc: 0.9390\n", 971 | "Epoch 20/20\n", 972 | "0s - loss: 0.2603 - acc: 0.9352\n" 973 | ] 974 | }, 975 | { 976 | "data": { 977 | "text/plain": [ 978 | "" 979 | ] 980 | }, 981 | "execution_count": 65, 982 | "metadata": {}, 983 | "output_type": "execute_result" 984 | } 985 | ], 986 | "source": [ 987 | "model.fit(scaled_train_samples, train_labels, batch_size=10, epochs=20, shuffle=True, verbose=2)" 988 | ] 989 | }, 990 | { 991 | "cell_type": "code", 992 | "execution_count": 22, 993 | "metadata": { 994 | "collapsed": false 995 | }, 996 | "outputs": [ 997 | { 998 | "name": "stderr", 999 | "output_type": "stream", 1000 | "text": [ 1001 | "/home/epoch/anaconda2/envs/fastai34/lib/python3.4/site-packages/sklearn/utils/validation.py:429: DataConversionWarning: Data with input dtype int64 was converted to float64 by MinMaxScaler.\n", 1002 | " warnings.warn(msg, _DataConversionWarning)\n" 1003 | ] 1004 | } 1005 | ], 1006 | "source": [ 1007 | "# Preprocess test data\n", 1008 | "\n", 1009 | "test_labels = []\n", 1010 | "test_samples = []\n", 1011 | "\n", 1012 | "for i in range(10):\n", 1013 | " # The 5% of younger individuals who did experience side effects\n", 1014 | " random_younger = randint(13,64)\n", 1015 | " test_samples.append(random_younger)\n", 1016 | " test_labels.append(1)\n", 1017 | " \n", 1018 | " # The 5% of older individuals who did not experience side effects\n", 1019 | " random_older = randint(65,100)\n", 1020 | " test_samples.append(random_older)\n", 1021 | " test_labels.append(0)\n", 1022 | "\n", 1023 | "for i in range(200):\n", 1024 | " # The 95% of younger individuals who did not experience side effects\n", 1025 | " random_younger = randint(13,64)\n", 1026 | " test_samples.append(random_younger)\n", 1027 | " test_labels.append(0)\n", 1028 | " \n", 1029 | " # The 95% of older individuals who did experience side effects\n", 1030 | " random_older = randint(65,100)\n", 1031 | " test_samples.append(random_older)\n", 1032 | " test_labels.append(1)\n", 1033 | " \n", 1034 | "test_labels = np.array(test_labels)\n", 1035 | "test_samples = np.array(test_samples)\n", 1036 | "\n", 1037 | "scaler = MinMaxScaler(feature_range=(0,1))\n", 1038 | "scaled_test_samples = scaler.fit_transform((test_samples).reshape(-1,1))" 1039 | ] 1040 | }, 1041 | { 1042 | "cell_type": "code", 1043 | "execution_count": 23, 1044 | "metadata": { 1045 | "collapsed": true 1046 | }, 1047 | "outputs": [], 1048 | "source": [ 1049 | "predictions = model.predict(scaled_test_samples, batch_size=10, verbose=0) " 1050 | ] 1051 | }, 1052 | { 1053 | "cell_type": "code", 1054 | "execution_count": 24, 1055 | "metadata": { 1056 | "collapsed": false 1057 | }, 1058 | "outputs": [ 1059 | { 1060 | "name": "stdout", 1061 | "output_type": "stream", 1062 | "text": [ 1063 | "[ 0.28293326 0.35764667]\n", 1064 | "[ 0.26525486 0.37844887]\n", 1065 | "[ 0.85707456 0.04403995]\n", 1066 | "[ 0.0979089 0.67903334]\n", 1067 | "[ 0.87152088 0.04061354]\n", 1068 | "[ 0.04943148 0.85192239]\n", 1069 | "[ 0.880009 0.0379883]\n", 1070 | "[ 0.12007324 0.61951774]\n", 1071 | "[ 0.64052224 0.10959 ]\n", 1072 | "[ 0.13958886 0.5766331 ]\n", 1073 | "[ 0.82027066 0.0517699 ]\n", 1074 | "[ 0.04943148 0.85192239]\n", 1075 | "[ 0.87042195 0.04095384]\n", 1076 | "[ 0.23208363 0.42135212]\n", 1077 | "[ 0.77739257 0.06212683]\n", 1078 | "[ 0.23208363 0.42135212]\n", 1079 | "[ 0.8121165 0.05363343]\n", 1080 | "[ 0.06808709 0.7811752 ]\n", 1081 | "[ 0.85707456 0.04403995]\n", 1082 | "[ 0.0430468 0.87568933]\n", 1083 | "[ 0.880009 0.0379883]\n", 1084 | "[ 0.18797709 0.48778817]\n", 1085 | "[ 0.83300829 0.04906356]\n", 1086 | "[ 0.07451599 0.7569769 ]\n", 1087 | "[ 0.32034045 0.31766897]\n", 1088 | "[ 0.24829839 0.39970824]\n", 1089 | "[ 0.85979176 0.04345375]\n", 1090 | "[ 0.09193034 0.69722801]\n", 1091 | "[ 0.87477005 0.0396088 ]\n", 1092 | "[ 0.10429112 0.66016704]\n", 1093 | "[ 0.42364404 0.22938529]\n", 1094 | "[ 0.21662255 0.44330263]\n", 1095 | "[ 0.84821194 0.04590416]\n", 1096 | "[ 0.0430468 0.87568933]\n", 1097 | "[ 0.82027066 0.0517699 ]\n", 1098 | "[ 0.06808709 0.7811752 ]\n", 1099 | "[ 0.87042195 0.04095384]\n", 1100 | "[ 0.04120404 0.88207549]\n", 1101 | "[ 0.86930537 0.04130033]\n", 1102 | "[ 0.20192057 0.46547687]\n", 1103 | "[ 0.64052224 0.10959 ]\n", 1104 | "[ 0.04120404 0.88207549]\n", 1105 | "[ 0.87477005 0.0396088 ]\n", 1106 | "[ 0.04943148 0.85192239]\n", 1107 | "[ 0.87152088 0.04061354]\n", 1108 | "[ 0.26525486 0.37844887]\n", 1109 | "[ 0.87583733 0.03927922]\n", 1110 | "[ 0.05176451 0.84311408]\n", 1111 | "[ 0.84821194 0.04590416]\n", 1112 | "[ 0.13958886 0.5766331 ]\n", 1113 | "[ 0.40210381 0.24557945]\n", 1114 | "[ 0.18797709 0.48778817]\n", 1115 | "[ 0.67980295 0.09405305]\n", 1116 | "[ 0.03638967 0.89756322]\n", 1117 | "[ 0.87152088 0.04061354]\n", 1118 | "[ 0.04719836 0.86031818]\n", 1119 | "[ 0.82027066 0.0517699 ]\n", 1120 | "[ 0.0430468 0.87568933]\n", 1121 | "[ 0.8768968 0.03895227]\n", 1122 | "[ 0.13958886 0.5766331 ]\n", 1123 | "[ 0.36020902 0.28021055]\n", 1124 | "[ 0.07808454 0.74381268]\n", 1125 | "[ 0.87794852 0.03862793]\n", 1126 | "[ 0.21662255 0.44330263]\n", 1127 | "[ 0.46752542 0.1992964 ]\n", 1128 | "[ 0.05420133 0.83388394]\n", 1129 | "[ 0.87152088 0.04061354]\n", 1130 | "[ 0.13958886 0.5766331 ]\n", 1131 | "[ 0.7155025 0.08153573]\n", 1132 | "[ 0.0594027 0.81412745]\n", 1133 | "[ 0.36020902 0.28021055]\n", 1134 | "[ 0.16233467 0.53246796]\n", 1135 | "[ 0.86509645 0.04230364]\n", 1136 | "[ 0.09193034 0.69722801]\n", 1137 | "[ 0.87477005 0.0396088 ]\n", 1138 | "[ 0.24829839 0.39970824]\n", 1139 | "[ 0.64052224 0.10959 ]\n", 1140 | "[ 0.06217557 0.80358917]\n", 1141 | "[ 0.83300829 0.04906356]\n", 1142 | "[ 0.21662255 0.44330263]\n", 1143 | "[ 0.40210381 0.24557945]\n", 1144 | "[ 0.08204049 0.72956663]\n", 1145 | "[ 0.76366335 0.06596307]\n", 1146 | "[ 0.05674605 0.82422394]\n", 1147 | "[ 0.87042195 0.04095384]\n", 1148 | "[ 0.0430468 0.87568933]\n", 1149 | "[ 0.86246562 0.04287501]\n", 1150 | "[ 0.07808454 0.74381268]\n", 1151 | "[ 0.87152088 0.04061354]\n", 1152 | "[ 0.04120404 0.88207549]\n", 1153 | "[ 0.32034045 0.31766897]\n", 1154 | "[ 0.0430468 0.87568933]\n", 1155 | "[ 0.83300829 0.04906356]\n", 1156 | "[ 0.18797709 0.48778817]\n", 1157 | "[ 0.87583733 0.03927922]\n", 1158 | "[ 0.0594027 0.81412745]\n", 1159 | "[ 0.83300829 0.04906356]\n", 1160 | "[ 0.20192057 0.46547687]\n", 1161 | "[ 0.62010962 0.11817335]\n", 1162 | "[ 0.13958886 0.5766331 ]\n", 1163 | "[ 0.55611736 0.14823376]\n", 1164 | "[ 0.23208363 0.42135212]\n", 1165 | "[ 0.87042195 0.04095384]\n", 1166 | "[ 0.08658814 0.71420431]\n", 1167 | "[ 0.30130684 0.33736712]\n", 1168 | "[ 0.05176451 0.84311408]\n", 1169 | "[ 0.84330875 0.04692649]\n", 1170 | "[ 0.21662255 0.44330263]\n", 1171 | "[ 0.87042195 0.04095384]\n", 1172 | "[ 0.16233467 0.53246796]\n", 1173 | "[ 0.42364404 0.22938529]\n", 1174 | "[ 0.03793108 0.89261192]\n", 1175 | "[ 0.84821194 0.04590416]\n", 1176 | "[ 0.16233467 0.53246796]\n", 1177 | "[ 0.84821194 0.04590416]\n", 1178 | "[ 0.0430468 0.87568933]\n", 1179 | "[ 0.36020902 0.28021055]\n", 1180 | "[ 0.21662255 0.44330263]\n", 1181 | "[ 0.7485773 0.07064888]\n", 1182 | "[ 0.0594027 0.81412745]\n", 1183 | "[ 0.59926307 0.12733285]\n", 1184 | "[ 0.23208363 0.42135212]\n", 1185 | "[ 0.87477005 0.0396088 ]\n", 1186 | "[ 0.04120404 0.88207549]\n", 1187 | "[ 0.48969987 0.18540421]\n", 1188 | "[ 0.05176451 0.84311408]\n", 1189 | "[ 0.87477005 0.0396088 ]\n", 1190 | "[ 0.08204049 0.72956663]\n", 1191 | "[ 0.82027066 0.0517699 ]\n", 1192 | "[ 0.0594027 0.81412745]\n", 1193 | "[ 0.32034045 0.31766897]\n", 1194 | "[ 0.09193034 0.69722801]\n", 1195 | "[ 0.80109262 0.05631671]\n", 1196 | "[ 0.05420133 0.83388394]\n", 1197 | "[ 0.7155025 0.08153573]\n", 1198 | "[ 0.12007324 0.61951774]\n", 1199 | "[ 0.87794852 0.03862793]\n", 1200 | "[ 0.07808454 0.74381268]\n", 1201 | "[ 0.87794852 0.03862793]\n", 1202 | "[ 0.05420133 0.83388394]\n", 1203 | "[ 0.86930537 0.04130033]\n", 1204 | "[ 0.0594027 0.81412745]\n", 1205 | "[ 0.77739257 0.06212683]\n", 1206 | "[ 0.05674605 0.82422394]\n", 1207 | "[ 0.85979176 0.04345375]\n", 1208 | "[ 0.21662255 0.44330263]\n", 1209 | "[ 0.78949356 0.05915147]\n", 1210 | "[ 0.03793108 0.89261192]\n", 1211 | "[ 0.40210381 0.24557945]\n", 1212 | "[ 0.10429112 0.66016704]\n", 1213 | "[ 0.48969987 0.18540421]\n", 1214 | "[ 0.09193034 0.69722801]\n", 1215 | "[ 0.83827734 0.04797048]\n", 1216 | "[ 0.04120404 0.88207549]\n", 1217 | "[ 0.66043848 0.10155829]\n", 1218 | "[ 0.06217557 0.80358917]\n", 1219 | "[ 0.78949356 0.05915147]\n", 1220 | "[ 0.04719836 0.86031818]\n", 1221 | "[ 0.8736949 0.03994104]\n", 1222 | "[ 0.12925252 0.59830874]\n", 1223 | "[ 0.64052224 0.10959 ]\n", 1224 | "[ 0.0979089 0.67903334]\n", 1225 | "[ 0.85298848 0.04490304]\n", 1226 | "[ 0.26525486 0.37844887]\n", 1227 | "[ 0.40210381 0.24557945]\n", 1228 | "[ 0.06217557 0.80358917]\n", 1229 | "[ 0.36020902 0.28021055]\n", 1230 | "[ 0.03953509 0.88745135]\n", 1231 | "[ 0.86930537 0.04130033]\n", 1232 | "[ 0.1117581 0.64022535]\n", 1233 | "[ 0.82682848 0.05037352]\n", 1234 | "[ 0.16233467 0.53246796]\n", 1235 | "[ 0.48969987 0.18540421]\n", 1236 | "[ 0.06506889 0.7926057 ]\n", 1237 | "[ 0.82027066 0.0517699 ]\n", 1238 | "[ 0.05674605 0.82422394]\n", 1239 | "[ 0.76366335 0.06596307]\n", 1240 | "[ 0.04719836 0.86031818]\n", 1241 | "[ 0.85979176 0.04345375]\n", 1242 | "[ 0.12007324 0.61951774]\n", 1243 | "[ 0.8768968 0.03895227]\n", 1244 | "[ 0.07451599 0.7569769 ]\n", 1245 | "[ 0.55611736 0.14823376]\n", 1246 | "[ 0.04943148 0.85192239]\n", 1247 | "[ 0.55611736 0.14823376]\n", 1248 | "[ 0.0430468 0.87568933]\n", 1249 | "[ 0.33999148 0.29860252]\n", 1250 | "[ 0.03793108 0.89261192]\n", 1251 | "[ 0.86509645 0.04230364]\n", 1252 | "[ 0.23208363 0.42135212]\n", 1253 | "[ 0.4454785 0.21395613]\n", 1254 | "[ 0.08204049 0.72956663]\n", 1255 | "[ 0.82682848 0.05037352]\n", 1256 | "[ 0.24829839 0.39970824]\n", 1257 | "[ 0.86246562 0.04287501]\n", 1258 | "[ 0.21662255 0.44330263]\n", 1259 | "[ 0.87898576 0.03830663]\n", 1260 | "[ 0.0979089 0.67903334]\n", 1261 | "[ 0.82682848 0.05037352]\n", 1262 | "[ 0.08204049 0.72956663]\n", 1263 | "[ 0.880009 0.0379883]\n", 1264 | "[ 0.07808454 0.74381268]\n", 1265 | "[ 0.33999148 0.29860252]\n", 1266 | "[ 0.03793108 0.89261192]\n", 1267 | "[ 0.82027066 0.0517699 ]\n", 1268 | "[ 0.0594027 0.81412745]\n", 1269 | "[ 0.87042195 0.04095384]\n", 1270 | "[ 0.13958886 0.5766331 ]\n", 1271 | "[ 0.87261182 0.04027594]\n", 1272 | "[ 0.05674605 0.82422394]\n", 1273 | "[ 0.78949356 0.05915147]\n", 1274 | "[ 0.09193034 0.69722801]\n", 1275 | "[ 0.38093486 0.26252744]\n", 1276 | "[ 0.12007324 0.61951774]\n", 1277 | "[ 0.87583733 0.03927922]\n", 1278 | "[ 0.0979089 0.67903334]\n", 1279 | "[ 0.8768968 0.03895227]\n", 1280 | "[ 0.04719836 0.86031818]\n", 1281 | "[ 0.8676846 0.04173953]\n", 1282 | "[ 0.05420133 0.83388394]\n", 1283 | "[ 0.55611736 0.14823376]\n", 1284 | "[ 0.06217557 0.80358917]\n", 1285 | "[ 0.42364404 0.22938529]\n", 1286 | "[ 0.21662255 0.44330263]\n", 1287 | "[ 0.76366335 0.06596307]\n", 1288 | "[ 0.05674605 0.82422394]\n", 1289 | "[ 0.880009 0.0379883]\n", 1290 | "[ 0.24829839 0.39970824]\n", 1291 | "[ 0.83827734 0.04797048]\n", 1292 | "[ 0.12925252 0.59830874]\n", 1293 | "[ 0.36020902 0.28021055]\n", 1294 | "[ 0.08204049 0.72956663]\n", 1295 | "[ 0.86509645 0.04230364]\n", 1296 | "[ 0.04506137 0.86831146]\n", 1297 | "[ 0.87261182 0.04027594]\n", 1298 | "[ 0.04506137 0.86831146]\n", 1299 | "[ 0.86509645 0.04230364]\n", 1300 | "[ 0.17478551 0.51014841]\n", 1301 | "[ 0.7155025 0.08153573]\n", 1302 | "[ 0.0430468 0.87568933]\n", 1303 | "[ 0.33999148 0.29860252]\n", 1304 | "[ 0.07808454 0.74381268]\n", 1305 | "[ 0.8736949 0.03994104]\n", 1306 | "[ 0.0594027 0.81412745]\n", 1307 | "[ 0.4454785 0.21395613]\n", 1308 | "[ 0.12925252 0.59830874]\n", 1309 | "[ 0.85707456 0.04403995]\n", 1310 | "[ 0.0430468 0.87568933]\n", 1311 | "[ 0.67980295 0.09405305]\n", 1312 | "[ 0.18797709 0.48778817]\n", 1313 | "[ 0.62010962 0.11817335]\n", 1314 | "[ 0.03953509 0.88745135]\n", 1315 | "[ 0.62010962 0.11817335]\n", 1316 | "[ 0.05420133 0.83388394]\n", 1317 | "[ 0.80109262 0.05631671]\n", 1318 | "[ 0.09193034 0.69722801]\n", 1319 | "[ 0.85298848 0.04490304]\n", 1320 | "[ 0.20192057 0.46547687]\n", 1321 | "[ 0.83300829 0.04906356]\n", 1322 | "[ 0.10429112 0.66016704]\n", 1323 | "[ 0.62010962 0.11817335]\n", 1324 | "[ 0.06506889 0.7926057 ]\n", 1325 | "[ 0.55611736 0.14823376]\n", 1326 | "[ 0.04506137 0.86831146]\n", 1327 | "[ 0.85707456 0.04403995]\n", 1328 | "[ 0.04506137 0.86831146]\n", 1329 | "[ 0.55611736 0.14823376]\n", 1330 | "[ 0.06808709 0.7811752 ]\n", 1331 | "[ 0.8768968 0.03895227]\n", 1332 | "[ 0.08204049 0.72956663]\n", 1333 | "[ 0.64052224 0.10959 ]\n", 1334 | "[ 0.07451599 0.7569769 ]\n", 1335 | "[ 0.8736949 0.03994104]\n", 1336 | "[ 0.0430468 0.87568933]\n", 1337 | "[ 0.76366335 0.06596307]\n", 1338 | "[ 0.06808709 0.7811752 ]\n", 1339 | "[ 0.69801664 0.08753506]\n", 1340 | "[ 0.05674605 0.82422394]\n", 1341 | "[ 0.4454785 0.21395613]\n", 1342 | "[ 0.04719836 0.86031818]\n", 1343 | "[ 0.87152088 0.04061354]\n", 1344 | "[ 0.03638967 0.89756322]\n", 1345 | "[ 0.85979176 0.04345375]\n", 1346 | "[ 0.15060882 0.55465847]\n", 1347 | "[ 0.83827734 0.04797048]\n", 1348 | "[ 0.18797709 0.48778817]\n", 1349 | "[ 0.87477005 0.0396088 ]\n", 1350 | "[ 0.10429112 0.66016704]\n", 1351 | "[ 0.32034045 0.31766897]\n", 1352 | "[ 0.03953509 0.88745135]\n", 1353 | "[ 0.8736949 0.03994104]\n", 1354 | "[ 0.20192057 0.46547687]\n", 1355 | "[ 0.732364 0.07591337]\n", 1356 | "[ 0.03793108 0.89261192]\n", 1357 | "[ 0.880009 0.0379883]\n", 1358 | "[ 0.1117581 0.64022535]\n", 1359 | "[ 0.85707456 0.04403995]\n", 1360 | "[ 0.04943148 0.85192239]\n", 1361 | "[ 0.87794852 0.03862793]\n", 1362 | "[ 0.0430468 0.87568933]\n", 1363 | "[ 0.732364 0.07591337]\n", 1364 | "[ 0.05420133 0.83388394]\n", 1365 | "[ 0.83827734 0.04797048]\n", 1366 | "[ 0.16233467 0.53246796]\n", 1367 | "[ 0.880009 0.0379883]\n", 1368 | "[ 0.07451599 0.7569769 ]\n", 1369 | "[ 0.732364 0.07591337]\n", 1370 | "[ 0.20192057 0.46547687]\n", 1371 | "[ 0.87152088 0.04061354]\n", 1372 | "[ 0.03638967 0.89756322]\n", 1373 | "[ 0.8768968 0.03895227]\n", 1374 | "[ 0.07808454 0.74381268]\n", 1375 | "[ 0.87152088 0.04061354]\n", 1376 | "[ 0.03953509 0.88745135]\n", 1377 | "[ 0.83827734 0.04797048]\n", 1378 | "[ 0.0979089 0.67903334]\n", 1379 | "[ 0.53408301 0.15988748]\n", 1380 | "[ 0.03793108 0.89261192]\n", 1381 | "[ 0.77739257 0.06212683]\n", 1382 | "[ 0.24829839 0.39970824]\n", 1383 | "[ 0.48969987 0.18540421]\n", 1384 | "[ 0.04120404 0.88207549]\n", 1385 | "[ 0.85979176 0.04345375]\n", 1386 | "[ 0.0430468 0.87568933]\n", 1387 | "[ 0.7485773 0.07064888]\n", 1388 | "[ 0.23208363 0.42135212]\n", 1389 | "[ 0.87583733 0.03927922]\n", 1390 | "[ 0.06808709 0.7811752 ]\n", 1391 | "[ 0.84330875 0.04692649]\n", 1392 | "[ 0.12925252 0.59830874]\n", 1393 | "[ 0.28293326 0.35764667]\n", 1394 | "[ 0.04943148 0.85192239]\n", 1395 | "[ 0.86246562 0.04287501]\n", 1396 | "[ 0.03793108 0.89261192]\n", 1397 | "[ 0.46752542 0.1992964 ]\n", 1398 | "[ 0.0430468 0.87568933]\n", 1399 | "[ 0.38093486 0.26252744]\n", 1400 | "[ 0.03953509 0.88745135]\n", 1401 | "[ 0.87477005 0.0396088 ]\n", 1402 | "[ 0.23208363 0.42135212]\n", 1403 | "[ 0.87261182 0.04027594]\n", 1404 | "[ 0.0594027 0.81412745]\n", 1405 | "[ 0.82027066 0.0517699 ]\n", 1406 | "[ 0.12925252 0.59830874]\n", 1407 | "[ 0.7155025 0.08153573]\n", 1408 | "[ 0.03638967 0.89756322]\n", 1409 | "[ 0.86930537 0.04130033]\n", 1410 | "[ 0.12007324 0.61951774]\n", 1411 | "[ 0.53408301 0.15988748]\n", 1412 | "[ 0.21662255 0.44330263]\n", 1413 | "[ 0.7155025 0.08153573]\n", 1414 | "[ 0.07808454 0.74381268]\n", 1415 | "[ 0.67980295 0.09405305]\n", 1416 | "[ 0.05674605 0.82422394]\n", 1417 | "[ 0.84821194 0.04590416]\n", 1418 | "[ 0.0979089 0.67903334]\n", 1419 | "[ 0.84821194 0.04590416]\n", 1420 | "[ 0.05176451 0.84311408]\n", 1421 | "[ 0.87042195 0.04095384]\n", 1422 | "[ 0.20192057 0.46547687]\n", 1423 | "[ 0.67980295 0.09405305]\n", 1424 | "[ 0.18797709 0.48778817]\n", 1425 | "[ 0.85298848 0.04490304]\n", 1426 | "[ 0.0430468 0.87568933]\n", 1427 | "[ 0.77739257 0.06212683]\n", 1428 | "[ 0.0594027 0.81412745]\n", 1429 | "[ 0.36020902 0.28021055]\n", 1430 | "[ 0.24829839 0.39970824]\n", 1431 | "[ 0.84330875 0.04692649]\n", 1432 | "[ 0.26525486 0.37844887]\n", 1433 | "[ 0.40210381 0.24557945]\n", 1434 | "[ 0.06506889 0.7926057 ]\n", 1435 | "[ 0.86509645 0.04230364]\n", 1436 | "[ 0.0594027 0.81412745]\n", 1437 | "[ 0.30130684 0.33736712]\n", 1438 | "[ 0.23208363 0.42135212]\n", 1439 | "[ 0.36020902 0.28021055]\n", 1440 | "[ 0.04506137 0.86831146]\n", 1441 | "[ 0.82027066 0.0517699 ]\n", 1442 | "[ 0.06808709 0.7811752 ]\n", 1443 | "[ 0.48969987 0.18540421]\n", 1444 | "[ 0.05420133 0.83388394]\n", 1445 | "[ 0.4454785 0.21395613]\n", 1446 | "[ 0.08204049 0.72956663]\n", 1447 | "[ 0.32034045 0.31766897]\n", 1448 | "[ 0.0430468 0.87568933]\n", 1449 | "[ 0.880009 0.0379883]\n", 1450 | "[ 0.23208363 0.42135212]\n", 1451 | "[ 0.8121165 0.05363343]\n", 1452 | "[ 0.08658814 0.71420431]\n", 1453 | "[ 0.51191491 0.17227209]\n", 1454 | "[ 0.17478551 0.51014841]\n", 1455 | "[ 0.8121165 0.05363343]\n", 1456 | "[ 0.04120404 0.88207549]\n", 1457 | "[ 0.880009 0.0379883]\n", 1458 | "[ 0.08204049 0.72956663]\n", 1459 | "[ 0.87898576 0.03830663]\n", 1460 | "[ 0.03793108 0.89261192]\n", 1461 | "[ 0.87042195 0.04095384]\n", 1462 | "[ 0.06217557 0.80358917]\n", 1463 | "[ 0.82682848 0.05037352]\n", 1464 | "[ 0.12007324 0.61951774]\n", 1465 | "[ 0.77739257 0.06212683]\n", 1466 | "[ 0.04719836 0.86031818]\n", 1467 | "[ 0.84330875 0.04692649]\n", 1468 | "[ 0.06506889 0.7926057 ]\n", 1469 | "[ 0.87898576 0.03830663]\n", 1470 | "[ 0.07808454 0.74381268]\n", 1471 | "[ 0.8736949 0.03994104]\n", 1472 | "[ 0.07123458 0.76929814]\n", 1473 | "[ 0.33999148 0.29860252]\n", 1474 | "[ 0.0430468 0.87568933]\n", 1475 | "[ 0.85707456 0.04403995]\n", 1476 | "[ 0.07808454 0.74381268]\n", 1477 | "[ 0.83827734 0.04797048]\n", 1478 | "[ 0.04506137 0.86831146]\n", 1479 | "[ 0.85298848 0.04490304]\n", 1480 | "[ 0.07123458 0.76929814]\n", 1481 | "[ 0.42364404 0.22938529]\n", 1482 | "[ 0.17478551 0.51014841]\n" 1483 | ] 1484 | } 1485 | ], 1486 | "source": [ 1487 | "for i in predictions:\n", 1488 | " print(i)" 1489 | ] 1490 | }, 1491 | { 1492 | "cell_type": "markdown", 1493 | "metadata": {}, 1494 | "source": [ 1495 | "## Supervised Learning" 1496 | ] 1497 | }, 1498 | { 1499 | "cell_type": "code", 1500 | "execution_count": 25, 1501 | "metadata": { 1502 | "collapsed": false 1503 | }, 1504 | "outputs": [], 1505 | "source": [ 1506 | "import keras\n", 1507 | "from keras import backend as K\n", 1508 | "from keras.models import Sequential\n", 1509 | "from keras.layers import Activation\n", 1510 | "from keras.layers.core import Dense\n", 1511 | "from keras.optimizers import Adam" 1512 | ] 1513 | }, 1514 | { 1515 | "cell_type": "code", 1516 | "execution_count": 34, 1517 | "metadata": { 1518 | "collapsed": false 1519 | }, 1520 | "outputs": [], 1521 | "source": [ 1522 | "model = Sequential([\n", 1523 | " Dense(16, input_shape=(2,), activation='relu'),\n", 1524 | " Dense(32, activation='relu'),\n", 1525 | " Dense(2, activation='sigmoid')\n", 1526 | "])" 1527 | ] 1528 | }, 1529 | { 1530 | "cell_type": "code", 1531 | "execution_count": 35, 1532 | "metadata": { 1533 | "collapsed": true 1534 | }, 1535 | "outputs": [], 1536 | "source": [ 1537 | "model.compile(Adam(lr=0.0001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])" 1538 | ] 1539 | }, 1540 | { 1541 | "cell_type": "code", 1542 | "execution_count": 36, 1543 | "metadata": { 1544 | "collapsed": true 1545 | }, 1546 | "outputs": [], 1547 | "source": [ 1548 | "# weight, height\n", 1549 | "train_samples = [[150, 67], [130, 60], [200, 65], [125, 52], [230, 72], [181, 70]]" 1550 | ] 1551 | }, 1552 | { 1553 | "cell_type": "code", 1554 | "execution_count": 37, 1555 | "metadata": { 1556 | "collapsed": true 1557 | }, 1558 | "outputs": [], 1559 | "source": [ 1560 | "# 0: male\n", 1561 | "# 1: female\n", 1562 | "train_labels = [1, 1, 0, 1, 0, 0]" 1563 | ] 1564 | }, 1565 | { 1566 | "cell_type": "code", 1567 | "execution_count": null, 1568 | "metadata": { 1569 | "collapsed": true 1570 | }, 1571 | "outputs": [], 1572 | "source": [ 1573 | "model.fit(x=train_samples, y=train_labels, batch_size=3, epochs=10, shuffle=True, verbose=2)" 1574 | ] 1575 | }, 1576 | { 1577 | "cell_type": "markdown", 1578 | "metadata": {}, 1579 | "source": [ 1580 | "## Batch Normalization" 1581 | ] 1582 | }, 1583 | { 1584 | "cell_type": "code", 1585 | "execution_count": 6, 1586 | "metadata": { 1587 | "collapsed": false 1588 | }, 1589 | "outputs": [], 1590 | "source": [ 1591 | "from keras.models import Sequential\n", 1592 | "from keras.layers import Dense, Activation, BatchNormalization" 1593 | ] 1594 | }, 1595 | { 1596 | "cell_type": "code", 1597 | "execution_count": 10, 1598 | "metadata": { 1599 | "collapsed": false 1600 | }, 1601 | "outputs": [], 1602 | "source": [ 1603 | "model = Sequential([\n", 1604 | " Dense(16, input_shape=(1,5), activation='relu'),\n", 1605 | " Dense(32, activation='relu'),\n", 1606 | " BatchNormalization(axis=1),\n", 1607 | " Dense(2, activation='softmax')\n", 1608 | "])" 1609 | ] 1610 | }, 1611 | { 1612 | "cell_type": "code", 1613 | "execution_count": null, 1614 | "metadata": { 1615 | "collapsed": true 1616 | }, 1617 | "outputs": [], 1618 | "source": [ 1619 | "#beta_initializer: Initializer for the beta weight.\n", 1620 | "#gamma_initializer: Initializer for the gamma weight." 1621 | ] 1622 | }, 1623 | { 1624 | "cell_type": "code", 1625 | "execution_count": null, 1626 | "metadata": { 1627 | "collapsed": true 1628 | }, 1629 | "outputs": [], 1630 | "source": [] 1631 | }, 1632 | { 1633 | "cell_type": "code", 1634 | "execution_count": null, 1635 | "metadata": { 1636 | "collapsed": true 1637 | }, 1638 | "outputs": [], 1639 | "source": [] 1640 | }, 1641 | { 1642 | "cell_type": "code", 1643 | "execution_count": null, 1644 | "metadata": { 1645 | "collapsed": true 1646 | }, 1647 | "outputs": [], 1648 | "source": [] 1649 | }, 1650 | { 1651 | "cell_type": "code", 1652 | "execution_count": null, 1653 | "metadata": { 1654 | "collapsed": true 1655 | }, 1656 | "outputs": [], 1657 | "source": [] 1658 | }, 1659 | { 1660 | "cell_type": "code", 1661 | "execution_count": null, 1662 | "metadata": { 1663 | "collapsed": true 1664 | }, 1665 | "outputs": [], 1666 | "source": [] 1667 | }, 1668 | { 1669 | "cell_type": "code", 1670 | "execution_count": null, 1671 | "metadata": { 1672 | "collapsed": true 1673 | }, 1674 | "outputs": [], 1675 | "source": [] 1676 | }, 1677 | { 1678 | "cell_type": "code", 1679 | "execution_count": null, 1680 | "metadata": { 1681 | "collapsed": true 1682 | }, 1683 | "outputs": [], 1684 | "source": [] 1685 | }, 1686 | { 1687 | "cell_type": "code", 1688 | "execution_count": null, 1689 | "metadata": { 1690 | "collapsed": true 1691 | }, 1692 | "outputs": [], 1693 | "source": [] 1694 | }, 1695 | { 1696 | "cell_type": "code", 1697 | "execution_count": null, 1698 | "metadata": { 1699 | "collapsed": true 1700 | }, 1701 | "outputs": [], 1702 | "source": [] 1703 | }, 1704 | { 1705 | "cell_type": "code", 1706 | "execution_count": null, 1707 | "metadata": { 1708 | "collapsed": true 1709 | }, 1710 | "outputs": [], 1711 | "source": [] 1712 | }, 1713 | { 1714 | "cell_type": "code", 1715 | "execution_count": null, 1716 | "metadata": { 1717 | "collapsed": true 1718 | }, 1719 | "outputs": [], 1720 | "source": [] 1721 | }, 1722 | { 1723 | "cell_type": "code", 1724 | "execution_count": null, 1725 | "metadata": { 1726 | "collapsed": true 1727 | }, 1728 | "outputs": [], 1729 | "source": [] 1730 | }, 1731 | { 1732 | "cell_type": "code", 1733 | "execution_count": null, 1734 | "metadata": { 1735 | "collapsed": true 1736 | }, 1737 | "outputs": [], 1738 | "source": [] 1739 | }, 1740 | { 1741 | "cell_type": "code", 1742 | "execution_count": null, 1743 | "metadata": { 1744 | "collapsed": true 1745 | }, 1746 | "outputs": [], 1747 | "source": [] 1748 | }, 1749 | { 1750 | "cell_type": "code", 1751 | "execution_count": null, 1752 | "metadata": { 1753 | "collapsed": true 1754 | }, 1755 | "outputs": [], 1756 | "source": [] 1757 | }, 1758 | { 1759 | "cell_type": "code", 1760 | "execution_count": null, 1761 | "metadata": { 1762 | "collapsed": true 1763 | }, 1764 | "outputs": [], 1765 | "source": [] 1766 | }, 1767 | { 1768 | "cell_type": "code", 1769 | "execution_count": null, 1770 | "metadata": { 1771 | "collapsed": true 1772 | }, 1773 | "outputs": [], 1774 | "source": [] 1775 | }, 1776 | { 1777 | "cell_type": "code", 1778 | "execution_count": null, 1779 | "metadata": { 1780 | "collapsed": true 1781 | }, 1782 | "outputs": [], 1783 | "source": [] 1784 | }, 1785 | { 1786 | "cell_type": "code", 1787 | "execution_count": null, 1788 | "metadata": { 1789 | "collapsed": true 1790 | }, 1791 | "outputs": [], 1792 | "source": [] 1793 | }, 1794 | { 1795 | "cell_type": "code", 1796 | "execution_count": null, 1797 | "metadata": { 1798 | "collapsed": true 1799 | }, 1800 | "outputs": [], 1801 | "source": [] 1802 | }, 1803 | { 1804 | "cell_type": "code", 1805 | "execution_count": null, 1806 | "metadata": { 1807 | "collapsed": true 1808 | }, 1809 | "outputs": [], 1810 | "source": [] 1811 | } 1812 | ], 1813 | "metadata": { 1814 | "kernelspec": { 1815 | "display_name": "Python 3", 1816 | "language": "python", 1817 | "name": "python3" 1818 | }, 1819 | "language_info": { 1820 | "codemirror_mode": { 1821 | "name": "ipython", 1822 | "version": 3 1823 | }, 1824 | "file_extension": ".py", 1825 | "mimetype": "text/x-python", 1826 | "name": "python", 1827 | "nbconvert_exporter": "python", 1828 | "pygments_lexer": "ipython3", 1829 | "version": "3.4.5" 1830 | } 1831 | }, 1832 | "nbformat": 4, 1833 | "nbformat_minor": 2 1834 | } 1835 | -------------------------------------------------------------------------------- /Keras_Prerequisites.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Getting started with Keras" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "Keras is a high-level neural networks API, written in Python.\n", 15 | "\n", 16 | "Since it’s written in Python, it can run on all the major operating systems.\n", 17 | "\n", 18 | "In my subsequent Keras videos, I will be working on a Linux machine." 19 | ] 20 | }, 21 | { 22 | "cell_type": "markdown", 23 | "metadata": {}, 24 | "source": [ 25 | "## Prerequisites" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": {}, 31 | "source": [ 32 | "1.\tKeras is both CPU and GPU compatible. \n", 33 | " - If you plan to train on small or simple datasets, then you will most likely be fine solely using your CPU.\n", 34 | " - Otherwise, you will need a machine with a GPU, and you will need to install cuDNN (NVIDIA's Deep Neural Network library).\n", 35 | "2.\tInstall Python.\n", 36 | " - I personally recommend installing Anaconda, a Python distribution.\n", 37 | " - Currently, Keras is compatible with Python 2.7-3.5.\n", 38 | "3.\tInstall a backend engine.\n", 39 | " - Keras supports either Theano or Tensorflow or CNTK.\n", 40 | " - Keras uses TF by default, so if using Theano or CNTK, you will need to change Keras configuration afterwards. \n", 41 | " - I have another video in this playlist that explains how to change the backend from Tensorflow to Theano.\n", 42 | "4.\tInstall Keras.\n", 43 | "5.\tInstall a Python IDE. \n", 44 | " - I prefer working with Jupyter Notebook, a scientific notebook for Python.\n", 45 | " - I’ll be using this for working with Keras in subsequent videos.\n", 46 | "6.\tInstall HDF5 and h5py to have the ability to save Keras models to disk.\n" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": null, 52 | "metadata": { 53 | "collapsed": true 54 | }, 55 | "outputs": [], 56 | "source": [] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": null, 61 | "metadata": { 62 | "collapsed": true 63 | }, 64 | "outputs": [], 65 | "source": [] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": null, 70 | "metadata": { 71 | "collapsed": true 72 | }, 73 | "outputs": [], 74 | "source": [] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": null, 79 | "metadata": { 80 | "collapsed": true 81 | }, 82 | "outputs": [], 83 | "source": [] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": null, 88 | "metadata": { 89 | "collapsed": true 90 | }, 91 | "outputs": [], 92 | "source": [] 93 | } 94 | ], 95 | "metadata": { 96 | "kernelspec": { 97 | "display_name": "Python 3", 98 | "language": "python", 99 | "name": "python3" 100 | }, 101 | "language_info": { 102 | "codemirror_mode": { 103 | "name": "ipython", 104 | "version": 3 105 | }, 106 | "file_extension": ".py", 107 | "mimetype": "text/x-python", 108 | "name": "python", 109 | "nbconvert_exporter": "python", 110 | "pygments_lexer": "ipython3", 111 | "version": "3.4.5" 112 | } 113 | }, 114 | "nbformat": 4, 115 | "nbformat_minor": 2 116 | } 117 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Machine Learning / Deep Learning / Keras - Jupyter Notebooks 2 | This repository contains the Jupyter notebooks and other resources used in the following deeplizard YouTube playlists: 3 | 4 | - [Keras Machine Learning / Deep Learning Tutorial](https://www.youtube.com/playlist?list=PLZbbT5o_s2xrwRnXk_yCPtnqqo4_u2YGL) 5 | - [Machine Learning & Deep Learning Fundamentals](https://www.youtube.com/playlist?list=PLZbbT5o_s2xq7LwI2y8_QtvuXZedL6tQU) 6 | 7 | -------------------------------------------------------------------------------- /flask_apps/README.md: -------------------------------------------------------------------------------- 1 | The VGG16_cats_and_dogs.h5 file is too large to upload to Github. 2 | Download it here: 3 | https://drive.google.com/open?id=19yICdtSbU_YkQBRxJ2if9KJwUL1oY5xs 4 | -------------------------------------------------------------------------------- /flask_apps/hello_app.py: -------------------------------------------------------------------------------- 1 | from flask import request 2 | from flask import jsonify 3 | from flask import Flask 4 | 5 | app = Flask(__name__) 6 | 7 | @app.route('/hello',methods=['POST']) 8 | def hello(): 9 | message = request.get_json(force=True) 10 | name = message['name'] 11 | response = { 12 | 'greeting': 'Hello, ' + name + '!' 13 | } 14 | return jsonify(response) 15 | -------------------------------------------------------------------------------- /flask_apps/predict_app.py: -------------------------------------------------------------------------------- 1 | import base64 2 | import numpy as np 3 | import io 4 | from PIL import Image 5 | import keras 6 | from keras import backend as K 7 | from keras.models import Sequential 8 | from keras.models import load_model 9 | from keras.preprocessing.image import ImageDataGenerator 10 | from keras.preprocessing.image import img_to_array 11 | from flask import request 12 | from flask import jsonify 13 | from flask import Flask 14 | 15 | app = Flask(__name__) 16 | 17 | def get_model(): 18 | global model 19 | model = load_model('VGG16_cats_and_dogs.h5') 20 | print(" * Model loaded!") 21 | 22 | def preprocess_image(image, target_size): 23 | if image.mode != "RGB": 24 | image = image.convert("RGB") 25 | image = image.resize(target_size) 26 | image = img_to_array(image) 27 | image = np.expand_dims(image, axis=0) 28 | 29 | return image 30 | 31 | print(" * Loading Keras model...") 32 | get_model() 33 | 34 | @app.route("/predict", methods=["POST"]) 35 | def predict(): 36 | message = request.get_json(force=True) 37 | encoded = message['image'] 38 | decoded = base64.b64decode(encoded) 39 | image = Image.open(io.BytesIO(decoded)) 40 | processed_image = preprocess_image(image, target_size=(224, 224)) 41 | 42 | prediction = model.predict(processed_image).tolist() 43 | 44 | response = { 45 | 'prediction': { 46 | 'dog': prediction[0][0], 47 | 'cat': prediction[0][1] 48 | } 49 | } 50 | return jsonify(response) 51 | -------------------------------------------------------------------------------- /flask_apps/sample_app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | app = Flask(__name__) 3 | 4 | @app.route('/sample') 5 | def running(): 6 | return 'Flask is running!' 7 | -------------------------------------------------------------------------------- /flask_apps/static/hello.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | deeplizard greeting app 5 | 10 | 11 | 12 | 13 | 14 |

15 | 16 | 17 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /flask_apps/static/predict-with-visuals.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | deeplizard predict image app 5 | 6 | 9 | 10 | 11 | 12 | 13 |
14 |
15 |
16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /flask_apps/static/predict.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | deeplizard predict image app 5 | 10 | 11 | 12 | 13 | 14 |

Predictions

15 |

Dog:

16 |

Cat:

17 | 18 | 19 | 20 | 47 | 48 | 49 | --------------------------------------------------------------------------------