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-CNN.ipynb 86.7 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
   "outputs": [],
   "source": [
    "#for element in labels:\n",
    "#   for genre in element:\n",
    "#       if genre not in genres:\n",
SoleneDc's avatar
SoleneDc committed
191
    "#           genres += [genre]"
SoleneDc's avatar
SoleneDc committed
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
   ]
  },
  {
   "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
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.shape, test.shape"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
528 529 530 531
   "execution_count": 111,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
   "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": "markdown",
   "metadata": {},
   "source": [
    "## Vérifications des données"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
556 557 558 559
   "execution_count": 112,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
560 561 562 563 564 565 566 567
   "outputs": [],
   "source": [
    "X_train = pad_sequences(X_train)\n",
    "X_test = pad_sequences(X_test)"
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
568 569 570 571
   "execution_count": 113,
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
572 573 574 575 576 577 578 579 580 581 582 583 584 585
   "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
586
   "execution_count": 128,
SoleneDc's avatar
SoleneDc committed
587 588 589 590 591 592
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
SoleneDc's avatar
SoleneDc committed
593 594 595 596 597 598 599
      "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
600
      "Dense  2 : (None, 3)\n"
SoleneDc's avatar
SoleneDc committed
601 602 603 604 605 606 607 608 609 610
     ]
    }
   ],
   "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
611
    "num_classes=3\n",
SoleneDc's avatar
SoleneDc committed
612 613
    "\n",
    "#Hyperparameters\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
614 615
    "filtersCNN1=2\n",
    "kernelSize1=5\n",
SoleneDc's avatar
SoleneDc committed
616 617
    "\n",
    "filtersCNN2=4\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
618
    "kernelSize2=5\n",
SoleneDc's avatar
SoleneDc committed
619 620 621 622 623 624 625
    "\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
626
    "model.add(Conv1D(filtersCNN1,kernelSize1,strides=2, padding=\"valid\", activation='relu',input_shape=input_shapeA))\n",
SoleneDc's avatar
SoleneDc committed
627 628 629 630
    "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
631
    "model.add(Dropout(0.2))\n",
SoleneDc's avatar
SoleneDc committed
632
    "\n",
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
633
    "model.add(Conv1D(filtersCNN2,kernelSize2,strides=2, padding=\"valid\", activation='relu'))\n",
SoleneDc's avatar
SoleneDc committed
634 635 636
    "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
637
    "model.add(Dropout(0.2))\n",
SoleneDc's avatar
SoleneDc committed
638 639
    "#BatchNormalization(axis=3)\n",
    "\n",
SoleneDc's avatar
SoleneDc committed
640 641 642 643 644
    "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
645 646 647 648 649 650 651 652 653 654
    "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
655
   "execution_count": 130,
SoleneDc's avatar
SoleneDc committed
656 657 658 659 660 661 662 663 664
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
SoleneDc's avatar
SoleneDc committed
665 666 667 668 669
      "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
670
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
671
      "conv1d_27 (Conv1D)           (None, 239, 4)            44        \n",
SoleneDc's avatar
SoleneDc committed
672
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
673
      "max_pooling1d_27 (MaxPooling (None, 119, 4)            0         \n",
SoleneDc's avatar
SoleneDc committed
674
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
675
      "dropout_24 (Dropout)         (None, 119, 4)            0         \n",
SoleneDc's avatar
SoleneDc committed
676
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
677
      "conv1d_28 (Conv1D)           (None, 58, 4)             84        \n",
SoleneDc's avatar
SoleneDc committed
678
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
679
      "max_pooling1d_28 (MaxPooling (None, 29, 4)             0         \n",
SoleneDc's avatar
SoleneDc committed
680
      "_________________________________________________________________\n",
SoleneDc's avatar
SoleneDc committed
681 682 683
      "flatten_13 (Flatten)         (None, 116)               0         \n",
      "_________________________________________________________________\n",
      "dense_14 (Dense)             (None, 3)                 351       \n",
SoleneDc's avatar
SoleneDc committed
684
      "=================================================================\n",
SoleneDc's avatar
SoleneDc committed
685 686
      "Total params: 511\n",
      "Trainable params: 511\n",
SoleneDc's avatar
SoleneDc committed
687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704
      "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
705
   "execution_count": 131,
SoleneDc's avatar
SoleneDc committed
706 707 708 709 710 711
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
SoleneDc's avatar
SoleneDc committed
712
      "Train on 2441 samples, validate on 1047 samples\n",
SoleneDc's avatar
SoleneDc committed
713
      "Epoch 1/100\n",
SoleneDc's avatar
SoleneDc committed
714
      "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
715
      "Epoch 2/100\n",
SoleneDc's avatar
SoleneDc committed
716
      "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
717
      "Epoch 3/100\n",
SoleneDc's avatar
SoleneDc committed
718
      "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
719
      "Epoch 4/100\n",
SoleneDc's avatar
SoleneDc committed
720
      "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
721
      "Epoch 5/100\n",
SoleneDc's avatar
SoleneDc committed
722
      "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
723
      "Epoch 6/100\n",
SoleneDc's avatar
SoleneDc committed
724
      "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
725
      "Epoch 7/100\n",
SoleneDc's avatar
SoleneDc committed
726
      "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
727
      "Epoch 8/100\n",
SoleneDc's avatar
SoleneDc committed
728
      "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
729
      "Epoch 9/100\n",
SoleneDc's avatar
SoleneDc committed
730
      "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
731
      "Epoch 10/100\n",
SoleneDc's avatar
SoleneDc committed
732
      "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
733
      "Epoch 11/100\n",
SoleneDc's avatar
SoleneDc committed
734
      "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
735
      "Epoch 12/100\n",
SoleneDc's avatar
SoleneDc committed
736
      "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
737
      "Epoch 13/100\n",
SoleneDc's avatar
SoleneDc committed
738
      "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
739
      "Epoch 14/100\n",
SoleneDc's avatar
SoleneDc committed
740
      "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
741
      "Epoch 15/100\n",
SoleneDc's avatar
SoleneDc committed
742
      "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
743
      "Epoch 16/100\n",
SoleneDc's avatar
SoleneDc committed
744
      "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
745
      "Epoch 17/100\n",
SoleneDc's avatar
SoleneDc committed
746
      "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
747
      "Epoch 18/100\n",
SoleneDc's avatar
SoleneDc committed
748
      "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
749
      "Epoch 19/100\n",
SoleneDc's avatar
SoleneDc committed
750
      "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
751
      "Epoch 20/100\n",
SoleneDc's avatar
SoleneDc committed
752
      "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
753
      "Epoch 21/100\n",
SoleneDc's avatar
SoleneDc committed
754
      "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
755
      "Epoch 22/100\n",
SoleneDc's avatar
SoleneDc committed
756
      "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
757
      "Epoch 23/100\n",
SoleneDc's avatar
SoleneDc committed
758
      "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
759
      "Epoch 24/100\n",
SoleneDc's avatar
SoleneDc committed
760
      "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
761
      "Epoch 25/100\n",
SoleneDc's avatar
SoleneDc committed
762
      "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
763
      "Epoch 26/100\n",
SoleneDc's avatar
SoleneDc committed
764
      "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
765
      "Epoch 27/100\n",
SoleneDc's avatar
SoleneDc committed
766
      "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
767
      "Epoch 28/100\n",
SoleneDc's avatar
SoleneDc committed
768
      "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
769
      "Epoch 29/100\n",
SoleneDc's avatar
SoleneDc committed
770
      "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
771
      "Epoch 30/100\n",
SoleneDc's avatar
SoleneDc committed
772
      "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
773
      "Epoch 31/100\n",
SoleneDc's avatar
SoleneDc committed
774
      "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
775
      "Epoch 32/100\n",
SoleneDc's avatar
SoleneDc committed
776
      "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
777
      "Epoch 33/100\n",
SoleneDc's avatar
SoleneDc committed
778
      "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
779
      "Epoch 34/100\n",
SoleneDc's avatar
SoleneDc committed
780
      "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
781
      "Epoch 35/100\n",
SoleneDc's avatar
SoleneDc committed
782
      "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
783
      "Epoch 36/100\n",
SoleneDc's avatar
SoleneDc committed
784
      "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
785
      "Epoch 37/100\n",
SoleneDc's avatar
SoleneDc committed
786
      "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
787
      "Epoch 38/100\n",
SoleneDc's avatar
SoleneDc committed
788
      "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
789
      "Epoch 39/100\n",
SoleneDc's avatar
SoleneDc committed
790
      "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
791
      "Epoch 40/100\n",
SoleneDc's avatar
SoleneDc committed
792
      "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
793
      "Epoch 41/100\n",
SoleneDc's avatar
SoleneDc committed
794
      "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
795
      "Epoch 42/100\n",
SoleneDc's avatar
SoleneDc committed
796
      "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
797
      "Epoch 43/100\n",
SoleneDc's avatar
SoleneDc committed
798
      "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
799
      "Epoch 44/100\n",
SoleneDc's avatar
SoleneDc committed
800
      "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
801
      "Epoch 45/100\n",
SoleneDc's avatar
SoleneDc committed
802
      "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
803
      "Epoch 46/100\n",
SoleneDc's avatar
SoleneDc committed
804
      "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
805
      "Epoch 47/100\n",
SoleneDc's avatar
SoleneDc committed
806
      "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
807
      "Epoch 48/100\n",
SoleneDc's avatar
SoleneDc committed
808
      "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
809
      "Epoch 49/100\n",
SoleneDc's avatar
SoleneDc committed
810
      "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
811
      "Epoch 50/100\n",
SoleneDc's avatar
SoleneDc committed
812
      "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
813
      "Epoch 51/100\n",
SoleneDc's avatar
SoleneDc committed
814
      "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
815
      "Epoch 52/100\n",
SoleneDc's avatar
SoleneDc committed
816
      "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
817
      "Epoch 53/100\n",
SoleneDc's avatar
SoleneDc committed
818
      "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
819
      "Epoch 54/100\n",
SoleneDc's avatar
SoleneDc committed
820
      "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
821
      "Epoch 55/100\n",
SoleneDc's avatar
SoleneDc committed
822
      "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
823
      "Epoch 56/100\n",
SoleneDc's avatar
SoleneDc committed
824
      "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
825
      "Epoch 57/100\n",
SoleneDc's avatar
SoleneDc committed
826
      "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
827
      "Epoch 58/100\n",
SoleneDc's avatar
SoleneDc committed
828
      "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
829
      "Epoch 59/100\n",
SoleneDc's avatar
SoleneDc committed
830
      "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
831
      "Epoch 60/100\n"
SoleneDc's avatar
SoleneDc committed
832 833 834
     ]
    },
    {
Hachemin Pierre-Yves's avatar
Hachemin Pierre-Yves committed
835 836 837
     "name": "stdout",
     "output_type": "stream",
     "text": [
SoleneDc's avatar
SoleneDc committed
838
      "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
839
      "Epoch 61/100\n",
SoleneDc's avatar
SoleneDc committed
840
      "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
841
      "Epoch 62/100\n",
SoleneDc's avatar
SoleneDc committed
842
      "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
843
      "Epoch 63/100\n",
SoleneDc's avatar
SoleneDc committed
844
      "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
845
      "Epoch 64/100\n",
SoleneDc's avatar
SoleneDc committed
846
      "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
847
      "Epoch 65/100\n",
SoleneDc's avatar
SoleneDc committed
848
      "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
849
      "Epoch 66/100\n",
SoleneDc's avatar
SoleneDc committed
850
      "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
851
      "Epoch 67/100\n",
SoleneDc's avatar
SoleneDc committed
852
      "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
853
      "Epoch 68/100\n",
SoleneDc's avatar
SoleneDc committed
854
      "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
855
      "Epoch 69/100\n",
SoleneDc's avatar
SoleneDc committed
856
      "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
857
      "Epoch 70/100\n",
SoleneDc's avatar
SoleneDc committed
858
      "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
859
      "Epoch 71/100\n",
SoleneDc's avatar
SoleneDc committed
860
      "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
861
      "Epoch 72/100\n",
SoleneDc's avatar
SoleneDc committed
862
      "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
863
      "Epoch 73/100\n",
SoleneDc's avatar
SoleneDc committed
864
      "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
865
      "Epoch 74/100\n",
SoleneDc's avatar
SoleneDc committed
866
      "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
867
      "Epoch 75/100\n",
SoleneDc's avatar
SoleneDc committed
868
      "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
869
      "Epoch 76/100\n",
SoleneDc's avatar
SoleneDc committed
870
      "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
871
      "Epoch 77/100\n",
SoleneDc's avatar
SoleneDc committed
872
      "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
873
      "Epoch 78/100\n",
SoleneDc's avatar
SoleneDc committed
874
      "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
875
      "Epoch 79/100\n",
SoleneDc's avatar
SoleneDc committed
876
      "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
877
      "Epoch 80/100\n",
SoleneDc's avatar
SoleneDc committed
878
      "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
879
      "Epoch 81/100\n",
SoleneDc's avatar
SoleneDc committed
880
      "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
881
      "Epoch 82/100\n",
SoleneDc's avatar
SoleneDc committed
882
      "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
883
      "Epoch 83/100\n",
SoleneDc's avatar
SoleneDc committed
884
      "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
885
      "Epoch 84/100\n",
SoleneDc's avatar
SoleneDc committed
886
      "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
887
      "Epoch 85/100\n",
SoleneDc's avatar
SoleneDc committed
888
      "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
889
      "Epoch 86/100\n",
SoleneDc's avatar
SoleneDc committed
890
      "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
891
      "Epoch 87/100\n",
SoleneDc's avatar
SoleneDc committed
892
      "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
893
      "Epoch 88/100\n",
SoleneDc's avatar
SoleneDc committed
894
      "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
895
      "Epoch 89/100\n",
SoleneDc's avatar
SoleneDc committed
896
      "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
897
      "Epoch 90/100\n",
SoleneDc's avatar
SoleneDc committed
898
      "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
899
      "Epoch 91/100\n",
SoleneDc's avatar
SoleneDc committed
900
      "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
901
      "Epoch 92/100\n",
SoleneDc's avatar
SoleneDc committed
902
      "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
903
      "Epoch 93/100\n",
SoleneDc's avatar
SoleneDc committed
904
      "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
905
      "Epoch 94/100\n",
SoleneDc's avatar
SoleneDc committed
906
      "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
907
      "Epoch 95/100\n",
SoleneDc's avatar
SoleneDc committed
908
      "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
909
      "Epoch 96/100\n",
SoleneDc's avatar
SoleneDc committed
910
      "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
911
      "Epoch 97/100\n",
SoleneDc's avatar
SoleneDc committed
912
      "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
913
      "Epoch 98/100\n",
SoleneDc's avatar
SoleneDc committed
914
      "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
915
      "Epoch 99/100\n",
SoleneDc's avatar
SoleneDc committed
916
      "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
917
      "Epoch 100/100\n",
SoleneDc's avatar
SoleneDc committed
918
      "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
919 920 921 922 923 924 925 926
     ]
    }
   ],
   "source": [
    "model.compile(loss='categorical_crossentropy',\n",
    "              optimizer='adam',\n",
    "              metrics=['accuracy'])\n",
    "\n",
SoleneDc's avatar
SoleneDc committed
927
    "history = model.fit(X_train, Y_train, epochs=100, validation_split=0.3, batch_size=400 , verbose=1)"
SoleneDc's avatar
SoleneDc committed
928 929 930 931
   ]
  },
  {
   "cell_type": "code",
SoleneDc's avatar
SoleneDc committed
932 933 934 935
   "execution_count": 132,
   "metadata": {
    "scrolled": true
   },
SoleneDc's avatar
SoleneDc committed
936 937 938 939 940 941
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
SoleneDc's avatar
SoleneDc committed
942 943
      "  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
944 945 946 947 948
      "\n"
     ]
    },
    {
     "data": {
SoleneDc's avatar
SoleneDc committed
949
      "image/png": "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\nu/4fObbiaVFyMU0AAAAASUVORK5CYII=\n",
SoleneDc's avatar
SoleneDc committed
950
      "text/plain": [
SoleneDc's avatar
SoleneDc committed
951
       "<matplotlib.figure.Figure at 0x18613ec9e8>"
SoleneDc's avatar
SoleneDc committed
952 953 954 955 956 957 958
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
SoleneDc's avatar
SoleneDc committed
959
      "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
960
      "text/plain": [
SoleneDc's avatar
SoleneDc committed
961
       "<matplotlib.figure.Figure at 0x185ad1df60>"
SoleneDc's avatar
SoleneDc committed
962 963 964 965 966 967 968 969 970 971 972
      ]
     },
     "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
973 974
    "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
975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992
    "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
993 994 995
   "metadata": {
    "collapsed": true
   },
SoleneDc's avatar
SoleneDc committed
996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
   "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
1016
   "version": "3.6.3"
SoleneDc's avatar
SoleneDc committed
1017 1018 1019 1020 1021
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}