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.6 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
{
 "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",
SoleneDc's avatar
SoleneDc committed
26
   "execution_count": 1,
SoleneDc's avatar
SoleneDc committed
27
   "metadata": {},
SoleneDc's avatar
SoleneDc committed
28 29 30 31 32 33 34 35 36
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
SoleneDc's avatar
SoleneDc committed
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
   "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",
SoleneDc's avatar
SoleneDc committed
66 67 68 69
   "execution_count": 92,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
70 71
   "outputs": [],
   "source": [
SoleneDc's avatar
SoleneDc committed
72
    "years = [2004, 2005, 2006, 2007, 2008, 2015]"
SoleneDc's avatar
SoleneDc committed
73 74 75 76
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
77
   "execution_count": 96,
SoleneDc's avatar
SoleneDc committed
78 79 80 81 82
   "metadata": {},
   "outputs": [],
   "source": [
    "list_of_eligible_spectrums = []\n",
    "for year in years:\n",
SoleneDc's avatar
SoleneDc committed
83
    "    for file in os.listdir(\"./spectrumImages/SpectrumImages\" + str(year)):\n",
SoleneDc's avatar
SoleneDc committed
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
    "        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",
SoleneDc's avatar
SoleneDc committed
105
   "execution_count": 97,
SoleneDc's avatar
SoleneDc committed
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
   "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"
     ]
    }
   ],
   "source": [
    "genres = [28, 35, 18, 99, 10749, 10752, 10402, 53, 878, 27, 9648, 80, 14, 12, 36, 10769, 16, 10751, 37, 10770]\n",
    "\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
130 131
    "wanted_genres = {28: 'action', 35: 'comedy', 18: 'drama', 99: 0, 10749: 'comedy',10752: 'action', 10402: 0, 53: 'action', 878: 'action', 27: 'action', 9648: 'action', 80: 'action', 14: 'action', 12: 'action', 36: 0, 10769: 0, 16: 0, 10751: 0, 37: 'action', 10770: 0}\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",
SoleneDc's avatar
SoleneDc committed
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
    "\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",
SoleneDc's avatar
SoleneDc committed
182 183 184 185
   "execution_count": 98,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
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
   "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",
SoleneDc's avatar
SoleneDc committed
224
   "execution_count": 99,
SoleneDc's avatar
SoleneDc committed
225 226 227 228 229 230 231
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "'NoneType' object is not subscriptable\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
232
      "SpectrumImages2004/3jBFwltrxJw\n",
SoleneDc's avatar
SoleneDc committed
233
      "'NoneType' object is not subscriptable\n",
SoleneDc's avatar
SoleneDc committed
234
      "SpectrumImages2006/BH0MLyu6HjY\n",
SoleneDc's avatar
SoleneDc committed
235
      "'NoneType' object is not subscriptable\n",
SoleneDc's avatar
SoleneDc committed
236
      "SpectrumImages2008/1Gl2kVUsy2M\n",
SoleneDc's avatar
SoleneDc committed
237
      "'NoneType' object is not subscriptable\n",
SoleneDc's avatar
SoleneDc committed
238
      "SpectrumImages2015/6HIlyaGAkXo\n",
SoleneDc's avatar
SoleneDc committed
239
      "'NoneType' object is not subscriptable\n",
SoleneDc's avatar
SoleneDc committed
240
      "SpectrumImages2015/clEBwkjs0sQ\n",
SoleneDc's avatar
SoleneDc committed
241
      "'NoneType' object is not subscriptable\n",
SoleneDc's avatar
SoleneDc committed
242
      "SpectrumImages2015/hsuKq5pNOcM\n",
SoleneDc's avatar
SoleneDc committed
243
      "'NoneType' object is not subscriptable\n",
SoleneDc's avatar
SoleneDc committed
244
      "SpectrumImages2015/KHGHEpUeUwo\n",
SoleneDc's avatar
SoleneDc committed
245
      "'NoneType' object is not subscriptable\n",
SoleneDc's avatar
SoleneDc committed
246
      "SpectrumImages2015/ngesu4t3oKc\n",
SoleneDc's avatar
SoleneDc committed
247
      "'NoneType' object is not subscriptable\n",
SoleneDc's avatar
SoleneDc committed
248
      "SpectrumImages2015/tOilM3Ze-us\n",
SoleneDc's avatar
SoleneDc committed
249
      "'NoneType' object is not subscriptable\n",
SoleneDc's avatar
SoleneDc committed
250
      "SpectrumImages2015/uigIV1ALQYQ\n",
SoleneDc's avatar
SoleneDc committed
251
      "'NoneType' object is not subscriptable\n",
SoleneDc's avatar
SoleneDc committed
252
      "SpectrumImages2015/Xq6XgPSgzmA\n"
SoleneDc's avatar
SoleneDc committed
253 254 255 256 257
     ]
    }
   ],
   "source": [
    "for file in eligible_links:\n",
SoleneDc's avatar
SoleneDc committed
258
    "    img = cv2.imread('./SpectrumImages/'+ file + '.jpg', 1)\n",
SoleneDc's avatar
SoleneDc committed
259 260 261 262
    "    try:\n",
    "        img = img[0:1]\n",
    "    except Exception as e:\n",
    "        print(e)\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
263
    "        print(file)\n",
SoleneDc's avatar
SoleneDc committed
264
    "        img = cv2.imread('./SpectrumImages/'+ file + '..jpg', 1)\n",
SoleneDc's avatar
SoleneDc committed
265 266 267 268 269 270 271
    "        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",
SoleneDc's avatar
SoleneDc committed
272 273 274 275
   "execution_count": 100,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
276 277 278 279 280 281 282 283 284 285 286
   "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",
SoleneDc's avatar
SoleneDc committed
287
   "execution_count": 101,
SoleneDc's avatar
SoleneDc committed
288
   "metadata": {},
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
289
   "outputs": [],
SoleneDc's avatar
SoleneDc committed
290
   "source": [
SoleneDc's avatar
SoleneDc committed
291
    "#df.describe()"
SoleneDc's avatar
SoleneDc committed
292 293 294 295
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
296
   "execution_count": 102,
SoleneDc's avatar
SoleneDc committed
297 298 299 300 301
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
SoleneDc's avatar
SoleneDc committed
302
       "(10404, 2)"
SoleneDc's avatar
SoleneDc committed
303 304
      ]
     },
SoleneDc's avatar
SoleneDc committed
305
     "execution_count": 102,
SoleneDc's avatar
SoleneDc committed
306 307 308 309 310 311 312 313 314 315
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
316 317 318 319
   "execution_count": 103,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
320 321 322 323 324 325 326
   "outputs": [],
   "source": [
    "df2 = df.dropna(axis=0)"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
327
   "execution_count": 104,
SoleneDc's avatar
SoleneDc committed
328 329 330 331 332
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
SoleneDc's avatar
SoleneDc committed
333
       "(4361, 2)"
SoleneDc's avatar
SoleneDc committed
334 335
      ]
     },
SoleneDc's avatar
SoleneDc committed
336
     "execution_count": 104,
SoleneDc's avatar
SoleneDc committed
337 338 339 340 341 342 343 344 345 346
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.shape"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
347
   "execution_count": 119,
SoleneDc's avatar
SoleneDc committed
348 349 350 351 352 353
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
SoleneDc's avatar
SoleneDc committed
354 355 356
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
SoleneDc's avatar
SoleneDc committed
357 358
       "    }\n",
       "\n",
SoleneDc's avatar
SoleneDc committed
359 360
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
SoleneDc's avatar
SoleneDc committed
361
       "    }\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
362
       "\n",
SoleneDc's avatar
SoleneDc committed
363 364
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
365
       "    }\n",
SoleneDc's avatar
SoleneDc committed
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
       "</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",
SoleneDc's avatar
SoleneDc committed
381
       "      <td>1887</td>\n",
SoleneDc's avatar
SoleneDc committed
382 383 384
       "    </tr>\n",
       "    <tr>\n",
       "      <th>comedy</th>\n",
SoleneDc's avatar
SoleneDc committed
385
       "      <td>1126</td>\n",
SoleneDc's avatar
SoleneDc committed
386 387 388
       "    </tr>\n",
       "    <tr>\n",
       "      <th>drama</th>\n",
SoleneDc's avatar
SoleneDc committed
389
       "      <td>1348</td>\n",
SoleneDc's avatar
SoleneDc committed
390 391 392 393 394 395
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
396 397
       "        image\n",
       "genre        \n",
SoleneDc's avatar
SoleneDc committed
398 399 400
       "action   1887\n",
       "comedy   1126\n",
       "drama    1348"
SoleneDc's avatar
SoleneDc committed
401 402
      ]
     },
SoleneDc's avatar
SoleneDc committed
403
     "execution_count": 119,
SoleneDc's avatar
SoleneDc committed
404 405 406 407 408 409 410 411 412 413
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.groupby('genre').count()"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
414
   "execution_count": 117,
SoleneDc's avatar
SoleneDc committed
415
   "metadata": {},
SoleneDc's avatar
SoleneDc committed
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
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hasard: 43 %\n"
     ]
    }
   ],
   "source": [
    "dict_num_genres = (df2.groupby('genre').count())['image'].to_dict()\n",
    "sum_spectrums = 0\n",
    "popular_genre = 0\n",
    "for num in dict_num_genres.values():\n",
    "    sum_spectrums += num\n",
    "    if num > popular_genre:\n",
    "        popular_genre = num\n",
    "hasard = int((popular_genre / sum_spectrums)*100)\n",
    "print('Hasard:', int((popular_genre / sum_spectrums)*100), \"%\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
443 444 445 446 447 448 449
   "outputs": [],
   "source": [
    "df3 = pd.get_dummies(df2,columns=['genre'])"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
450
   "execution_count": 107,
SoleneDc's avatar
SoleneDc committed
451 452 453 454 455
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
SoleneDc's avatar
SoleneDc committed
456
       "3488"
SoleneDc's avatar
SoleneDc committed
457 458
      ]
     },
SoleneDc's avatar
SoleneDc committed
459
     "execution_count": 107,
SoleneDc's avatar
SoleneDc committed
460 461 462 463 464 465 466 467 468 469 470
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_len = int(df3.shape[0]*0.8)\n",
    "train_len"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
471 472 473 474
   "execution_count": 108,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
475 476 477 478 479 480 481 482
   "outputs": [],
   "source": [
    "train = df3.iloc[:train_len, :]\n",
    "test = df3.iloc[train_len:, :]"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
483
   "execution_count": 109,
SoleneDc's avatar
SoleneDc committed
484 485 486 487 488
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
SoleneDc's avatar
SoleneDc committed
489 490 491 492 493
       "8749     [[6, 3, 0], [22, 22, 16], [30, 30, 24], [30, 3...\n",
       "3296     [[27, 97, 0], [29, 93, 3], [26, 92, 3], [25, 9...\n",
       "10360    [[22, 84, 2], [25, 81, 6], [27, 80, 7], [27, 8...\n",
       "6024     [[7, 2, 3], [12, 12, 18], [11, 16, 25], [9, 11...\n",
       "2778     [[11, 0, 3], [7, 3, 0], [17, 14, 0], [70, 59, ...\n",
SoleneDc's avatar
SoleneDc committed
494 495 496
       "Name: image, dtype: object"
      ]
     },
SoleneDc's avatar
SoleneDc committed
497
     "execution_count": 109,
SoleneDc's avatar
SoleneDc committed
498 499 500 501 502 503 504 505 506 507
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train['image'].head()"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
508
   "execution_count": 110,
SoleneDc's avatar
SoleneDc committed
509 510 511 512 513
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
SoleneDc's avatar
SoleneDc committed
514
       "((3488, 4), (873, 4))"
SoleneDc's avatar
SoleneDc committed
515 516
      ]
     },
SoleneDc's avatar
SoleneDc committed
517
     "execution_count": 110,
SoleneDc's avatar
SoleneDc committed
518 519 520 521 522 523 524 525 526 527 528
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.shape, test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
SoleneDc's avatar
SoleneDc committed
529 530 531
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
532 533 534 535 536
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
537 538 539 540
   "execution_count": 111,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
541 542 543 544 545 546 547 548 549 550 551
   "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,
SoleneDc's avatar
SoleneDc committed
552 553 554
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
555 556 557 558 559 560
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
SoleneDc's avatar
SoleneDc committed
561 562 563
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
564 565 566 567 568 569
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
SoleneDc's avatar
SoleneDc committed
570 571 572
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
573 574 575 576 577 578
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
SoleneDc's avatar
SoleneDc committed
579 580 581
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
582 583 584 585 586 587
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
SoleneDc's avatar
SoleneDc committed
588 589 590
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
591 592 593 594 595 596 597 598 599 600 601 602 603
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Vérifications des données"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
SoleneDc's avatar
SoleneDc committed
604 605 606
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
607 608 609 610 611 612 613 614 615 616 617 618
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
619 620 621 622
   "execution_count": 112,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
623 624 625 626 627 628 629 630
   "outputs": [],
   "source": [
    "X_train = pad_sequences(X_train)\n",
    "X_test = pad_sequences(X_test)"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
631 632 633 634
   "execution_count": 113,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
635 636 637 638 639 640 641 642 643 644 645 646 647 648
   "outputs": [],
   "source": [
    "input_shapeA = (X_train.shape[1], X_train.shape[2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Modèle"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
649
   "execution_count": 128,
SoleneDc's avatar
SoleneDc committed
650 651 652 653 654 655
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
SoleneDc's avatar
SoleneDc committed
656 657 658 659 660 661 662
      "Conv1D 1 : (None, 962, 2)\n",
      "MaxP1D 1 : (None, 481, 2)\n",
      "Conv1D 2 : (None, 239, 4)\n",
      "MaxP1D 2 : (None, 119, 4)\n",
      "Conv1D 3 : (None, 58, 4)\n",
      "MaxP1D 3 : (None, 29, 4)\n",
      "Flatten : (None, 116)\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
663
      "Dense  2 : (None, 3)\n"
SoleneDc's avatar
SoleneDc committed
664 665 666 667 668 669 670 671 672 673
     ]
    }
   ],
   "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",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
674
    "num_classes=3\n",
SoleneDc's avatar
SoleneDc committed
675 676
    "\n",
    "#Hyperparameters\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
677 678
    "filtersCNN1=2\n",
    "kernelSize1=5\n",
SoleneDc's avatar
SoleneDc committed
679 680
    "\n",
    "filtersCNN2=4\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
681
    "kernelSize2=5\n",
SoleneDc's avatar
SoleneDc committed
682 683 684 685 686 687 688
    "\n",
    "unitsFC1=1000\n",
    "unitsFC2=num_classes\n",
    "\n",
    "#defining the layers architecture\n",
    "\n",
    "model = Sequential()\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
689
    "model.add(Conv1D(filtersCNN1,kernelSize1,strides=2, padding=\"valid\", activation='relu',input_shape=input_shapeA))\n",
SoleneDc's avatar
SoleneDc committed
690 691 692 693
    "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",
SoleneDc's avatar
SoleneDc committed
694
    "model.add(Dropout(0.2))\n",
SoleneDc's avatar
SoleneDc committed
695
    "\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
696
    "model.add(Conv1D(filtersCNN2,kernelSize2,strides=2, padding=\"valid\", activation='relu'))\n",
SoleneDc's avatar
SoleneDc committed
697 698 699
    "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",
SoleneDc's avatar
SoleneDc committed
700
    "model.add(Dropout(0.2))\n",
SoleneDc's avatar
SoleneDc committed
701 702
    "#BatchNormalization(axis=3)\n",
    "\n",
SoleneDc's avatar
SoleneDc committed
703 704 705 706 707
    "model.add(Conv1D(filtersCNN2,kernelSize2,strides=2, padding=\"valid\", activation='relu'))\n",
    "print(\"Conv1D 3 : {}\".format(model.output_shape))\n",
    "model.add(MaxPooling1D(pool_size=2,strides=None,padding=\"valid\"))\n",
    "print(\"MaxP1D 3 : {}\".format(model.output_shape))\n",
    "\n",
SoleneDc's avatar
SoleneDc committed
708 709 710 711 712 713 714 715 716 717
    "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",
SoleneDc's avatar
SoleneDc committed
718
   "execution_count": 130,
SoleneDc's avatar
SoleneDc committed
719 720 721 722 723 724 725 726 727
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
SoleneDc's avatar
SoleneDc committed
728 729 730 731 732
      "conv1d_26 (Conv1D)           (None, 962, 2)            32        \n",
      "_________________________________________________________________\n",
      "max_pooling1d_26 (MaxPooling (None, 481, 2)            0         \n",
      "_________________________________________________________________\n",
      "dropout_23 (Dropout)         (None, 481, 2)            0         \n",
SoleneDc's avatar
SoleneDc committed
733
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
734
      "conv1d_27 (Conv1D)           (None, 239, 4)            44        \n",
SoleneDc's avatar
SoleneDc committed
735
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
736
      "max_pooling1d_27 (MaxPooling (None, 119, 4)            0         \n",
SoleneDc's avatar
SoleneDc committed
737
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
738
      "dropout_24 (Dropout)         (None, 119, 4)            0         \n",
SoleneDc's avatar
SoleneDc committed
739
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
740
      "conv1d_28 (Conv1D)           (None, 58, 4)             84        \n",
SoleneDc's avatar
SoleneDc committed
741
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
742
      "max_pooling1d_28 (MaxPooling (None, 29, 4)             0         \n",
SoleneDc's avatar
SoleneDc committed
743
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
744 745 746
      "flatten_13 (Flatten)         (None, 116)               0         \n",
      "_________________________________________________________________\n",
      "dense_14 (Dense)             (None, 3)                 351       \n",
SoleneDc's avatar
SoleneDc committed
747
      "=================================================================\n",
SoleneDc's avatar
SoleneDc committed
748 749
      "Total params: 511\n",
      "Trainable params: 511\n",
SoleneDc's avatar
SoleneDc committed
750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Entrainement du modèle"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
768
   "execution_count": 131,
SoleneDc's avatar
SoleneDc committed
769 770 771 772 773 774
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
SoleneDc's avatar
SoleneDc committed
775
      "Train on 2441 samples, validate on 1047 samples\n",
SoleneDc's avatar
SoleneDc committed
776
      "Epoch 1/100\n",
SoleneDc's avatar
SoleneDc committed
777
      "2441/2441 [==============================] - 1s 609us/step - loss: 2.7173 - acc: 0.3281 - val_loss: 1.5695 - val_acc: 0.3448\n",
SoleneDc's avatar
SoleneDc committed
778
      "Epoch 2/100\n",
SoleneDc's avatar
SoleneDc committed
779
      "2441/2441 [==============================] - 1s 307us/step - loss: 2.1491 - acc: 0.3507 - val_loss: 1.4171 - val_acc: 0.3467\n",
SoleneDc's avatar
SoleneDc committed
780
      "Epoch 3/100\n",
SoleneDc's avatar
SoleneDc committed
781
      "2441/2441 [==============================] - 1s 264us/step - loss: 1.7824 - acc: 0.3695 - val_loss: 1.3260 - val_acc: 0.3400\n",
SoleneDc's avatar
SoleneDc committed
782
      "Epoch 4/100\n",
SoleneDc's avatar
SoleneDc committed
783
      "2441/2441 [==============================] - 1s 258us/step - loss: 1.5736 - acc: 0.3466 - val_loss: 1.2627 - val_acc: 0.3715\n",
SoleneDc's avatar
SoleneDc committed
784
      "Epoch 5/100\n",
SoleneDc's avatar
SoleneDc committed
785
      "2441/2441 [==============================] - 1s 260us/step - loss: 1.4657 - acc: 0.3535 - val_loss: 1.2175 - val_acc: 0.3734\n",
SoleneDc's avatar
SoleneDc committed
786
      "Epoch 6/100\n",
SoleneDc's avatar
SoleneDc committed
787
      "2441/2441 [==============================] - 1s 255us/step - loss: 1.3864 - acc: 0.3490 - val_loss: 1.1884 - val_acc: 0.3773\n",
SoleneDc's avatar
SoleneDc committed
788
      "Epoch 7/100\n",
SoleneDc's avatar
SoleneDc committed
789
      "2441/2441 [==============================] - 1s 253us/step - loss: 1.2829 - acc: 0.3617 - val_loss: 1.1671 - val_acc: 0.3715\n",
SoleneDc's avatar
SoleneDc committed
790
      "Epoch 8/100\n",
SoleneDc's avatar
SoleneDc committed
791
      "2441/2441 [==============================] - 1s 251us/step - loss: 1.2460 - acc: 0.3548 - val_loss: 1.1505 - val_acc: 0.3773\n",
SoleneDc's avatar
SoleneDc committed
792
      "Epoch 9/100\n",
SoleneDc's avatar
SoleneDc committed
793
      "2441/2441 [==============================] - 1s 329us/step - loss: 1.1923 - acc: 0.3564 - val_loss: 1.1382 - val_acc: 0.3763\n",
SoleneDc's avatar
SoleneDc committed
794
      "Epoch 10/100\n",
SoleneDc's avatar
SoleneDc committed
795
      "2441/2441 [==============================] - 1s 313us/step - loss: 1.1591 - acc: 0.3884 - val_loss: 1.1287 - val_acc: 0.3706\n",
SoleneDc's avatar
SoleneDc committed
796
      "Epoch 11/100\n",
SoleneDc's avatar
SoleneDc committed
797
      "2441/2441 [==============================] - 1s 261us/step - loss: 1.1662 - acc: 0.3589 - val_loss: 1.1211 - val_acc: 0.3744\n",
SoleneDc's avatar
SoleneDc committed
798
      "Epoch 12/100\n",
SoleneDc's avatar
SoleneDc committed
799
      "2441/2441 [==============================] - 1s 270us/step - loss: 1.1550 - acc: 0.3593 - val_loss: 1.1152 - val_acc: 0.3801\n",
SoleneDc's avatar
SoleneDc committed
800
      "Epoch 13/100\n",
SoleneDc's avatar
SoleneDc committed
801
      "2441/2441 [==============================] - 1s 254us/step - loss: 1.1357 - acc: 0.3773 - val_loss: 1.1107 - val_acc: 0.3878\n",
SoleneDc's avatar
SoleneDc committed
802
      "Epoch 14/100\n",
SoleneDc's avatar
SoleneDc committed
803
      "2441/2441 [==============================] - 1s 252us/step - loss: 1.1262 - acc: 0.3802 - val_loss: 1.1071 - val_acc: 0.3887\n",
SoleneDc's avatar
SoleneDc committed
804
      "Epoch 15/100\n",
SoleneDc's avatar
SoleneDc committed
805
      "2441/2441 [==============================] - 1s 261us/step - loss: 1.1235 - acc: 0.3843 - val_loss: 1.1037 - val_acc: 0.3964\n",
SoleneDc's avatar
SoleneDc committed
806
      "Epoch 16/100\n",
SoleneDc's avatar
SoleneDc committed
807
      "2441/2441 [==============================] - 1s 255us/step - loss: 1.1045 - acc: 0.3990 - val_loss: 1.0995 - val_acc: 0.4031\n",
SoleneDc's avatar
SoleneDc committed
808
      "Epoch 17/100\n",
SoleneDc's avatar
SoleneDc committed
809
      "2441/2441 [==============================] - 1s 311us/step - loss: 1.0938 - acc: 0.4064 - val_loss: 1.0956 - val_acc: 0.4031\n",
SoleneDc's avatar
SoleneDc committed
810
      "Epoch 18/100\n",
SoleneDc's avatar
SoleneDc committed
811
      "2441/2441 [==============================] - 1s 320us/step - loss: 1.1015 - acc: 0.4097 - val_loss: 1.0924 - val_acc: 0.4097\n",
SoleneDc's avatar
SoleneDc committed
812
      "Epoch 19/100\n",
SoleneDc's avatar
SoleneDc committed
813
      "2441/2441 [==============================] - 1s 310us/step - loss: 1.0967 - acc: 0.4154 - val_loss: 1.0897 - val_acc: 0.4212\n",
SoleneDc's avatar
SoleneDc committed
814
      "Epoch 20/100\n",
SoleneDc's avatar
SoleneDc committed
815
      "2441/2441 [==============================] - 1s 343us/step - loss: 1.0907 - acc: 0.4195 - val_loss: 1.0881 - val_acc: 0.4212\n",
SoleneDc's avatar
SoleneDc committed
816
      "Epoch 21/100\n",
SoleneDc's avatar
SoleneDc committed
817
      "2441/2441 [==============================] - 1s 290us/step - loss: 1.0906 - acc: 0.4228 - val_loss: 1.0870 - val_acc: 0.4202\n",
SoleneDc's avatar
SoleneDc committed
818
      "Epoch 22/100\n",
SoleneDc's avatar
SoleneDc committed
819
      "2441/2441 [==============================] - 1s 279us/step - loss: 1.0923 - acc: 0.4191 - val_loss: 1.0863 - val_acc: 0.4212\n",
SoleneDc's avatar
SoleneDc committed
820
      "Epoch 23/100\n",
SoleneDc's avatar
SoleneDc committed
821
      "2441/2441 [==============================] - 1s 294us/step - loss: 1.0892 - acc: 0.4195 - val_loss: 1.0857 - val_acc: 0.4202\n",
SoleneDc's avatar
SoleneDc committed
822
      "Epoch 24/100\n",
SoleneDc's avatar
SoleneDc committed
823
      "2441/2441 [==============================] - 1s 306us/step - loss: 1.0858 - acc: 0.4191 - val_loss: 1.0849 - val_acc: 0.4183\n",
SoleneDc's avatar
SoleneDc committed
824
      "Epoch 25/100\n",
SoleneDc's avatar
SoleneDc committed
825
      "2441/2441 [==============================] - 1s 344us/step - loss: 1.0848 - acc: 0.4138 - val_loss: 1.0839 - val_acc: 0.4231\n",
SoleneDc's avatar
SoleneDc committed
826
      "Epoch 26/100\n",
SoleneDc's avatar
SoleneDc committed
827
      "2441/2441 [==============================] - 1s 287us/step - loss: 1.0866 - acc: 0.4207 - val_loss: 1.0830 - val_acc: 0.4250\n",
SoleneDc's avatar
SoleneDc committed
828
      "Epoch 27/100\n",
SoleneDc's avatar
SoleneDc committed
829
      "2441/2441 [==============================] - 1s 282us/step - loss: 1.0837 - acc: 0.4203 - val_loss: 1.0817 - val_acc: 0.4222\n",
SoleneDc's avatar
SoleneDc committed
830
      "Epoch 28/100\n",
SoleneDc's avatar
SoleneDc committed
831
      "2441/2441 [==============================] - 1s 268us/step - loss: 1.0814 - acc: 0.4310 - val_loss: 1.0803 - val_acc: 0.4212\n",
SoleneDc's avatar
SoleneDc committed
832
      "Epoch 29/100\n",
SoleneDc's avatar
SoleneDc committed
833
      "2441/2441 [==============================] - 1s 263us/step - loss: 1.0823 - acc: 0.4236 - val_loss: 1.0797 - val_acc: 0.4202\n",
SoleneDc's avatar
SoleneDc committed
834
      "Epoch 30/100\n",
SoleneDc's avatar
SoleneDc committed
835
      "2441/2441 [==============================] - 1s 257us/step - loss: 1.0754 - acc: 0.4314 - val_loss: 1.0785 - val_acc: 0.4174\n",
SoleneDc's avatar
SoleneDc committed
836
      "Epoch 31/100\n",
SoleneDc's avatar
SoleneDc committed
837
      "2441/2441 [==============================] - 1s 261us/step - loss: 1.0786 - acc: 0.4285 - val_loss: 1.0769 - val_acc: 0.4126\n",
SoleneDc's avatar
SoleneDc committed
838
      "Epoch 32/100\n",
SoleneDc's avatar
SoleneDc committed
839
      "2441/2441 [==============================] - 1s 261us/step - loss: 1.0702 - acc: 0.4261 - val_loss: 1.0749 - val_acc: 0.4117\n",
SoleneDc's avatar
SoleneDc committed
840
      "Epoch 33/100\n",
SoleneDc's avatar
SoleneDc committed
841
      "2441/2441 [==============================] - 1s 261us/step - loss: 1.0720 - acc: 0.4256 - val_loss: 1.0730 - val_acc: 0.4069\n",
SoleneDc's avatar
SoleneDc committed
842
      "Epoch 34/100\n",
SoleneDc's avatar
SoleneDc committed
843
      "2441/2441 [==============================] - 1s 283us/step - loss: 1.0739 - acc: 0.4166 - val_loss: 1.0725 - val_acc: 0.4136\n",
SoleneDc's avatar
SoleneDc committed
844
      "Epoch 35/100\n",
SoleneDc's avatar
SoleneDc committed
845
      "2441/2441 [==============================] - 1s 326us/step - loss: 1.0730 - acc: 0.4293 - val_loss: 1.0717 - val_acc: 0.4155\n",
SoleneDc's avatar
SoleneDc committed
846
      "Epoch 36/100\n",
SoleneDc's avatar
SoleneDc committed
847
      "2441/2441 [==============================] - 1s 337us/step - loss: 1.0694 - acc: 0.4306 - val_loss: 1.0702 - val_acc: 0.4164\n",
SoleneDc's avatar
SoleneDc committed
848
      "Epoch 37/100\n",
SoleneDc's avatar
SoleneDc committed
849
      "2441/2441 [==============================] - 1s 297us/step - loss: 1.0641 - acc: 0.4281 - val_loss: 1.0695 - val_acc: 0.4136\n",
SoleneDc's avatar
SoleneDc committed
850
      "Epoch 38/100\n",
SoleneDc's avatar
SoleneDc committed
851
      "2441/2441 [==============================] - 1s 304us/step - loss: 1.0666 - acc: 0.4252 - val_loss: 1.0688 - val_acc: 0.4107\n",
SoleneDc's avatar
SoleneDc committed
852
      "Epoch 39/100\n",
SoleneDc's avatar
SoleneDc committed
853
      "2441/2441 [==============================] - 1s 291us/step - loss: 1.0693 - acc: 0.4256 - val_loss: 1.0679 - val_acc: 0.4126\n",
SoleneDc's avatar
SoleneDc committed
854
      "Epoch 40/100\n",
SoleneDc's avatar
SoleneDc committed
855
      "2441/2441 [==============================] - 1s 324us/step - loss: 1.0692 - acc: 0.4261 - val_loss: 1.0671 - val_acc: 0.4126\n",
SoleneDc's avatar
SoleneDc committed
856
      "Epoch 41/100\n",
SoleneDc's avatar
SoleneDc committed
857
      "2441/2441 [==============================] - 1s 301us/step - loss: 1.0645 - acc: 0.4240 - val_loss: 1.0664 - val_acc: 0.4136\n",
SoleneDc's avatar
SoleneDc committed
858
      "Epoch 42/100\n",
SoleneDc's avatar
SoleneDc committed
859
      "2441/2441 [==============================] - 1s 273us/step - loss: 1.0624 - acc: 0.4236 - val_loss: 1.0655 - val_acc: 0.4183\n",
SoleneDc's avatar
SoleneDc committed
860
      "Epoch 43/100\n",
SoleneDc's avatar
SoleneDc committed
861
      "2441/2441 [==============================] - 1s 280us/step - loss: 1.0644 - acc: 0.4289 - val_loss: 1.0647 - val_acc: 0.4174\n",
SoleneDc's avatar
SoleneDc committed
862
      "Epoch 44/100\n",
SoleneDc's avatar
SoleneDc committed
863
      "2441/2441 [==============================] - 1s 321us/step - loss: 1.0592 - acc: 0.4318 - val_loss: 1.0640 - val_acc: 0.4174\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
864
      "Epoch 45/100\n",
SoleneDc's avatar
SoleneDc committed
865
      "2441/2441 [==============================] - 1s 277us/step - loss: 1.0580 - acc: 0.4269 - val_loss: 1.0628 - val_acc: 0.4117\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
866
      "Epoch 46/100\n",
SoleneDc's avatar
SoleneDc committed
867
      "2441/2441 [==============================] - 1s 290us/step - loss: 1.0594 - acc: 0.4330 - val_loss: 1.0614 - val_acc: 0.4117\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
868
      "Epoch 47/100\n",
SoleneDc's avatar
SoleneDc committed
869
      "2441/2441 [==============================] - 1s 269us/step - loss: 1.0601 - acc: 0.4273 - val_loss: 1.0622 - val_acc: 0.4145\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
870
      "Epoch 48/100\n",
SoleneDc's avatar
SoleneDc committed
871
      "2441/2441 [==============================] - 1s 325us/step - loss: 1.0529 - acc: 0.4318 - val_loss: 1.0611 - val_acc: 0.4126\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
872
      "Epoch 49/100\n",
SoleneDc's avatar
SoleneDc committed
873
      "2441/2441 [==============================] - 1s 316us/step - loss: 1.0529 - acc: 0.4277 - val_loss: 1.0596 - val_acc: 0.4088\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
874
      "Epoch 50/100\n",
SoleneDc's avatar
SoleneDc committed
875
      "2441/2441 [==============================] - 1s 272us/step - loss: 1.0533 - acc: 0.4338 - val_loss: 1.0581 - val_acc: 0.4078\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
876
      "Epoch 51/100\n",
SoleneDc's avatar
SoleneDc committed
877
      "2441/2441 [==============================] - 1s 274us/step - loss: 1.0527 - acc: 0.4334 - val_loss: 1.0580 - val_acc: 0.4117\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
878
      "Epoch 52/100\n",
SoleneDc's avatar
SoleneDc committed
879
      "2441/2441 [==============================] - 1s 305us/step - loss: 1.0540 - acc: 0.4302 - val_loss: 1.0582 - val_acc: 0.4145\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
880
      "Epoch 53/100\n",
SoleneDc's avatar
SoleneDc committed
881
      "2441/2441 [==============================] - 1s 301us/step - loss: 1.0494 - acc: 0.4383 - val_loss: 1.0555 - val_acc: 0.4136\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
882
      "Epoch 54/100\n",
SoleneDc's avatar
SoleneDc committed
883
      "2441/2441 [==============================] - 1s 264us/step - loss: 1.0495 - acc: 0.4379 - val_loss: 1.0547 - val_acc: 0.4145\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
884
      "Epoch 55/100\n",
SoleneDc's avatar
SoleneDc committed
885
      "2441/2441 [==============================] - 1s 319us/step - loss: 1.0475 - acc: 0.4347 - val_loss: 1.0532 - val_acc: 0.4136\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
886
      "Epoch 56/100\n",
SoleneDc's avatar
SoleneDc committed
887
      "2441/2441 [==============================] - 1s 325us/step - loss: 1.0469 - acc: 0.4330 - val_loss: 1.0532 - val_acc: 0.4145\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
888
      "Epoch 57/100\n",
SoleneDc's avatar
SoleneDc committed
889
      "2441/2441 [==============================] - 1s 325us/step - loss: 1.0464 - acc: 0.4416 - val_loss: 1.0527 - val_acc: 0.4164\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
890
      "Epoch 58/100\n",
SoleneDc's avatar
SoleneDc committed
891
      "2441/2441 [==============================] - 1s 329us/step - loss: 1.0450 - acc: 0.4342 - val_loss: 1.0529 - val_acc: 0.4164\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
892
      "Epoch 59/100\n",
SoleneDc's avatar
SoleneDc committed
893
      "2441/2441 [==============================] - 1s 321us/step - loss: 1.0453 - acc: 0.4355 - val_loss: 1.0534 - val_acc: 0.4202\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
894
      "Epoch 60/100\n"
SoleneDc's avatar
SoleneDc committed
895 896 897
     ]
    },
    {
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
898 899 900
     "name": "stdout",
     "output_type": "stream",
     "text": [
SoleneDc's avatar
SoleneDc committed
901
      "2441/2441 [==============================] - 1s 322us/step - loss: 1.0488 - acc: 0.4351 - val_loss: 1.0533 - val_acc: 0.4202\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
902
      "Epoch 61/100\n",
SoleneDc's avatar
SoleneDc committed
903
      "2441/2441 [==============================] - 1s 319us/step - loss: 1.0492 - acc: 0.4375 - val_loss: 1.0522 - val_acc: 0.4183\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
904
      "Epoch 62/100\n",
SoleneDc's avatar
SoleneDc committed
905
      "2441/2441 [==============================] - 1s 343us/step - loss: 1.0468 - acc: 0.4424 - val_loss: 1.0513 - val_acc: 0.4202\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
906
      "Epoch 63/100\n",
SoleneDc's avatar
SoleneDc committed
907
      "2441/2441 [==============================] - 1s 369us/step - loss: 1.0493 - acc: 0.4347 - val_loss: 1.0507 - val_acc: 0.4193\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
908
      "Epoch 64/100\n",
SoleneDc's avatar
SoleneDc committed
909
      "2441/2441 [==============================] - 1s 339us/step - loss: 1.0525 - acc: 0.4322 - val_loss: 1.0517 - val_acc: 0.4193\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
910
      "Epoch 65/100\n",
SoleneDc's avatar
SoleneDc committed
911
      "2441/2441 [==============================] - 1s 399us/step - loss: 1.0455 - acc: 0.4392 - val_loss: 1.0524 - val_acc: 0.4183\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
912
      "Epoch 66/100\n",
SoleneDc's avatar
SoleneDc committed
913
      "2441/2441 [==============================] - ETA: 0s - loss: 1.0446 - acc: 0.438 - 1s 410us/step - loss: 1.0462 - acc: 0.4371 - val_loss: 1.0542 - val_acc: 0.4193\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
914
      "Epoch 67/100\n",
SoleneDc's avatar
SoleneDc committed
915
      "2441/2441 [==============================] - 1s 370us/step - loss: 1.0478 - acc: 0.4322 - val_loss: 1.0535 - val_acc: 0.4193\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
916
      "Epoch 68/100\n",
SoleneDc's avatar
SoleneDc committed
917
      "2441/2441 [==============================] - 1s 373us/step - loss: 1.0472 - acc: 0.4383 - val_loss: 1.0508 - val_acc: 0.4174\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
918
      "Epoch 69/100\n",
SoleneDc's avatar
SoleneDc committed
919
      "2441/2441 [==============================] - 1s 363us/step - loss: 1.0426 - acc: 0.4371 - val_loss: 1.0489 - val_acc: 0.4212\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
920
      "Epoch 70/100\n",
SoleneDc's avatar
SoleneDc committed
921
      "2441/2441 [==============================] - ETA: 0s - loss: 1.0464 - acc: 0.438 - 1s 415us/step - loss: 1.0468 - acc: 0.4375 - val_loss: 1.0486 - val_acc: 0.4222\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
922
      "Epoch 71/100\n",
SoleneDc's avatar
SoleneDc committed
923
      "2441/2441 [==============================] - 1s 429us/step - loss: 1.0466 - acc: 0.4383 - val_loss: 1.0489 - val_acc: 0.4212\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
924
      "Epoch 72/100\n",
SoleneDc's avatar
SoleneDc committed
925
      "2441/2441 [==============================] - 1s 331us/step - loss: 1.0439 - acc: 0.4400 - val_loss: 1.0500 - val_acc: 0.4183\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
926
      "Epoch 73/100\n",
SoleneDc's avatar
SoleneDc committed
927
      "2441/2441 [==============================] - 1s 332us/step - loss: 1.0383 - acc: 0.4404 - val_loss: 1.0486 - val_acc: 0.4202\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
928
      "Epoch 74/100\n",
SoleneDc's avatar
SoleneDc committed
929
      "2441/2441 [==============================] - 1s 365us/step - loss: 1.0437 - acc: 0.4412 - val_loss: 1.0475 - val_acc: 0.4193\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
930
      "Epoch 75/100\n",
SoleneDc's avatar
SoleneDc committed
931
      "2441/2441 [==============================] - 1s 383us/step - loss: 1.0431 - acc: 0.4392 - val_loss: 1.0481 - val_acc: 0.4212\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
932
      "Epoch 76/100\n",
SoleneDc's avatar
SoleneDc committed
933
      "2441/2441 [==============================] - 1s 452us/step - loss: 1.0436 - acc: 0.4400 - val_loss: 1.0483 - val_acc: 0.4222\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
934
      "Epoch 77/100\n",
SoleneDc's avatar
SoleneDc committed
935
      "2441/2441 [==============================] - 1s 435us/step - loss: 1.0402 - acc: 0.4375 - val_loss: 1.0492 - val_acc: 0.4222\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
936
      "Epoch 78/100\n",
SoleneDc's avatar
SoleneDc committed
937
      "2441/2441 [==============================] - 1s 397us/step - loss: 1.0420 - acc: 0.4437 - val_loss: 1.0488 - val_acc: 0.4212\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
938
      "Epoch 79/100\n",
SoleneDc's avatar
SoleneDc committed
939
      "2441/2441 [==============================] - 1s 354us/step - loss: 1.0446 - acc: 0.4367 - val_loss: 1.0480 - val_acc: 0.4222\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
940
      "Epoch 80/100\n",
SoleneDc's avatar
SoleneDc committed
941
      "2441/2441 [==============================] - 1s 416us/step - loss: 1.0408 - acc: 0.4392 - val_loss: 1.0482 - val_acc: 0.4222\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
942
      "Epoch 81/100\n",
SoleneDc's avatar
SoleneDc committed
943
      "2441/2441 [==============================] - 1s 396us/step - loss: 1.0409 - acc: 0.4383 - val_loss: 1.0484 - val_acc: 0.4212\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
944
      "Epoch 82/100\n",
SoleneDc's avatar
SoleneDc committed
945
      "2441/2441 [==============================] - 1s 362us/step - loss: 1.0467 - acc: 0.4424 - val_loss: 1.0476 - val_acc: 0.4212\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
946
      "Epoch 83/100\n",
SoleneDc's avatar
SoleneDc committed
947
      "2441/2441 [==============================] - 1s 369us/step - loss: 1.0432 - acc: 0.4400 - val_loss: 1.0470 - val_acc: 0.4222\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
948
      "Epoch 84/100\n",
SoleneDc's avatar
SoleneDc committed
949
      "2441/2441 [==============================] - 1s 420us/step - loss: 1.0419 - acc: 0.4404 - val_loss: 1.0467 - val_acc: 0.4222\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
950
      "Epoch 85/100\n",
SoleneDc's avatar
SoleneDc committed
951
      "2441/2441 [==============================] - 1s 338us/step - loss: 1.0478 - acc: 0.4379 - val_loss: 1.0462 - val_acc: 0.4193\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
952
      "Epoch 86/100\n",
SoleneDc's avatar
SoleneDc committed
953
      "2441/2441 [==============================] - 1s 317us/step - loss: 1.0410 - acc: 0.4416 - val_loss: 1.0461 - val_acc: 0.4202\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
954
      "Epoch 87/100\n",
SoleneDc's avatar
SoleneDc committed
955
      "2441/2441 [==============================] - 1s 325us/step - loss: 1.0413 - acc: 0.4396 - val_loss: 1.0459 - val_acc: 0.4202\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
956
      "Epoch 88/100\n",
SoleneDc's avatar
SoleneDc committed
957
      "2441/2441 [==============================] - 1s 326us/step - loss: 1.0422 - acc: 0.4424 - val_loss: 1.0462 - val_acc: 0.4222\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
958
      "Epoch 89/100\n",
SoleneDc's avatar
SoleneDc committed
959
      "2441/2441 [==============================] - 1s 326us/step - loss: 1.0353 - acc: 0.4400 - val_loss: 1.0476 - val_acc: 0.4212\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
960
      "Epoch 90/100\n",
SoleneDc's avatar
SoleneDc committed
961
      "2441/2441 [==============================] - 1s 338us/step - loss: 1.0434 - acc: 0.4416 - val_loss: 1.0473 - val_acc: 0.4212\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
962
      "Epoch 91/100\n",
SoleneDc's avatar
SoleneDc committed
963
      "2441/2441 [==============================] - 1s 337us/step - loss: 1.0433 - acc: 0.4408 - val_loss: 1.0461 - val_acc: 0.4202\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
964
      "Epoch 92/100\n",
SoleneDc's avatar
SoleneDc committed
965
      "2441/2441 [==============================] - 1s 324us/step - loss: 1.0385 - acc: 0.4449 - val_loss: 1.0456 - val_acc: 0.4222\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
966
      "Epoch 93/100\n",
SoleneDc's avatar
SoleneDc committed
967
      "2441/2441 [==============================] - 1s 321us/step - loss: 1.0456 - acc: 0.4375 - val_loss: 1.0470 - val_acc: 0.4241\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
968
      "Epoch 94/100\n",
SoleneDc's avatar
SoleneDc committed
969
      "2441/2441 [==============================] - 1s 329us/step - loss: 1.0376 - acc: 0.4392 - val_loss: 1.0468 - val_acc: 0.4231\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
970
      "Epoch 95/100\n",
SoleneDc's avatar
SoleneDc committed
971
      "2441/2441 [==============================] - 1s 325us/step - loss: 1.0356 - acc: 0.4424 - val_loss: 1.0460 - val_acc: 0.4241\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
972
      "Epoch 96/100\n",
SoleneDc's avatar
SoleneDc committed
973
      "2441/2441 [==============================] - 1s 316us/step - loss: 1.0421 - acc: 0.4392 - val_loss: 1.0451 - val_acc: 0.4250\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
974
      "Epoch 97/100\n",
SoleneDc's avatar
SoleneDc committed
975
      "2441/2441 [==============================] - 1s 320us/step - loss: 1.0405 - acc: 0.4420 - val_loss: 1.0450 - val_acc: 0.4260\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
976
      "Epoch 98/100\n",
SoleneDc's avatar
SoleneDc committed
977
      "2441/2441 [==============================] - 1s 331us/step - loss: 1.0392 - acc: 0.4453 - val_loss: 1.0453 - val_acc: 0.4250\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
978
      "Epoch 99/100\n",
SoleneDc's avatar
SoleneDc committed
979
      "2441/2441 [==============================] - 1s 358us/step - loss: 1.0384 - acc: 0.4412 - val_loss: 1.0452 - val_acc: 0.4260\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
980
      "Epoch 100/100\n",
SoleneDc's avatar
SoleneDc committed
981
      "2441/2441 [==============================] - 1s 329us/step - loss: 1.0334 - acc: 0.4465 - val_loss: 1.0446 - val_acc: 0.4260\n"
SoleneDc's avatar
SoleneDc committed
982 983 984 985 986 987 988 989
     ]
    }
   ],
   "source": [
    "model.compile(loss='categorical_crossentropy',\n",
    "              optimizer='adam',\n",
    "              metrics=['accuracy'])\n",
    "\n",
SoleneDc's avatar
SoleneDc committed
990
    "history = model.fit(X_train, Y_train, epochs=100, validation_split=0.3, batch_size=400 , verbose=1)"
SoleneDc's avatar
SoleneDc committed
991 992 993 994
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
995 996 997 998
   "execution_count": 132,
   "metadata": {
    "scrolled": true
   },
SoleneDc's avatar
SoleneDc committed
999 1000 1001 1002 1003 1004
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
SoleneDc's avatar
SoleneDc committed
1005 1006
      "  Année: [2004, 2005, 2006, 2007, 2008, 2015]   //  Genre: action, comedy, drama  //  Données X_train: (3488, 1927, 3)\n",
      "Hasard : 43\n",
SoleneDc's avatar
SoleneDc committed
1007 1008 1009 1010 1011
      "\n"
     ]
    },
    {
     "data": {
SoleneDc's avatar
SoleneDc committed
1012
      "image/png": "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\nu/4fObbiaVFyMU0AAAAASUVORK5CYII=\n",
SoleneDc's avatar
SoleneDc committed
1013
      "text/plain": [
SoleneDc's avatar
SoleneDc committed
1014
       "<matplotlib.figure.Figure at 0x18613ec9e8>"
SoleneDc's avatar
SoleneDc committed
1015 1016 1017 1018 1019 1020 1021
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
SoleneDc's avatar
SoleneDc committed
1022
      "image/png": "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\nbwbgqquuYvr06UyfPp2rr7569/tNmTKFL3/5y0ybNo158+bt8T6dfvvb3zJ9+nRmzJjBcccdB0Aq\nleKyyy7jqKOOora2lp/97GdAMIX6008/zcyZM/mP//iP/fJ77aSpQXgvYbRo0Ftk/3nwctjw8v49\n5pgj4NSep9Oorq5m9uzZPPTQQ5x55pnccccdnHvuuZgZhYWF3HXXXZSXl7N582aOPvpozjjjjB7X\nur7uuusoLi5m6dKlLF26lLq6ut3bfvjDHzJixAhSqRQnnXQSS5cu5ZJLLuGqq67i8ccfp6amZo9j\nLV68mJtvvnn3dOdz5szh+OOPp6qqiuXLl3P77bfz85//nM985jP8/ve/5/Of//we+19xxRU8/PDD\njBs3bncX14033khFRQUvvPACbW1tzJ07l3nz5rFgwQKuvPJK7rvvvv7+lnukFgbBjXugMQyRoSCz\nWyqzO8rd+fa3v01tbS0f/ehHWbt2LRs3buzxOE899dTuL+7a2lpqa2t3b/vNb35DXV0ds2bN4tVX\nX+12avRMzzzzDJ/85CcpKSmhtLSUs88+m6effhqAyZMnM3PmTKD3KdQvuOACfv7zn5NKBX/YPvLI\nI/zqV79i5syZzJkzhy1btrB8+fIsf0v9oxYGwdQgoMtqRfarXloCuXTWWWfxjW98gxdffJGWlpbd\nLYNbb72VhoYGFi9eTDweZ9KkSd1OaZ6pu9bH22+/zZVXXskLL7xAVVUVF1xwQZ/H6W3OvoKCgt3P\no9Fot11S119/PQsXLuT+++9n5syZLFmyBHfn2muv5eSTT96j7hNPPNFrLPtCLQwgEY0QixhNmuJc\n5IBXWlrKCSecwF/91V/tMdi9Y8cORo0aRTwe5/HHH+edd97p9TjHHXcct956KwCvvPIKS5cuBYKp\n0UtKSqioqGDjxo08+OCDu/fpafry4447jrvvvpvm5maampq46667+Iu/+Iusz+mtt95izpw5XHHF\nFdTU1LB69WpOPvlkrrvuOjo6grV83nzzTZqamnI6hbpaGAR/RWiKc5Gh4/zzz+fss8/e44qpz33u\nc5x++unU19czc+ZMPvShD/V6jK985StceOGF1NbWMnPmTGbPng3AjBkzmDVrFtOmTdtravT58+dz\n6qmnMnbsWB5//PHd5XV1dVxwwQW7j/GlL32JWbNmddv91J3LLruM5cuX4+6cdNJJzJgxg9raWlat\n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\ngg==\n",
SoleneDc's avatar
SoleneDc committed
1023
      "text/plain": [
SoleneDc's avatar
SoleneDc committed
1024
       "<matplotlib.figure.Figure at 0x185ad1df60>"
SoleneDc's avatar
SoleneDc committed
1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
      ]
     },
     "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",
SoleneDc's avatar
SoleneDc committed
1036 1037
    "print(f\"  Année: {years}   //  Genre: action, comedy, drama  //  Données X_train: {X_train.shape}\")\n",
    "print('Hasard :', hasard)\n",
SoleneDc's avatar
SoleneDc committed
1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055
    "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,
SoleneDc's avatar
SoleneDc committed
1056 1057 1058
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
   "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",
SoleneDc's avatar
SoleneDc committed
1079
   "version": "3.6.3"
SoleneDc's avatar
SoleneDc committed
1080 1081 1082 1083 1084
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}