{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":5441,"databundleVersionId":38425,"sourceType":"competition"},{"sourceId":9900,"sourceType":"datasetVersion","datasetId":6209}],"dockerImageVersionId":11543,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"<h1><center><font size=\"6\">Cats or Dogs - Usando Redes Convolucionais</font></center></h1>\n\n\n<center><img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Cat_and_dog_standoff_%283926784260%29.jpg/640px-Cat_and_dog_standoff_%283926784260%29.jpg\" width=\"900\"></img></center>\n\n\n# <a id='0'>Conteúdo</a>\n\n- <a href='#1'>Introdução</a>  \n- <a href='#2'>Carregar pacotes e definir parâmetros</a>  \n- <a href='#3'>Ler os dados</a>  \n- <a href='#4'>Exploração de dados</a>\n    - <a href='#41'>Distribuição de classes</a>\n    - <a href='#42'>Amostras de imagens</a>\n- <a href='#5'>Modelo</a>  \n    - <a href='#51'>Preparar o modelo</a>  \n    - <a href='#52'>Treinar o modelo</a>  \n    - <a href='#53'>Acurácia e perda na validação</a>  \n    - <a href='#54'>Acurácia na validação por classe</a>  \n- <a href='#6'>Preparar submissão</a>     \n- <a href='#7'>Conclusões</a>\n- <a href='#8'>Referências</a>\n\n\n","metadata":{"_uuid":"1fad66867637226998d21e199e23f70e4eea955d"}},{"cell_type":"markdown","source":"# <a id=\"1\">Introdução</a>  \n\n\n## Conjunto de Dados\n\nA pasta **train** contém **25.000** imagens de **cães** e **gatos**. Cada imagem nesta pasta tem o rótulo como parte do nome do arquivo. A pasta **test** contém **12.500** imagens, nomeadas de acordo com um id numérico.  \nPara cada imagem no conjunto de teste, você deve prever uma probabilidade de que a imagem seja de um cão (**1** = **cão**, **0** = **gato**).\n\n\n## Método\n\nPara a solução deste problema, usaremos um modelo pré-treinado, ResNet-50, substituindo apenas a última camada.\n","metadata":{"_uuid":"9ac4b97e33b99764c02e38fb58e0b56a03c7fa5f"}},{"cell_type":"markdown","source":"# <a id=\"2\">Carregando Bibliotecas</a>","metadata":{"_uuid":"f4c5a829054852b17a48ffda50c7e35c605911bb"}},{"cell_type":"code","source":"import os, cv2, random\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report\nfrom tqdm import tqdm\nfrom random import shuffle \nfrom IPython.display import SVG\nfrom keras.utils.vis_utils import model_to_dot\nfrom keras.utils import plot_model\nfrom tensorflow.python.keras.applications import ResNet50\nfrom tensorflow.python.keras.models import Sequential\nfrom tensorflow.python.keras.layers import Dense, Flatten, GlobalAveragePooling2D\n%matplotlib inline ","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-02-14T20:51:32.921881Z","iopub.execute_input":"2024-02-14T20:51:32.922146Z","iopub.status.idle":"2024-02-14T20:51:34.247543Z","shell.execute_reply.started":"2024-02-14T20:51:32.922097Z","shell.execute_reply":"2024-02-14T20:51:34.246714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Parâmetros\n\nAqui definimos alguns parâmetros usados no modelo. O tamanho da imagem é **224**.    \nAs imagens são armazenadas em duas pastas, **train** e **test**.  \nExistem duas classes de imagens: **Cão** e **Gato**.  \nUsaremos um subconjunto do conjunto de dados de treinamento (**20.000** imagens). Do conjunto de treinamento, **50%** será usado para treinamento, **50%** para validação.  \nSerá utilizado um modelo pré-treinado do **ResNet-50**.  \nUm número de **10** épocas será usado para o treinamento.\n \n\n","metadata":{"_uuid":"90c407d19e9f09a44cef1714461a1b5d10f1b0d8"}},{"cell_type":"code","source":"TEST_SIZE = 0.5\nRANDOM_STATE = 2018\nBATCH_SIZE = 64\nNO_EPOCHS = 20\nNUM_CLASSES = 2\nSAMPLE_SIZE = 20000\nPATH = '/kaggle/input/dogs-vs-cats-redux-kernels-edition/'\nTRAIN_FOLDER = './train/'\nTEST_FOLDER =  './test/'\nIMG_SIZE = 224\nRESNET_WEIGHTS_PATH = '/kaggle/input/resnet50/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5'","metadata":{"_uuid":"f265a0cfc1bc6379507962130087e7f212e12f83","execution":{"iopub.status.busy":"2024-02-14T20:51:51.939896Z","iopub.execute_input":"2024-02-14T20:51:51.940201Z","iopub.status.idle":"2024-02-14T20:51:51.945364Z","shell.execute_reply.started":"2024-02-14T20:51:51.940131Z","shell.execute_reply":"2024-02-14T20:51:51.944543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <a id=\"3\">Ler os dados</a>\n\nDefinimos a lista de imagens de treino.   \nAjustando o valor de **SAMPLE_SIZE** podemos reduzir/aumentar o tamanho do conjunto de treinamento.    \nAtualmente, **SAMPLE_SIZE** está definido para **20.000**.\n\n","metadata":{"_uuid":"a1c725fa996e10190a924b977354d82b767c68bf"}},{"cell_type":"code","source":"train_image_path = os.path.join(PATH, \"train.zip\")\ntest_image_path = os.path.join(PATH, \"test.zip\")","metadata":{"execution":{"iopub.status.busy":"2024-02-14T20:51:53.010061Z","iopub.execute_input":"2024-02-14T20:51:53.010366Z","iopub.status.idle":"2024-02-14T20:51:53.014561Z","shell.execute_reply.started":"2024-02-14T20:51:53.010319Z","shell.execute_reply":"2024-02-14T20:51:53.013734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import zipfile\nwith zipfile.ZipFile(train_image_path,\"r\") as z:\n    z.extractall(\".\")","metadata":{"execution":{"iopub.status.busy":"2024-02-14T20:51:53.210076Z","iopub.execute_input":"2024-02-14T20:51:53.210395Z","iopub.status.idle":"2024-02-14T20:52:06.593078Z","shell.execute_reply.started":"2024-02-14T20:51:53.210343Z","shell.execute_reply":"2024-02-14T20:52:06.592452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with zipfile.ZipFile(test_image_path,\"r\") as z:\n    z.extractall(\".\")","metadata":{"execution":{"iopub.status.busy":"2024-02-14T20:52:06.594364Z","iopub.execute_input":"2024-02-14T20:52:06.594650Z","iopub.status.idle":"2024-02-14T20:52:14.691757Z","shell.execute_reply.started":"2024-02-14T20:52:06.594598Z","shell.execute_reply":"2024-02-14T20:52:14.690867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_image_list = os.listdir(\"./train/\")[0:SAMPLE_SIZE]\ntest_image_list = os.listdir(\"./test/\")","metadata":{"_uuid":"12d65488fa58182f965485608965ae36f345f183","execution":{"iopub.status.busy":"2024-02-14T20:52:14.692961Z","iopub.execute_input":"2024-02-14T20:52:14.693234Z","iopub.status.idle":"2024-02-14T20:52:14.720011Z","shell.execute_reply.started":"2024-02-14T20:52:14.693158Z","shell.execute_reply":"2024-02-14T20:52:14.719416Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Definimos uma função para analisar os nomes das imagens para extrair as primeiras 3 letras dos nomes das imagens, o que dá o rótulo da imagem. Será ou um gato ou um cachorro. Estamos usando um codificador one hot, armazenando [1,0] para **gato** e [0,1] para **cachorro**.\n","metadata":{"_uuid":"729f56cad0895facac99467faec510d3d61156a9"}},{"cell_type":"code","source":"def label_pet_image_one_hot_encoder(img):\n    pet = img.split('.')[-3]\n    if pet == 'cat': return [1,0]\n    elif pet == 'dog': return [0,1]","metadata":{"_uuid":"1df3dd73913a3e63a059edec2496e2db1d570c34","execution":{"iopub.status.busy":"2024-02-14T20:52:14.721580Z","iopub.execute_input":"2024-02-14T20:52:14.721874Z","iopub.status.idle":"2024-02-14T20:52:14.726027Z","shell.execute_reply.started":"2024-02-14T20:52:14.721818Z","shell.execute_reply":"2024-02-14T20:52:14.725074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Estamos definindo também uma função para processar os dados (tanto o conjunto de treinamento quanto o de teste).","metadata":{"_uuid":"e62d359a2c5c01658610c85c162da998afcbf14d"}},{"cell_type":"code","source":"def process_data(data_image_list, DATA_FOLDER, isTrain=True):\n    data_df = []\n    for img in tqdm(data_image_list):\n        path = os.path.join(DATA_FOLDER,img)\n        if(isTrain):\n            label = label_pet_image_one_hot_encoder(img)\n        else:\n            label = img.split('.')[0]\n        img = cv2.imread(path,cv2.IMREAD_COLOR)\n        img = cv2.resize(img, (IMG_SIZE,IMG_SIZE))\n        data_df.append([np.array(img),np.array(label)])\n    shuffle(data_df)\n    return data_df","metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","execution":{"iopub.status.busy":"2024-02-14T20:52:14.727080Z","iopub.execute_input":"2024-02-14T20:52:14.727326Z","iopub.status.idle":"2024-02-14T20:52:14.737924Z","shell.execute_reply.started":"2024-02-14T20:52:14.727286Z","shell.execute_reply":"2024-02-14T20:52:14.737039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Estamos definindo também uma função para processar os dados (tanto o conjunto de treinamento quanto o de teste).","metadata":{"_uuid":"cd19491249f9dd5bc2fd8bfbdfd124fdcdb0cbe1"}},{"cell_type":"code","source":"def plot_image_list_count(data_image_list):\n    labels = []\n    for img in data_image_list:\n        labels.append(img.split('.')[-3])\n    sns.countplot(labels)\n    plt.title('Cats and Dogs')\n    \nplot_image_list_count(train_image_list)","metadata":{"_uuid":"2901e1126ebe160a5a5c5a03dd07d5b8792a5290","execution":{"iopub.status.busy":"2024-02-14T20:53:27.026554Z","iopub.execute_input":"2024-02-14T20:53:27.026808Z","iopub.status.idle":"2024-02-14T20:53:27.230669Z","shell.execute_reply.started":"2024-02-14T20:53:27.026759Z","shell.execute_reply":"2024-02-14T20:53:27.229671Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_image_list_count(os.listdir(TRAIN_FOLDER))","metadata":{"_uuid":"1f36b71d110658540e3cbf3e435e00810ebb2d19","execution":{"iopub.status.busy":"2024-02-14T20:53:27.232310Z","iopub.execute_input":"2024-02-14T20:53:27.232873Z","iopub.status.idle":"2024-02-14T20:53:27.514980Z","shell.execute_reply.started":"2024-02-14T20:53:27.232808Z","shell.execute_reply":"2024-02-14T20:53:27.513984Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## <a id=\"42\">Amostras de imagens</a>\n\nVamos representar algumas das imagens. Começamos com uma seleção do conjunto de treinamento. Mostraremos as primeiras 25 imagens do conjunto de treinamento.\n\nPrimeiro, processamos os dados de treinamento, lendo as imagens e criando uma tabela com imagens e rótulos. Se os dados são do conjunto de treinamento, o rótulo é o calculado com a codificação one hot; se os dados são do conjunto de teste, o rót\n","metadata":{"_uuid":"c76a6072f4d272ffc7906d56a3008449a569f45b"}},{"cell_type":"code","source":"train = process_data(train_image_list, TRAIN_FOLDER)","metadata":{"_uuid":"d1b8ee45b627b58a3a5d04bb0c64fb18d5e8f592","execution":{"iopub.status.busy":"2024-02-14T20:52:15.271237Z","iopub.execute_input":"2024-02-14T20:52:15.271864Z","iopub.status.idle":"2024-02-14T20:52:56.332387Z","shell.execute_reply.started":"2024-02-14T20:52:15.271793Z","shell.execute_reply":"2024-02-14T20:52:56.331708Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Em seguida, plotamos a seleção de imagens.","metadata":{"_uuid":"a3583fc9056b32953bae9b90a3aaab7ff451c025"}},{"cell_type":"code","source":"def show_images(data, isTest=False):\n    f, ax = plt.subplots(5,5, figsize=(15,15))\n    for i,data in enumerate(data[:25]):\n        img_num = data[1]\n        img_data = data[0]\n        label = np.argmax(img_num)\n        if label  == 1: \n            str_label='Dog'\n        elif label == 0: \n            str_label='Cat'\n        if(isTest):\n            str_label=\"None\"\n        ax[i//5, i%5].imshow(img_data)\n        ax[i//5, i%5].axis('off')\n        ax[i//5, i%5].set_title(\"Label: {}\".format(str_label))\n    plt.show()\n\nshow_images(train)","metadata":{"_uuid":"8a2b305bce44360f693d678a4b7eb9f27b3a7d36","execution":{"iopub.status.busy":"2024-02-14T20:52:56.333501Z","iopub.execute_input":"2024-02-14T20:52:56.333712Z","iopub.status.idle":"2024-02-14T20:52:58.100638Z","shell.execute_reply.started":"2024-02-14T20:52:56.333675Z","shell.execute_reply":"2024-02-14T20:52:58.098981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Vamos também mostrar uma seleção do conjunto de treinamento. Preparamos o conjunto de teste.","metadata":{"_uuid":"7cc51ba41c85ca9a93289362ce93b852ef34be6d"}},{"cell_type":"code","source":"test = process_data(test_image_list, TEST_FOLDER, False)","metadata":{"_uuid":"cb0696a3111e5421b3809f91bcb040f32cbde799","execution":{"iopub.status.busy":"2024-02-14T20:52:58.101900Z","iopub.execute_input":"2024-02-14T20:52:58.102180Z","iopub.status.idle":"2024-02-14T20:53:23.191660Z","shell.execute_reply.started":"2024-02-14T20:52:58.102118Z","shell.execute_reply":"2024-02-14T20:53:23.190821Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Mostrando um conjunto de imagens de teste","metadata":{"_uuid":"417b99a48d96abddb8bc3895a42520690d31208a"}},{"cell_type":"code","source":"show_images(test,True)","metadata":{"_uuid":"485ff5d66200edf7159027b49d4e60619b8b404a","execution":{"iopub.status.busy":"2024-02-14T20:53:23.192843Z","iopub.execute_input":"2024-02-14T20:53:23.193051Z","iopub.status.idle":"2024-02-14T20:53:24.868076Z","shell.execute_reply.started":"2024-02-14T20:53:23.193014Z","shell.execute_reply":"2024-02-14T20:53:24.867086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <a id=\"5\">Model</a>\n\n## <a id=\"51\">Preparar o modelo</a>\n\nIniciando a preparação dos dados\n\n### Preparar os dados de treino","metadata":{"_uuid":"968f2373e44ccea4585d7191b0afc39a92fdff75"}},{"cell_type":"code","source":"X = np.array([i[0] for i in train]).reshape(-1,IMG_SIZE,IMG_SIZE,3)\ny = np.array([i[1] for i in train])","metadata":{"_uuid":"7651e9ef5ff8074165a5208257c5db81ab83b75f","execution":{"iopub.status.busy":"2024-02-14T20:53:24.869429Z","iopub.execute_input":"2024-02-14T20:53:24.869682Z","iopub.status.idle":"2024-02-14T20:53:27.025123Z","shell.execute_reply.started":"2024-02-14T20:53:24.869630Z","shell.execute_reply":"2024-02-14T20:53:27.024375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Preparar o modelo\n\nInicializamos o modelo **ResNet-50**, adicionando uma última camada adicional do tipo **Dense**, com função de ativação **softmax**.\n\nTambém configuramos a primeira camada do modelo para não ser treinável, porque o modelo **ResNet-50** já foi treinado.","metadata":{"_uuid":"802f6921a5ab7e2b75b6cb239bedd71cb2c0e4cd"}},{"cell_type":"code","source":"from tensorflow.python.keras.applications import ResNet50\nfrom tensorflow.python.keras.models import Sequential\nfrom tensorflow.python.keras.layers import Dense, Flatten, GlobalAveragePooling2D\n\nmodel = Sequential()\nmodel.add(ResNet50(include_top=False, pooling='max', weights=RESNET_WEIGHTS_PATH))\nmodel.add(Dense(NUM_CLASSES, activation='softmax'))\n# ResNet-50 model is already trained, should not be trained\nmodel.layers[0].trainable = True\n","metadata":{"_uuid":"94892424cb4e898d6b7c3df1269cfab6371c4eb9","execution":{"iopub.status.busy":"2024-02-14T20:54:14.691358Z","iopub.execute_input":"2024-02-14T20:54:14.691632Z","iopub.status.idle":"2024-02-14T20:54:27.903868Z","shell.execute_reply.started":"2024-02-14T20:54:14.691591Z","shell.execute_reply":"2024-02-14T20:54:27.903278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Compilar o modelo\n\nNós compilamos o modelo, utilizando um otimizador **sigmoid**, a função de perda como **entropia cruzada categórica** e a métrica **precisão**.","metadata":{"_uuid":"cfb6886ef6d14fc9f1cdd1857fdd07f9639e6442"}},{"cell_type":"code","source":"model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])","metadata":{"_uuid":"c24a3f51ef3487e15efdc8c2e876aea7c429b876","execution":{"iopub.status.busy":"2024-02-14T20:54:31.116953Z","iopub.execute_input":"2024-02-14T20:54:31.117258Z","iopub.status.idle":"2024-02-14T20:54:31.247689Z","shell.execute_reply.started":"2024-02-14T20:54:31.117205Z","shell.execute_reply":"2024-02-14T20:54:31.247010Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Resumo do modelo\n\nNós plotamos a descrição do modelo. Podemos ver que o modelo **ResNet-50** representa a 1ª camada do nosso modelo, do tipo **Model**.","metadata":{"_uuid":"52e06decf4d5ea9e099b4669681b8ebb36ccd7bd"}},{"cell_type":"code","source":"model.summary()","metadata":{"_uuid":"3e2a3ff8c2dd896fd9ca725625587564165d0727","execution":{"iopub.status.busy":"2024-02-14T20:54:34.366601Z","iopub.execute_input":"2024-02-14T20:54:34.366878Z","iopub.status.idle":"2024-02-14T20:54:34.380151Z","shell.execute_reply.started":"2024-02-14T20:54:34.366837Z","shell.execute_reply":"2024-02-14T20:54:34.379069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Vamos também mostrar a representação gráfica do modelo usando **plot_model**.","metadata":{"_uuid":"6bd39063f81d0b87f80542c6b8ce74035e2de28e"}},{"cell_type":"code","source":"plot_model(model, to_file='model.png')\nSVG(model_to_dot(model).create(prog='dot', format='svg'))","metadata":{"_uuid":"64561287fa8faaa756ba4043a2a3c671810a9dbf","execution":{"iopub.status.busy":"2024-02-14T20:54:38.826243Z","iopub.execute_input":"2024-02-14T20:54:38.826520Z","iopub.status.idle":"2024-02-14T20:54:40.353380Z","shell.execute_reply.started":"2024-02-14T20:54:38.826478Z","shell.execute_reply":"2024-02-14T20:54:40.352329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Dividir os dados de treino em treino e validação\n\nDividimos os dados de treino em duas partes. Uma será reservada para o conjunto de treino, a segunda para o conjunto de validação. Apenas o subconjunto de treino dos dados será usado para treinar o modelo; o conjunto de validação será usado para validação, durante o treino.","metadata":{"_uuid":"cba1cd58d8f3e3240fafe88ba5ac4c8cd3885008"}},{"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=TEST_SIZE, random_state=RANDOM_STATE)","metadata":{"_uuid":"e80c5bd03d275807865c424187f752b521c99f15","execution":{"iopub.status.busy":"2024-02-14T20:54:42.847695Z","iopub.execute_input":"2024-02-14T20:54:42.847980Z","iopub.status.idle":"2024-02-14T20:54:44.812969Z","shell.execute_reply.started":"2024-02-14T20:54:42.847934Z","shell.execute_reply":"2024-02-14T20:54:44.812285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" y_train","metadata":{"execution":{"iopub.status.busy":"2024-02-14T20:54:44.814229Z","iopub.execute_input":"2024-02-14T20:54:44.814523Z","iopub.status.idle":"2024-02-14T20:54:44.820145Z","shell.execute_reply.started":"2024-02-14T20:54:44.814469Z","shell.execute_reply":"2024-02-14T20:54:44.819313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## <a id=\"52\">Treinar o modelo</a>\n\nAgora estamos prontos para treinar nosso modelo.","metadata":{"_uuid":"cb28fa20f06729cb20a31e7b5c1f99970ebe62fa"}},{"cell_type":"code","source":"train_model = model.fit(X_train, y_train,\n                  batch_size=BATCH_SIZE,\n                  epochs=3,\n                  verbose=1,\n                  validation_data=(X_val, y_val))","metadata":{"_uuid":"3899d6c135949c4546d5aa10291fb5b1ff4498da","execution":{"iopub.status.busy":"2024-02-14T21:01:23.980929Z","iopub.execute_input":"2024-02-14T21:01:23.981259Z","iopub.status.idle":"2024-02-14T21:06:01.723512Z","shell.execute_reply.started":"2024-02-14T21:01:23.981194Z","shell.execute_reply":"2024-02-14T21:06:01.722634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## <a id=\"53\">Acurácia e perda na validação</a>\n\nVamos mostrar a acurácia de treino e validação no mesmo gráfico. Da mesma forma, representaremos a perda de treino e validação no mesmo gráfico.","metadata":{"_uuid":"e9c9159b0a2f2fc8bafe9bfc1983c30a846f099a"}},{"cell_type":"code","source":"def plot_accuracy_and_loss(train_model):\n    hist = train_model.history\n    acc = hist['acc']\n    val_acc = hist['val_acc']\n    loss = hist['loss']\n    val_loss = hist['val_loss']\n    epochs = range(len(acc))\n    f, ax = plt.subplots(1,2, figsize=(14,6))\n    ax[0].plot(epochs, acc, 'g', label='Training accuracy')\n    ax[0].plot(epochs, val_acc, 'r', label='Validation accuracy')\n    ax[0].set_title('Training and validation accuracy')\n    ax[0].legend()\n    ax[1].plot(epochs, loss, 'g', label='Training loss')\n    ax[1].plot(epochs, val_loss, 'r', label='Validation loss')\n    ax[1].set_title('Training and validation loss')\n    ax[1].legend()\n    plt.show()\nplot_accuracy_and_loss(train_model)","metadata":{"_uuid":"5a7b3d7b9494a3a1a75db099d224a18b1bf1d8e3","execution":{"iopub.status.busy":"2024-02-14T21:06:01.724712Z","iopub.execute_input":"2024-02-14T21:06:01.724921Z","iopub.status.idle":"2024-02-14T21:06:02.163475Z","shell.execute_reply.started":"2024-02-14T21:06:01.724883Z","shell.execute_reply":"2024-02-14T21:06:02.162445Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Vamos também mostrar a acurácia e perda na validação numéricas.","metadata":{"_uuid":"130f99193a6b24b40c5a28f84a97b84e6d39784c"}},{"cell_type":"code","source":"score = model.evaluate(X_val, y_val, verbose=0)\nprint('Validation loss:', score[0])\nprint('Validation accuracy:', score[1])","metadata":{"_uuid":"0935a9e239a7af382208ecede99bd2afb5098482","execution":{"iopub.status.busy":"2024-02-14T21:06:02.165379Z","iopub.execute_input":"2024-02-14T21:06:02.165978Z","iopub.status.idle":"2024-02-14T21:06:25.398223Z","shell.execute_reply.started":"2024-02-14T21:06:02.165908Z","shell.execute_reply":"2024-02-14T21:06:25.397322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Test data prediction","metadata":{"_uuid":"2e2199cdb3dbef1620298f0b9060908b7e2d4f90"}},{"cell_type":"code","source":"pred_list = []\nimg_list = []\nfor img in tqdm(test):\n    img_data = img[0]\n    img_idx = img[1]\n    data = img_data.reshape(-1,IMG_SIZE,IMG_SIZE,3)\n    predicted = model.predict([data])[0]\n    img_list.append(img_idx)\n    pred_list.append(predicted[1])","metadata":{"_uuid":"15afbef65cdfe94ffa3a2e63ed97f0fdd9a34d89","execution":{"iopub.status.busy":"2024-02-14T21:07:29.411070Z","iopub.execute_input":"2024-02-14T21:07:29.411379Z","iopub.status.idle":"2024-02-14T21:09:36.571535Z","shell.execute_reply.started":"2024-02-14T21:07:29.411332Z","shell.execute_reply":"2024-02-14T21:09:36.570825Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}