{ "cells": [ { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# Bevezető példa - Mnist MLP-vel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1 Könyvtárak importálása, új sesson létrehozása és felkonfigurálása" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most elrejtjük a GPU-t a Tensorflow elől, így a CPU használatára kényszerítjük." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "helo\n" ] } ], "source": [ "print('helo')\n", "import os #GPU-t elrejtjuk a Tensorflow meg a Keras elol\n", "os.environ['CUDA_DEVICE_ORDER']='PCI_BUS_ID'\n", "os.environ['CUDA_VISIBLE_DEVICES']= ''" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Szükséges könyvtárakat beimportáljuk, új Tensorflow session-t inicializálunk, melyet átadunk a Kerasnak" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "from keras import backend as K\n", "config = tf.ConfigProto()\n", "session = tf.Session(config=config) # Letrehozunk egy TF session-t a megfelelo mem. korlattal\n", "K.set_session(session) # atadjuk azt a Kerasnak" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Importáljunk be olyan köynvtárakat, melyekre a továbbiakban szükségünk lesz:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from keras.models import Model\n", "from keras.layers import Input, Dense, Flatten\n", "from keras.optimizers import SGD\n", "from keras.datasets import mnist\n", "from keras.callbacks import ModelCheckpoint, EarlyStopping\n", "from keras.utils import to_categorical\n", "from matplotlib import pyplot as plt\n", "from random import sample as RS" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Definiáljunk egy függvényt, mely beolvassa az MNIST mintákat és one-hot coding-ra alakítja át az elvárt kimenetetet (ez elengedhetelten, ha több osztályos osztályozási feladatot kívánunk megoldani):" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def mintak_mnist():\n", " (x_tan,y_tan),(x_test,y_test)=mnist.load_data()\n", " x_tan=x_tan.astype('float32')\n", " x_test=x_test.astype('float32')\n", " print(x_tan.shape)\n", " idx=RS(set(range(y_tan.size)),5)\n", " print('Mintakepek es a cimkeik: '+str([y for y in y_tan[idx]]))\n", " \n", " (f,sf)=plt.subplots(1,5)\n", " f.set_size_inches(16,6)\n", " \n", " for i in range(5):\n", " img = x_tan[idx[i]]\n", " sf[i].imshow(img)\n", " plt.show()\n", " \n", " y_tan=to_categorical(y_tan).astype('float32')\n", " y_test=to_categorical(y_test).astype('float32') \n", " return (x_tan,y_tan,x_test,y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hívjuk is meg a függvényt" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(60000, 28, 28)\n", "Mintakepek es a cimkeik: [2, 7, 1, 5, 3]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "(x_tan,y_tan,x_tst,y_tst)=mintak_mnist() # tanito / teszt mintak lekerese\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2 rejtett rétegű MLP konstruálása" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Definiáljuk először is az MLP architekturáját: első rejtett rétegében 256, másodikban 128 tanh nemlinearitásos neuron szerepel.\n", "Továbbá lefordítjuk:\n", "- definiáljuk a tanításánál későbbiekben alkalmazott optimalizációt\n", "- továbbá meghatározzuk a veszteségfüggvényt, illetve a metrikákat is" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def get_MLP(x_p, y_p):\n", " bem = Input(shape=x_p[0].shape, dtype='float32')\n", " x = Flatten()(bem)\n", " x1 = Dense(256, activation='tanh')(x)\n", " x2 = Dense(128, activation='tanh')(x1)\n", " y = Dense(y_p[0].size, activation='softmax')(x2)\n", " \n", " model=Model(inputs=bem, outputs=y)\n", " model.compile(optimizer=SGD(lr=0.005, decay=0, momentum=0.9, nesterov=True), loss='categorical_crossentropy', metrics=['accuracy'])\n", " return(model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Definiáljuk a hálót tanító függvényt is:\n", "A Kereas beépített fit függvényét fogjuk meghívni, továbbá tanulás görbét is rajzolunk." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def tanitas(model, x_tan, y_tan, epn):\n", " hst=model.fit(x=x_tan, y=y_tan, verbose=1, batch_size=32, epochs=epn, validation_split=0.1)\n", " \n", " plt.title('Tanito gorbek')\n", " plt.xlabel('Epoch')\n", " plt.ylabel('Loss')\n", " epi=np.linspace(1,epn,epn)\n", " plt.plot(epi, hst.history['loss'], 'b-', epi, hst.history['val_loss'], 'r-')\n", " plt.legend(['tanito', 'validacios'], loc='upper left')\n", " plt.show()\n", " return model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hívjuk meg az előző két függvényt, hogy létrehozzuk és betanítsuk az MLP-t." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "input_2 (InputLayer) (None, 28, 28) 0 \n", "_________________________________________________________________\n", "flatten_2 (Flatten) (None, 784) 0 \n", "_________________________________________________________________\n", "dense_4 (Dense) (None, 256) 200960 \n", "_________________________________________________________________\n", "dense_5 (Dense) (None, 128) 32896 \n", "_________________________________________________________________\n", "dense_6 (Dense) (None, 10) 1290 \n", "=================================================================\n", "Total params: 235,146\n", "Trainable params: 235,146\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "None\n", "Train on 54000 samples, validate on 6000 samples\n", "Epoch 1/15\n", "54000/54000 [==============================] - 5s 93us/step - loss: 0.9826 - acc: 0.6646 - val_loss: 0.8896 - val_acc: 0.6877\n", "Epoch 2/15\n", "54000/54000 [==============================] - 4s 82us/step - loss: 0.9411 - acc: 0.6739 - val_loss: 0.7632 - val_acc: 0.7473\n", "Epoch 3/15\n", "54000/54000 [==============================] - 4s 83us/step - loss: 0.9127 - acc: 0.6825 - val_loss: 0.7990 - val_acc: 0.7167\n", "Epoch 4/15\n", "54000/54000 [==============================] - 4s 83us/step - loss: 0.9745 - acc: 0.6603 - val_loss: 0.9983 - val_acc: 0.6478\n", "Epoch 5/15\n", "54000/54000 [==============================] - 5s 87us/step - loss: 0.9212 - acc: 0.6801 - val_loss: 0.6993 - val_acc: 0.7633\n", "Epoch 6/15\n", "54000/54000 [==============================] - 5s 91us/step - loss: 0.7903 - acc: 0.7284 - val_loss: 0.6287 - val_acc: 0.7912\n", "Epoch 7/15\n", "54000/54000 [==============================] - 5s 98us/step - loss: 0.7095 - acc: 0.7574 - val_loss: 0.7182 - val_acc: 0.7502\n", "Epoch 8/15\n", "54000/54000 [==============================] - 6s 108us/step - loss: 0.7307 - acc: 0.7487 - val_loss: 0.6820 - val_acc: 0.7610\n", "Epoch 9/15\n", "54000/54000 [==============================] - 6s 108us/step - loss: 0.7793 - acc: 0.7312 - val_loss: 0.6749 - val_acc: 0.7555\n", "Epoch 10/15\n", "54000/54000 [==============================] - 6s 108us/step - loss: 0.7651 - acc: 0.7349 - val_loss: 0.6510 - val_acc: 0.7803\n", "Epoch 11/15\n", "54000/54000 [==============================] - 6s 107us/step - loss: 0.7337 - acc: 0.7483 - val_loss: 0.6530 - val_acc: 0.7762\n", "Epoch 12/15\n", "54000/54000 [==============================] - 6s 108us/step - loss: 0.7075 - acc: 0.7637 - val_loss: 0.6336 - val_acc: 0.7957\n", "Epoch 13/15\n", "54000/54000 [==============================] - 6s 107us/step - loss: 0.7340 - acc: 0.7506 - val_loss: 0.7004 - val_acc: 0.7622\n", "Epoch 14/15\n", "54000/54000 [==============================] - 6s 107us/step - loss: 0.7149 - acc: 0.7552 - val_loss: 0.6619 - val_acc: 0.7687\n", "Epoch 15/15\n", "54000/54000 [==============================] - 6s 107us/step - loss: 0.6853 - acc: 0.7630 - val_loss: 0.7133 - val_acc: 0.7432\n" ] }, { "data": { "image/png": "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HQoL7fvNzYWNZLNh1caqNyvMOVcqb1lsQ7VqW1oYP/1kCSSVW2bsuOOOjB07NqnnzMvLIy8vMp16/XpQZcWGuuzYEmrXtrs31slG161j8WJoWeKWU865qshbFqWoVg3atYOGDWH+fFu7VlZXXXUVo0aN+uPrG264gZtuuqnEUuWx5s2bR9euXQFYv349w4YNo1OnTgwePPhPdaPOO+888vLy6NKlC9dff/0f90+aNIm//OUv7LrrrvTu3Zu1a9fy0UcfccQRRwCwbMEiBl12GYcfvx+DB+/JtGnTAPh8+hT2PP4oDti/B9279/yjvIhzrmqrOi2LctYorwbsjL0RL9wMBbViirImUKP82GOPZfjw4VxwgRXYfeGFF3jnnXe4+OKLtypVvq39rR966CHq1KnD999/z7Rp0+jVq9cfj9188800btyYwsJCDjzwQKZNm0bHjh059thjef7559l9991Zs2YNtaNNh4i/jbyZXTt05Nk3H2LixPGcfPLJTJ06lbseeYRRV15Bsz1OZPmaArKyapX5Z+acq3yqTrKoAMG6adavs/IgCNRI8CfXs2dPfvnlFxYvXsyyZcto1KgRzZs3Z8SIEVuVKm++jalXEyZM+GOsoXv37nTv3v2Px1544QVGjx7N5s2bWbJkCd999x0iQosWLdh9990BaNCgwZ/Ot2oVTJz8Jc/d+wB16ggHHHAAK1asYM2aNfTZay/+es89HHv8Cjr1PJ7581vRoYO1spxzVVfVSRYVrFEuQHYhzJoFv/1m3VONGyf23KOPPpqxY8fy888/c+yxx5Zaqrws5s6dy5133smkSZNo1KgRp556atzzqMKC+UVUo4iaDbZuNVx19dUc3rEjb06fztln9+Gee96hXr2OtG5dwsmcc1WGv18sg6wsaN/eCrTOnWvv0BNx7LHH8txzzzF27FiOPvroMpcq33fffXn22WcB+Pbbb/8YX1izZg1169alYcOGLF26lLfeeguADh06sGTJEiZNss0G165dy+bNmwFrGVUvWMc+PXvy7H//C8BHH31E06ZNadCgAXMWLKBb+/Zcec457LHH7vz66w8sXQq//lrmH5dzrhKpOi2LJIkmjJkzYc4cm2663XalP6dLly6sXbuWli1b0qJFC0444QSOPPLIhEuVn3feeZx22ml06tSJTp06sdtuuwGw66670rNnTzp2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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mlp=get_MLP(x_tan,y_tan)\n", "print(mlp.summary())\n", "mlp=tanitas(mlp,x_tan,y_tan,15)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Háló elmentése, betöltése" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Írjuk meg a háló kimentéséhez, valamint visszatöltéséhez szükséges függvényeket, illetve importáljuk be a json file-ból model objektumot konvertáló Keras függvényt." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "from keras.models import model_from_json\n", "\n", "def halo_mentes(model,nev):\n", " model_json=model.to_json()\n", " with open(nev+'.json','w') as json_file:\n", " json_file.write(model_json)\n", " model.save_weights(nev+'.h5')\n", " \n", "\n", "def halo_betoltes(nev):\n", " json_file=open(nev+'.json','r')\n", " model_json=json_file.read()\n", " json_file.close()\n", " model=model_from_json(model_json)\n", " model.load_weights(nev+'.h5')\n", " \n", " return(model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hívjuk meg a két függvényt:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "halo_mentes(mlp, 'mlp_mnist')\n", "mlp=halo_betoltes('mlp_mnist')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Háló tesztelése" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Top3 Accuracy-val való bővítése a háló metrikáinak" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Definiáljunk a kiértékelést végző függvényt:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "from sklearn.metrics import confusion_matrix\n", "\n", "def teszt(halo, x_test, y_test):\n", " #halo.compile(optimizer=SGD(lr=0.005, decay=0, momentum=0.9, nesterov=True), loss='categorical_crossentropy', metrics=['accuracy'])\n", " tmp=halo.evaluate(x_test,y_test)\n", " print(tmp)\n", " \n", " y_pred=np.argmax(halo.predict(x_test),axis=1)\n", " print('Confusion Matrix:')\n", " print(confusion_matrix(np.argmax(y_test, axis=1), y_pred))\n", " print()\n", " print('Loss:'+str(tmp[0])+'; Acc:'+str(tmp[1])+'; Top3Acc:'+str(tmp[2]))\n", " print()\n", " return({'loss':tmp[0], 'acc':tmp[1], 'top3acc':tmp[2]})\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hívjuk is meg a tesztpontokra." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10000/10000 [==============================] - 0s 39us/step\n", "Confusion Matrix:\n", "[[ 792 1 21 15 4 115 18 1 5 8]\n", " [ 0 1105 8 3 0 0 2 4 11 2]\n", " [ 7 5 906 35 7 7 18 9 22 16]\n", " [ 31 17 61 652 1 62 5 11 152 18]\n", " [ 2 22 24 0 597 1 6 20 40 270]\n", " [ 100 8 24 89 13 529 19 14 66 30]\n", " [ 22 8 137 4 19 27 709 0 12 20]\n", " [ 14 33 87 3 11 4 0 678 79 119]\n", " [ 16 23 68 41 16 57 5 25 644 79]\n", " [ 7 23 12 7 126 8 6 52 80 688]]\n", "\n" ] }, { "ename": "IndexError", "evalue": "list index out of range", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mteszt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmlp\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mx_tst\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my_tst\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m\u001b[0m in \u001b[0;36mteszt\u001b[0;34m(halo, x_test, y_test)\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfusion_matrix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_test\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_pred\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Loss:'\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtmp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m'; Acc:'\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtmp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m'; Top3Acc:'\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtmp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m'loss'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mtmp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'acc'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mtmp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'top3acc'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mtmp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] } ], "source": [ "teszt(mlp,x_tst,y_tst)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vegyünk fel egy új metrikát, mely azt méri, hogy egy adott mintához tartozó elvárt kimenet, a háló által adott bemenethez 3 legnagyobb konfidenciával taksált kimeneti osztály egyikének a tagja. Ennek használatához újra kell fordítanunk a hálót." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "from keras.metrics import top_k_categorical_accuracy\n", "\n", "def inTop3(x,y):\n", " return(top_k_categorical_accuracy(x,y,k=3))\n", "\n", "mlp.compile(optimizer=SGD(lr=0.01, decay=0, momentum=0.9, nesterov=True), loss='categorical_crossentropy', metrics=['accuracy', inTop3])\n" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10000/10000 [==============================] - 0s 43us/step\n", "[0.7539870841026306, 0.73, 0.9456]\n", "Confusion Matrix:\n", "[[ 792 1 21 15 4 115 18 1 5 8]\n", " [ 0 1105 8 3 0 0 2 4 11 2]\n", " [ 7 5 906 35 7 7 18 9 22 16]\n", " [ 31 17 61 652 1 62 5 11 152 18]\n", " [ 2 22 24 0 597 1 6 20 40 270]\n", " [ 100 8 24 89 13 529 19 14 66 30]\n", " [ 22 8 137 4 19 27 709 0 12 20]\n", " [ 14 33 87 3 11 4 0 678 79 119]\n", " [ 16 23 68 41 16 57 5 25 644 79]\n", " [ 7 23 12 7 126 8 6 52 80 688]]\n", "\n", "Loss:0.7539870841026306; Acc:0.73; Top3Acc:0.9456\n", "\n" ] }, { "data": { "text/plain": [ "{'loss': 0.7539870841026306, 'acc': 0.73, 'top3acc': 0.9456}" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mlp.compile(optimizer=SGD(lr=0.01, decay=0, momentum=0.9, nesterov=True), loss='categorical_crossentropy', metrics=['accuracy', inTop3])\n", "teszt(mlp,x_tst,y_tst)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Végezetül töröljük a létrehozott session-t, ezáltal felszabadítva a GPU memóriát" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": true }, "outputs": [], "source": [ "K.clear_session()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Copyright (c) 2018 Hadházi Dániel, BME-MIT" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }