Ce serveur Gitlab sera éteint le 30 juin 2020, pensez à migrer vos projets vers les serveurs gitlab-research.centralesupelec.fr et gitlab-student.centralesupelec.fr !

Spectrum_Keras-5_cat.ipynb 87.3 KB
Newer Older
SoleneDc's avatar
SoleneDc committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. CNN"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Récupération des genres"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Permet de récupérer les labels qui seront mis dans une array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "import ast\n",
    "import pandas as pd\n",
    "from __future__ import absolute_import\n",
    "from __future__ import division\n",
    "from __future__ import print_function\n",
    "from keras.preprocessing.sequence import pad_sequences\n",
    "pd.options.mode.chained_assignment = None\n",
    "import argparse\n",
    "import sys\n",
    "import numpy as np\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.image as mpimg\n",
    "import tensorflow as tf\n",
    "import os\n",
    "import cv2\n",
    "from math import floor"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Choisir l'année !"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "years = [2004, 2005, 2006, 2007, 2008]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [],
   "source": [
    "list_of_eligible_spectrums = []\n",
    "for year in years:\n",
    "    for file in os.listdir(\"spectrumImages/SpectrumImages\" + str(year)):\n",
    "        if str(file)[-4:] == '.jpg':\n",
    "            list_of_eligible_spectrums += ['SpectrumImages'+ str(year) +'/' + file]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We select: Action / Comedy / Thriller / Horror / Drama\n",
    "            28  / 35 / 53/ 27 / 18"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "{\"genres\":[{\"id\":28,\"name\":\"Action\"},{\"id\":12,\"name\":\"Adventure\"},{\"id\":16,\"name\":\"Animation\"},{\"id\":35,\"name\":\"Comedy\"},{\"id\":80,\"name\":\"Crime\"},{\"id\":99,\"name\":\"Documentary\"},{\"id\":18,\"name\":\"Drama\"},{\"id\":10751,\"name\":\"Family\"},{\"id\":14,\"name\":\"Fantasy\"},{\"id\":36,\"name\":\"History\"},{\"id\":27,\"name\":\"Horror\"},{\"id\":10402,\"name\":\"Music\"},{\"id\":9648,\"name\":\"Mystery\"},{\"id\":10749,\"name\":\"Romance\"},{\"id\":878,\"name\":\"Science Fiction\"},{\"id\":10770,\"name\":\"TV Movie\"},{\"id\":53,\"name\":\"Thriller\"},{\"id\":10752,\"name\":\"War\"},{\"id\":37,\"name\":\"Western\"}]}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n",
      "do something! Too many points.......\n"
     ]
    }
   ],
   "source": [
    "genres = [28, 35, 18, 99, 10749, 10752, 10402, 53, 878, 27, 9648, 80, 14, 12, 36, 10769, 16, 10751, 37, 10770]\n",
    "\n",
    "wanted_genres = {28: 'action', 35: 'comedy', 18: 'drama', 99: 0, 10749: 'comedy',10752: 'action', 10402: 0, 53: 'thriller', 878: 'action', 27: 'horror', 9648: 'thriller', 80: 'thriller', 14: 'action', 12: 'action', 36: 0, 10769: 0, 16: 0, 10751: 0, 37: 'action', 10770: 0}\n",
    "\n",
    "def get_genre_from_link():\n",
    "    dict_inverse = {}\n",
    "    links_to_be_removed = []\n",
    "    for year in years:\n",
    "        path = \"./Link-dictionaries/Link-dictionary\" + str(year)+ \".txt\"\n",
    "        file = open(path, \"r\").read()\n",
    "        dictyear = ast.literal_eval(file)\n",
    "        for movie_id in dictyear.keys():\n",
    "            if dictyear[movie_id][1] != []:\n",
    "                dict_inverse[str(dictyear[movie_id][2])] = {}\n",
    "                movie_genres = dictyear[movie_id][1]\n",
    "                if wanted_genres[movie_genres[0]] != 0:\n",
    "                        dict_inverse[str(dictyear[movie_id][2])]['genre'] = wanted_genres[movie_genres[0]]\n",
    "                elif len(movie_genres)>1:\n",
    "                    if wanted_genres[movie_genres[1]] != 0:\n",
    "                        dict_inverse[str(dictyear[movie_id][2])]['genre'] = wanted_genres[movie_genres[1]]\n",
    "                    elif len(movie_genres)>2:\n",
    "                        if wanted_genres[movie_genres[2]] != 0:\n",
    "                            dict_inverse[str(dictyear[movie_id][2])]['genre'] = wanted_genres[movie_genres[2]]\n",
    "                        else:\n",
    "                            links_to_be_removed += [dictyear[movie_id][2]]\n",
    "                    else:\n",
    "                        links_to_be_removed += [dictyear[movie_id][2]]\n",
    "                else:\n",
    "                    links_to_be_removed += [dictyear[movie_id][2]]\n",
    "            else:\n",
    "                links_to_be_removed += [dictyear[movie_id][2]]\n",
    "    return dict_inverse, links_to_be_removed\n",
    "\n",
    "def get_output_list(L):\n",
    "    dict_inverse, links_to_be_removed = get_genre_from_link()\n",
    "    eligible_links = []\n",
    "    output = []\n",
    "    for link in L:\n",
    "        link = str(link)\n",
    "        #print(dict_inverse[str(link)])\n",
    "        if link[-5] == \".\":\n",
    "            link = link[:-4] + link[-3:]\n",
    "            print(\"do something! Too many points.......\")\n",
    "        if link.split('/')[1][:-4] not in links_to_be_removed:\n",
    "            eligible_links += [link[:-4]]\n",
    "    return dict_inverse, eligible_links\n",
    "\n",
    "\n",
    "dict_inverse, eligible_links = get_output_list(list_of_eligible_spectrums)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#for element in labels:\n",
    "#   for genre in element:\n",
    "#       if genre not in genres:\n",
    "#           genres += [genre]\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#Modif pour ajouter des catégories\n",
    "trY[2][3]=1\n",
    "trY.shape\n",
    "from random import randint\n",
    "for i in range(1225):\n",
    "    rand = randint(0,19)\n",
    "    trY[i][rand] = 1\n",
    "trY[3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Bien vérifier la taille des données !"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Extraction des images"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n",
      "'NoneType' object is not subscriptable\n"
     ]
    }
   ],
   "source": [
    "for file in eligible_links:\n",
    "    img = cv2.imread('SpectrumImages/'+ file + '.jpg', 1)\n",
    "    try:\n",
    "        img = img[0:1]\n",
    "    except Exception as e:\n",
    "        print(e)\n",
    "        img = cv2.imread('SpectrumImages/'+ file + '..jpg', 1)\n",
    "        img = img[0:1]\n",
    "    img = img.reshape((img.shape[1], img.shape[2]))\n",
    "    dict_inverse[file.split('/')[1]]['image'] = img"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df = pd.DataFrame.from_dict(dict_inverse)\n",
    "df = df.transpose()\n",
    "df = df.reset_index(drop=True)\n",
    "#shuffling\n",
    "df = df.sample(frac=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>genre</th>\n",
       "      <th>image</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>2812</td>\n",
       "      <td>1960</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>unique</th>\n",
       "      <td>5</td>\n",
       "      <td>1960</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>top</th>\n",
       "      <td>drama</td>\n",
       "      <td>[[9, 0, 3], [9, 1, 1], [10, 4, 0], [20, 17, 3]...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>freq</th>\n",
       "      <td>891</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        genre                                              image\n",
       "count    2812                                               1960\n",
       "unique      5                                               1960\n",
       "top     drama  [[9, 0, 3], [9, 1, 1], [10, 4, 0], [20, 17, 3]...\n",
       "freq      891                                                  1"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(6981, 2)"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df2 = df.dropna(axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3515, 2)"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>genre</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>action</th>\n",
       "      <td>864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>comedy</th>\n",
       "      <td>955</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>drama</th>\n",
       "      <td>1079</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>horror</th>\n",
       "      <td>312</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>thriller</th>\n",
       "      <td>305</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          image\n",
       "genre          \n",
       "action      864\n",
       "comedy      955\n",
       "drama      1079\n",
       "horror      312\n",
       "thriller    305"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.groupby('genre').count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [],
   "source": [
    "df3 = pd.get_dummies(df2,columns=['genre'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2812"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_len = int(df3.shape[0]*0.8)\n",
    "train_len"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "train = df3.iloc[:train_len, :]\n",
    "test = df3.iloc[train_len:, :]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2475    [[15, 11, 6], [17, 14, 0], [17, 15, 0], [14, 1...\n",
       "5792    [[25, 17, 10], [20, 18, 7], [22, 19, 4], [27, ...\n",
       "3475    [[95, 38, 0], [95, 38, 0], [95, 38, 0], [95, 3...\n",
       "4959    [[19, 0, 7], [0, 12, 0], [48, 93, 30], [41, 99...\n",
       "5825    [[28, 116, 0], [32, 114, 1], [34, 114, 1], [30...\n",
       "Name: image, dtype: object"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train['image'].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((2812, 6), (703, 6))"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.shape, test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train = train['image']\n",
    "Y_train = train.drop('image', 1)\n",
    "X_test = test['image']\n",
    "Y_test = test.drop('image', 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Vérifications des données"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train = pad_sequences(X_train)\n",
    "X_test = pad_sequences(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "input_shapeA = (X_train.shape[1], X_train.shape[2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Modèle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Conv1D 1 : (None, 16047, 2)\n",
      "MaxP1D 1 : (None, 8023, 2)\n",
      "Conv1D 2 : (None, 8021, 4)\n",
      "MaxP1D 2 : (None, 4010, 4)\n",
      "Flatten : (None, 16040)\n",
      "Dense  2 : (None, 5)\n"
     ]
    }
   ],
   "source": [
    "from keras.models import Sequential\n",
    "from keras.layers import Dense, Activation\n",
    "from keras.layers import Conv1D, MaxPooling1D\n",
    "from keras.layers import Dropout, Average, BatchNormalization\n",
    "from keras.layers import Flatten\n",
    "\n",
    "num_classes=5\n",
    "\n",
    "#Hyperparameters\n",
    "filtersCNN1=2 #pourquoi ??\n",
    "kernelSize1=3\n",
    "\n",
    "filtersCNN2=4\n",
    "kernelSize2=3\n",
    "\n",
    "unitsFC1=1000\n",
    "unitsFC2=num_classes\n",
    "\n",
    "#defining the layers architecture\n",
    "\n",
    "model = Sequential()\n",
    "model.add(Conv1D(filtersCNN1,kernelSize1,strides=1, padding=\"valid\", activation='relu',input_shape=input_shapeA))\n",
    "print(\"Conv1D 1 : {}\".format(model.output_shape))\n",
    "model.add(MaxPooling1D(pool_size=2,padding=\"valid\"))\n",
    "print(\"MaxP1D 1 : {}\".format(model.output_shape))\n",
    "#BatchNormalization(axis=3)\n",
    "model.add(Dropout(0.25))\n",
    "\n",
    "model.add(Conv1D(filtersCNN2,kernelSize2,strides=1, padding=\"valid\", activation='relu'))\n",
    "print(\"Conv1D 2 : {}\".format(model.output_shape))\n",
    "model.add(MaxPooling1D(pool_size=2,strides=None,padding=\"valid\"))\n",
    "print(\"MaxP1D 2 : {}\".format(model.output_shape))\n",
    "#BatchNormalization(axis=3)\n",
    "\n",
    "model.add(Flatten())\n",
    "print(\"Flatten : {}\".format(model.output_shape))\n",
    "#model.add(Dense(1000, activation='relu'))\n",
    "#print(\"Dense  1 : {}\".format(model.output_shape))\n",
    "model.add(Dense(num_classes, activation='softmax'))\n",
    "print(\"Dense  2 : {}\".format(model.output_shape))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv1d_11 (Conv1D)           (None, 16047, 2)          20        \n",
      "_________________________________________________________________\n",
      "max_pooling1d_11 (MaxPooling (None, 8023, 2)           0         \n",
      "_________________________________________________________________\n",
      "dropout_7 (Dropout)          (None, 8023, 2)           0         \n",
      "_________________________________________________________________\n",
      "conv1d_12 (Conv1D)           (None, 8021, 4)           28        \n",
      "_________________________________________________________________\n",
      "max_pooling1d_12 (MaxPooling (None, 4010, 4)           0         \n",
      "_________________________________________________________________\n",
      "flatten_6 (Flatten)          (None, 16040)             0         \n",
      "_________________________________________________________________\n",
      "dense_6 (Dense)              (None, 5)                 80205     \n",
      "=================================================================\n",
      "Total params: 80,253\n",
      "Trainable params: 80,253\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Entrainement du modèle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1968 samples, validate on 844 samples\n",
      "Epoch 1/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.5324 - acc: 0.3069 - val_loss: 1.4749 - val_acc: 0.3389\n",
      "Epoch 2/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.4474 - acc: 0.3399 - val_loss: 1.4851 - val_acc: 0.3211\n",
      "Epoch 3/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.4193 - acc: 0.3567 - val_loss: 1.5060 - val_acc: 0.3211\n",
      "Epoch 4/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.4047 - acc: 0.3745 - val_loss: 1.5121 - val_acc: 0.3389\n",
      "Epoch 5/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.3780 - acc: 0.3928 - val_loss: 1.5412 - val_acc: 0.3211\n",
      "Epoch 6/100\n",
      "1968/1968 [==============================] - 7s 3ms/step - loss: 1.3798 - acc: 0.3816 - val_loss: 1.5384 - val_acc: 0.3033\n",
      "Epoch 7/100\n",
      "1968/1968 [==============================] - 7s 3ms/step - loss: 1.3524 - acc: 0.4121 - val_loss: 1.5622 - val_acc: 0.3092\n",
      "Epoch 8/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.3508 - acc: 0.4136 - val_loss: 1.5591 - val_acc: 0.3116\n",
      "Epoch 9/100\n",
      "1968/1968 [==============================] - 8s 4ms/step - loss: 1.3314 - acc: 0.4136 - val_loss: 1.5862 - val_acc: 0.2974\n",
      "Epoch 10/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.3401 - acc: 0.4146 - val_loss: 1.6006 - val_acc: 0.3033\n",
      "Epoch 11/100\n",
      "1968/1968 [==============================] - 8s 4ms/step - loss: 1.3284 - acc: 0.4121 - val_loss: 1.5845 - val_acc: 0.3045\n",
      "Epoch 12/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.3240 - acc: 0.4126 - val_loss: 1.5817 - val_acc: 0.3199\n",
      "Epoch 13/100\n",
      "1968/1968 [==============================] - 8s 4ms/step - loss: 1.3037 - acc: 0.4243 - val_loss: 1.5933 - val_acc: 0.3128\n",
      "Epoch 14/100\n",
      "1968/1968 [==============================] - 7s 3ms/step - loss: 1.3046 - acc: 0.4400 - val_loss: 1.6194 - val_acc: 0.3152\n",
      "Epoch 15/100\n",
      "1968/1968 [==============================] - 8s 4ms/step - loss: 1.3116 - acc: 0.4284 - val_loss: 1.6072 - val_acc: 0.3152\n",
      "Epoch 16/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.2943 - acc: 0.4278 - val_loss: 1.6256 - val_acc: 0.3092\n",
      "Epoch 17/100\n",
      "1968/1968 [==============================] - 7s 3ms/step - loss: 1.2949 - acc: 0.4248 - val_loss: 1.6398 - val_acc: 0.3045\n",
      "Epoch 18/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.3019 - acc: 0.4263 - val_loss: 1.6529 - val_acc: 0.3081\n",
      "Epoch 19/100\n",
      "1968/1968 [==============================] - 7s 3ms/step - loss: 1.2959 - acc: 0.4339 - val_loss: 1.6403 - val_acc: 0.3081\n",
      "Epoch 20/100\n",
      "1968/1968 [==============================] - 8s 4ms/step - loss: 1.2941 - acc: 0.4289 - val_loss: 1.6491 - val_acc: 0.2950\n",
      "Epoch 21/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.2958 - acc: 0.4228 - val_loss: 1.6682 - val_acc: 0.3009\n",
      "Epoch 22/100\n",
      "1968/1968 [==============================] - 8s 4ms/step - loss: 1.3036 - acc: 0.4258 - val_loss: 1.6632 - val_acc: 0.3116\n",
      "Epoch 23/100\n",
      "1968/1968 [==============================] - 8s 4ms/step - loss: 1.2907 - acc: 0.4278 - val_loss: 1.6540 - val_acc: 0.3104\n",
      "Epoch 24/100\n",
      "1968/1968 [==============================] - 10s 5ms/step - loss: 1.2893 - acc: 0.4461 - val_loss: 1.6825 - val_acc: 0.2950\n",
      "Epoch 25/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.2906 - acc: 0.4461 - val_loss: 1.6729 - val_acc: 0.3009\n",
      "Epoch 26/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.2788 - acc: 0.4365 - val_loss: 1.6808 - val_acc: 0.2986\n",
      "Epoch 27/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.2866 - acc: 0.4405 - val_loss: 1.6687 - val_acc: 0.3021\n",
      "Epoch 28/100\n",
      "1968/1968 [==============================] - 7s 3ms/step - loss: 1.2734 - acc: 0.4355 - val_loss: 1.6902 - val_acc: 0.3187\n",
      "Epoch 29/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.2792 - acc: 0.4426 - val_loss: 1.6696 - val_acc: 0.3116\n",
      "Epoch 30/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.2692 - acc: 0.4390 - val_loss: 1.7285 - val_acc: 0.3021\n",
      "Epoch 31/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.2861 - acc: 0.4350 - val_loss: 1.7006 - val_acc: 0.3081\n",
      "Epoch 32/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.2861 - acc: 0.4233 - val_loss: 1.6859 - val_acc: 0.2974\n",
      "Epoch 33/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.2874 - acc: 0.4233 - val_loss: 1.7044 - val_acc: 0.2867\n",
      "Epoch 34/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.2753 - acc: 0.4533 - val_loss: 1.6926 - val_acc: 0.2962\n",
      "Epoch 35/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.2740 - acc: 0.4385 - val_loss: 1.7104 - val_acc: 0.3057\n",
      "Epoch 36/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.2766 - acc: 0.4314 - val_loss: 1.6899 - val_acc: 0.3057\n",
      "Epoch 37/100\n",
      "1968/1968 [==============================] - 7s 3ms/step - loss: 1.2746 - acc: 0.4370 - val_loss: 1.7077 - val_acc: 0.2998\n",
      "Epoch 38/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.2654 - acc: 0.4477 - val_loss: 1.6951 - val_acc: 0.3140\n",
      "Epoch 39/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.2720 - acc: 0.4375 - val_loss: 1.7126 - val_acc: 0.3033\n",
      "Epoch 40/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.2593 - acc: 0.4446 - val_loss: 1.7126 - val_acc: 0.2962\n",
      "Epoch 41/100\n",
      "1968/1968 [==============================] - 6s 3ms/step - loss: 1.2780 - acc: 0.4390 - val_loss: 1.7212 - val_acc: 0.3092\n",
      "Epoch 42/100\n",
      "1968/1968 [==============================] - 7s 3ms/step - loss: 1.2752 - acc: 0.4390 - val_loss: 1.7357 - val_acc: 0.3009\n",
      "Epoch 43/100\n",
      "1968/1968 [==============================] - 7s 4ms/step - loss: 1.2782 - acc: 0.4395 - val_loss: 1.6796 - val_acc: 0.3140\n",
      "Epoch 44/100\n",
      "1200/1968 [=================>............] - ETA: 2s - loss: 1.2372 - acc: 0.4475- ETA: 4s - loss: 1."
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-155-91fae3e71adf>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      3\u001b[0m               metrics=['accuracy'])\n\u001b[1;32m      4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mhistory\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalidation_split\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m50\u001b[0m \u001b[0;34m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/keras/models.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)\u001b[0m\n\u001b[1;32m    961\u001b[0m                               \u001b[0minitial_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    962\u001b[0m                               \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 963\u001b[0;31m                               validation_steps=validation_steps)\n\u001b[0m\u001b[1;32m    964\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    965\u001b[0m     def evaluate(self, x=None, y=None,\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)\u001b[0m\n\u001b[1;32m   1703\u001b[0m                               \u001b[0minitial_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1704\u001b[0m                               \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1705\u001b[0;31m                               validation_steps=validation_steps)\n\u001b[0m\u001b[1;32m   1706\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1707\u001b[0m     def evaluate(self, x=None, y=None,\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36m_fit_loop\u001b[0;34m(self, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps)\u001b[0m\n\u001b[1;32m   1233\u001b[0m                         \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtoarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1234\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1235\u001b[0;31m                     \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins_batch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1236\u001b[0m                     \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1237\u001b[0m                         \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m   2476\u001b[0m         \u001b[0msession\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_session\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2477\u001b[0m         updated = session.run(fetches=fetches, feed_dict=feed_dict,\n\u001b[0;32m-> 2478\u001b[0;31m                               **self.session_kwargs)\n\u001b[0m\u001b[1;32m   2479\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mupdated\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2480\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m    903\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    904\u001b[0m       result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[0;32m--> 905\u001b[0;31m                          run_metadata_ptr)\n\u001b[0m\u001b[1;32m    906\u001b[0m       \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    907\u001b[0m         \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run\u001b[0;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m   1135\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mhandle\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfeed_dict_tensor\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1136\u001b[0m       results = self._do_run(handle, final_targets, final_fetches,\n\u001b[0;32m-> 1137\u001b[0;31m                              feed_dict_tensor, options, run_metadata)\n\u001b[0m\u001b[1;32m   1138\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1139\u001b[0m       \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_run\u001b[0;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m   1353\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1354\u001b[0m       return self._do_call(_run_fn, self._session, feeds, fetches, targets,\n\u001b[0;32m-> 1355\u001b[0;31m                            options, run_metadata)\n\u001b[0m\u001b[1;32m   1356\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1357\u001b[0m       \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_prun_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeeds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetches\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m   1359\u001b[0m   \u001b[0;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1360\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1361\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1362\u001b[0m     \u001b[0;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1363\u001b[0m       \u001b[0mmessage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[0;34m(session, feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[1;32m   1338\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1339\u001b[0m           return tf_session.TF_Run(session, options, feed_dict, fetch_list,\n\u001b[0;32m-> 1340\u001b[0;31m                                    target_list, status, run_metadata)\n\u001b[0m\u001b[1;32m   1341\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1342\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "model.compile(loss='categorical_crossentropy',\n",
    "              optimizer='adam',\n",
    "              metrics=['accuracy'])\n",
    "\n",
    "history = model.fit(X_train, Y_train, epochs=100, validation_split=0.3, batch_size=50 , verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "       Année: [2006, 2007]   //  Genre: [28, 35, 53, 27, 18]  //  Données X_train: (1568, 1308, 3)\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x18302a8470>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nOjo46aST+NGPfsS73/1ubr/9di6++GLMjEwmw5133klrays7d+7klFNO4YILLpjyPr433HADjY2N\nbNiwgQ0bNrBy5cqxef/wD//AzJkzyefznHXWWWzYsIErr7ySa6+9ljVr1jBr1qxx63rkkUe45ZZb\nxoalPvnkk3nrW9/KjBkzePbZZ7ntttu46aabeN/73sf3vvc9Lr300nHv/9znPsePf/xjFi5cOFbV\ndPPNN9PW1sbDDz/MyMgIp556KmeffTarV6/mmmuu4e67797fT3lK1S4R/BD44/DvPwYmpu4KWDij\ngXjMdFGZyCGstHqotFrI3fmbv/kbOjs7efvb387WrVt5+eWXp1zPz3/+87Ef5M7OTjo7O8fmfec7\n32HlypWsWLGCJ554YtIhrEv94he/4L3vfS9NTU00Nzdz4YUX8tBDDwGwZMkSli9fDkw/1PVll13G\nTTfdRD6fB+D+++/nm9/8JsuXL+fkk0+mu7ubZ599tsxPaf9UrERgZrcBZwCzzGwL8BlgNfAdM/sw\n8CLwR5XafqlkPMZhMxrUc0jkYJjmzL2S3vOe9/DJT36SRx99lKGhobEz+VtvvZWuri4eeeQRkskk\nixcvnnTo6VKTlRZeeOEFrrnmGh5++GFmzJjBZZddts/1TNcBJZ1Oj/0dj8cnrRr6yle+wtq1a7nn\nnntYvnw569evx925/vrrOeecc8Yt++CDD04by4GoZK+hS9x9vrsn3X2Ru9/s7t3ufpa7HxM+792r\nqGKO6GjStQQih7Dm5mbOOOMMPvShD41rJO7p6WHOnDkkk0nWrFnD5s2bp13P6aefzq233grA448/\nzoYNG4BgCOumpiba2tp4+eWXue+++8beM9Uw06effjp33XUXg4ODDAwMcOedd/L7v//7Ze/Tc889\nx8knn8znPvc5Zs2axUsvvcQ555zDDTfcQDabBeB3v/sdAwMDFR3quu6HoS5aMquJdZt24e5T1h2K\nyOvbJZdcwoUXXjiuB9EHPvAB3vWud7Fq1SqWL1/OG97whmnX8dGPfpQPfvCDdHZ2snz5ck466SQA\nli1bxooVKzj++OMnDGF9+eWXc+655zJ//nzWrFkzNn3lypVcdtllY+v4kz/5E1asWDFpNdBkrrrq\nKp599lncnbPOOotly5bR2dnJpk2bWLlyJe7O7Nmzueuuu+js7CSRSLBs2TIuu+wyPvGJT5T7se1T\n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\niTglAhGRiPv/KQyalhHJgFwAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1829ec4dd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "train, =plt.plot(history.history['acc'], label='Train set')\n",
    "val, =plt.plot(history.history['val_acc'], label='Validation set')\n",
    "print('')\n",
    "print(f\"       Année: {years}   //  Genre: {selected_genre}  //  Données X_train: {X_train.shape}\")\n",
    "print('')\n",
    "plt.title('model accuracy')\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.xlabel('Epochs')\n",
    "plt.legend(handles=[train, val])\n",
    "plt.show()\n",
    "train, =plt.plot(history.history['loss'], label='Train set')\n",
    "val, =plt.plot(history.history['val_loss'], label='Validation set')\n",
    "plt.title('model Loss')\n",
    "plt.ylabel('Cross entropy')\n",
    "plt.xlabel('Epochs')\n",
    "plt.legend(handles=[train, val])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}