{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "Ic4_occAAiAT" }, "source": [ "##### Copyright 2018 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2021-08-13T19:40:52.701138Z", "iopub.status.busy": "2021-08-13T19:40:52.700527Z", "iopub.status.idle": "2021-08-13T19:40:52.703581Z", "shell.execute_reply": "2021-08-13T19:40:52.703959Z" }, "id": "ioaprt5q5US7" }, "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2021-08-13T19:40:52.708429Z", "iopub.status.busy": "2021-08-13T19:40:52.707844Z", "iopub.status.idle": "2021-08-13T19:40:52.710004Z", "shell.execute_reply": "2021-08-13T19:40:52.710361Z" }, "id": "yCl0eTNH5RS3" }, "outputs": [], "source": [ "#@title MIT License\n", "#\n", "# Copyright (c) 2017 François Chollet\n", "#\n", "# Permission is hereby granted, free of charge, to any person obtaining a\n", "# copy of this software and associated documentation files (the \"Software\"),\n", "# to deal in the Software without restriction, including without limitation\n", "# the rights to use, copy, modify, merge, publish, distribute, sublicense,\n", "# and/or sell copies of the Software, and to permit persons to whom the\n", "# Software is furnished to do so, subject to the following conditions:\n", "#\n", "# The above copyright notice and this permission notice shall be included in\n", "# all copies or substantial portions of the Software.\n", "#\n", "# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n", "# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n", "# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n", "# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n", "# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n", "# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n", "# DEALINGS IN THE SOFTWARE." ] }, { "cell_type": "markdown", "metadata": { "id": "ItXfxkxvosLH" }, "source": [ "# Classificação de texto com avaliações de filmes" ] }, { "cell_type": "markdown", "metadata": { "id": "hKY4XMc9o8iB" }, "source": [ "\n", " \n", " \n", " \n", " \n", "
\n", " Veja em TensorFlow.org\n", " \n", " Execute em Google Colab\n", " \n", " Veja fonte em GitHub\n", " \n", " Baixe o notebook\n", "
" ] }, { "cell_type": "markdown", "metadata": { "id": "2qJkqPKTnJR1" }, "source": [ "Note: A nossa comunidade TensorFlow traduziu estes documentos. Como as traduções da comunidade são *o melhor esforço*, não há garantias de que sejam uma reflexão exata e atualizada da [documentação oficial em Inglês](https://www.tensorflow.org/?hl=en). Se tem alguma sugestão para melhorar esta tradução, por favor envie um pull request para o repositório do GitHub [tensorflow/docs](https://github.com/tensorflow/docs). Para se voluntariar para escrever ou rever as traduções da comunidade, contacte a [lista docs@tensorflow.org](https://groups.google.com/a/tensorflow.org/forum/#!forum/docs)." ] }, { "cell_type": "markdown", "metadata": { "id": "Eg62Pmz3o83v" }, "source": [ "Este *notebook* classifica avaliações de filmes como **positiva** ou **negativa** usando o texto da avaliação. Isto é um exemplo de classificação *binária* —ou duas-classes—, um importante e bastante aplicado tipo de problema de aprendizado de máquina.\n", "\n", "Usaremos a base de dados [IMDB](https://www.tensorflow.org/api_docs/python/tf/keras/datasets/imdb) que contém avaliaçòes de mais de 50000 filmes da base de dados [Internet Movie Database](https://www.imdb.com/). A base é dividida em 25000 avaliações para treinamento e 25000 para teste. Os conjuntos de treinamentos e testes são *balanceados*, ou seja, eles possuem a mesma quantidade de avaliações positivas e negativas.\n", "\n", "O notebook utiliza [tf.keras](https://www.tensorflow.org/guide/keras), uma API alto-nível para construir e treinar modelos com TensorFlow. Para mais tutoriais avançados de classificação de textos usando `tf.keras`, veja em [MLCC Text Classification Guide](https://developers.google.com/machine-learning/guides/text-classification/)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:40:52.718112Z", "iopub.status.busy": "2021-08-13T19:40:52.717488Z", "iopub.status.idle": "2021-08-13T19:40:54.193802Z", "shell.execute_reply": "2021-08-13T19:40:54.194206Z" }, "id": "2ew7HTbPpCJH" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.6.0\n" ] } ], "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", "\n", "import numpy as np\n", "\n", "print(tf.__version__)" ] }, { "cell_type": "markdown", "metadata": { "id": "iAsKG535pHep" }, "source": [ "## Baixe a base de dados IMDB\n", "\n", "A base de dados vem empacotada com TensorFlow. Ela já vem pré-processada de forma que as avaliações (sequências de palavras) foram convertidas em sequências de inteiros, onde cada inteiro representa uma palavra específica no dicionário.\n", "\n", "O código abaixo baixa a base de dados IMDB para a sua máquina (ou usa a cópia em *cache*, caso já tenha baixado):\"" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:40:54.199032Z", "iopub.status.busy": "2021-08-13T19:40:54.198352Z", "iopub.status.idle": "2021-08-13T19:40:58.757118Z", "shell.execute_reply": "2021-08-13T19:40:58.757577Z" }, "id": "zXXx5Oc3pOmN" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " 16384/17464789 [..............................] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 4202496/17464789 [======>.......................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17465344/17464789 [==============================] - 0s 0us/step\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17473536/17464789 [==============================] - 0s 0us/step\n" ] } ], "source": [ "imdb = keras.datasets.imdb\n", "\n", "(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)" ] }, { "cell_type": "markdown", "metadata": { "id": "odr-KlzO-lkL" }, "source": [ "O argumento `num_words=10000` mantém as 10000 palavras mais frequentes no conjunto de treinamento. As palavras mais raras são descartadas para preservar o tamanho dos dados de forma maleável." ] }, { "cell_type": "markdown", "metadata": { "id": "l50X3GfjpU4r" }, "source": [ "## Explore os dados\n", "\n", "Vamos parar um momento para entender o formato dos dados. O conjunto de dados vem pré-processado: cada exemplo é um *array* de inteiros representando as palavras da avaliação do filme. Cada *label* é um inteiro com valor ou de 0 ou 1, onde 0 é uma avaliação negativa e 1 é uma avaliação positiva." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:40:58.762804Z", "iopub.status.busy": "2021-08-13T19:40:58.762166Z", "iopub.status.idle": "2021-08-13T19:40:58.764853Z", "shell.execute_reply": "2021-08-13T19:40:58.764376Z" }, "id": "y8qCnve_-lkO" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training entries: 25000, labels: 25000\n" ] } ], "source": [ "print(\"Training entries: {}, labels: {}\".format(len(train_data), len(train_labels)))" ] }, { "cell_type": "markdown", "metadata": { "id": "RnKvHWW4-lkW" }, "source": [ "O texto das avaliações foi convertido para inteiros, onde cada inteiro representa uma palavra específica no dicionário. Isso é como se parece a primeira revisão:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:40:58.769047Z", "iopub.status.busy": "2021-08-13T19:40:58.768474Z", "iopub.status.idle": "2021-08-13T19:40:58.770826Z", "shell.execute_reply": "2021-08-13T19:40:58.771185Z" }, "id": "QtTS4kpEpjbi" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]\n" ] } ], "source": [ "print(train_data[0])" ] }, { "cell_type": "markdown", "metadata": { "id": "hIE4l_72x7DP" }, "source": [ "As avaliações dos filmes têm tamanhos diferentes. O código abaixo mostra o número de palavras da primeira e segunda avaliação. Sabendo que o número de entradas da rede neural tem que ser o mesmo também, temos que resolver isto mais tarde." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:40:58.781106Z", "iopub.status.busy": "2021-08-13T19:40:58.780458Z", "iopub.status.idle": "2021-08-13T19:40:58.783233Z", "shell.execute_reply": "2021-08-13T19:40:58.783633Z" }, "id": "X-6Ii9Pfx6Nr" }, "outputs": [ { "data": { "text/plain": [ "(218, 189)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(train_data[0]), len(train_data[1])" ] }, { "cell_type": "markdown", "metadata": { "id": "4wJg2FiYpuoX" }, "source": [ "### Converta os inteiros de volta a palavras\n", "\n", "É útil saber como converter inteiros de volta a texto. Aqui, criaremos uma função de ajuda para consultar um objeto *dictionary* que contenha inteiros mapeados em strings:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:40:58.790170Z", "iopub.status.busy": "2021-08-13T19:40:58.789524Z", "iopub.status.idle": "2021-08-13T19:40:59.093871Z", "shell.execute_reply": "2021-08-13T19:40:59.094298Z" }, "id": "tr5s_1alpzop" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb_word_index.json\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " 16384/1641221 [..............................] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1646592/1641221 [==============================] - 0s 0us/step\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1654784/1641221 [==============================] - 0s 0us/step\n" ] } ], "source": [ "# Um dicionário mapeando palavras em índices inteiros\n", "word_index = imdb.get_word_index()\n", "\n", "# Os primeiros índices são reservados\n", "word_index = {k:(v+3) for k,v in word_index.items()}\n", "word_index[\"\"] = 0\n", "word_index[\"\"] = 1\n", "word_index[\"\"] = 2 # unknown\n", "word_index[\"\"] = 3\n", "\n", "reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])\n", "\n", "def decode_review(text):\n", " return ' '.join([reverse_word_index.get(i, '?') for i in text])" ] }, { "cell_type": "markdown", "metadata": { "id": "U3CNRvEZVppl" }, "source": [ "Agora, podemos usar a função `decode_review` para mostrar o texto da primeira avaliação:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:40:59.099978Z", "iopub.status.busy": "2021-08-13T19:40:59.099324Z", "iopub.status.idle": "2021-08-13T19:40:59.102440Z", "shell.execute_reply": "2021-08-13T19:40:59.101839Z" }, "id": "s_OqxmH6-lkn" }, "outputs": [ { "data": { "text/plain": [ "\" this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert is an amazing actor and now the same being director father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also to the two little boy's that played the of norman and paul they were just brilliant children are often left out of the list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all\"" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "decode_review(train_data[0])" ] }, { "cell_type": "markdown", "metadata": { "id": "lFP_XKVRp4_S" }, "source": [ "## Prepare os dados\n", "\n", "As avaliações —os *arrays* de inteiros— devem ser convertidas em tensores (*tensors*) antes de alimentar a rede neural. Essa conversão pode ser feita de duas formas:\n", "\n", "* Converter os arrays em vetores de 0s e 1s indicando a ocorrência da palavra, similar com one-hot encoding. Por exemplo, a sequência [3, 5] se tornaria um vetor de 10000 dimensões, onde todos seriam 0s, tirando 3 e 5, que são 1s. Depois, faça disso a primeira camada da nossa rede neural — a Dense layer — que pode trabalhar com dados em ponto flutuante. Essa abordagem é intensa em relação a memória, logo requer uma matriz de tamanho `num_words * num_reviews`.\n", "\n", "* Alternativamente, podemos preencher o array para que todos tenho o mesmo comprimento, e depois criar um tensor inteiro de formato `max_length * num_reviews`. Podemos usar uma camada *embedding* capaz de lidar com o formato como a primeira camada da nossa rede.\n", "\n", "Nesse tutorial, usaremos a segunda abordagem.\n", "\n", "Já que as avaliações dos filmes devem ter o mesmo tamanho, usaremos a função [pad_sequences](https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/sequence/pad_sequences) para padronizar os tamanhos:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:40:59.111637Z", "iopub.status.busy": "2021-08-13T19:40:59.111028Z", "iopub.status.idle": "2021-08-13T19:40:59.965934Z", "shell.execute_reply": "2021-08-13T19:40:59.966370Z" }, "id": "2jQv-omsHurp" }, "outputs": [], "source": [ "train_data = keras.preprocessing.sequence.pad_sequences(train_data,\n", " value=word_index[\"\"],\n", " padding='post',\n", " maxlen=256)\n", "\n", "test_data = keras.preprocessing.sequence.pad_sequences(test_data,\n", " value=word_index[\"\"],\n", " padding='post',\n", " maxlen=256)" ] }, { "cell_type": "markdown", "metadata": { "id": "VO5MBpyQdipD" }, "source": [ "Agora, vamos olhar o tamanho dos exemplos:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:40:59.971462Z", "iopub.status.busy": "2021-08-13T19:40:59.970860Z", "iopub.status.idle": "2021-08-13T19:40:59.973262Z", "shell.execute_reply": "2021-08-13T19:40:59.973580Z" }, "id": "USSSBnkE-lky" }, "outputs": [ { "data": { "text/plain": [ "(256, 256)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(train_data[0]), len(train_data[1])" ] }, { "cell_type": "markdown", "metadata": { "id": "QJoxZGyfjT5V" }, "source": [ "E inspecionar as primeiras avaliações (agora preenchidos):" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:40:59.977967Z", "iopub.status.busy": "2021-08-13T19:40:59.977339Z", "iopub.status.idle": "2021-08-13T19:40:59.979777Z", "shell.execute_reply": "2021-08-13T19:40:59.980151Z" }, "id": "TG8X9cqi-lk9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1 14 22 16 43 530 973 1622 1385 65 458 4468 66 3941\n", " 4 173 36 256 5 25 100 43 838 112 50 670 2 9\n", " 35 480 284 5 150 4 172 112 167 2 336 385 39 4\n", " 172 4536 1111 17 546 38 13 447 4 192 50 16 6 147\n", " 2025 19 14 22 4 1920 4613 469 4 22 71 87 12 16\n", " 43 530 38 76 15 13 1247 4 22 17 515 17 12 16\n", " 626 18 2 5 62 386 12 8 316 8 106 5 4 2223\n", " 5244 16 480 66 3785 33 4 130 12 16 38 619 5 25\n", " 124 51 36 135 48 25 1415 33 6 22 12 215 28 77\n", " 52 5 14 407 16 82 2 8 4 107 117 5952 15 256\n", " 4 2 7 3766 5 723 36 71 43 530 476 26 400 317\n", " 46 7 4 2 1029 13 104 88 4 381 15 297 98 32\n", " 2071 56 26 141 6 194 7486 18 4 226 22 21 134 476\n", " 26 480 5 144 30 5535 18 51 36 28 224 92 25 104\n", " 4 226 65 16 38 1334 88 12 16 283 5 16 4472 113\n", " 103 32 15 16 5345 19 178 32 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0]\n" ] } ], "source": [ "print(train_data[0])" ] }, { "cell_type": "markdown", "metadata": { "id": "LLC02j2g-llC" }, "source": [ "## Construindo o modelo\n", "\n", "A rede neural é criada por camadas empilhadas —isso necessita duas decisões arquiteturais principais:\n", "\n", "* Quantas camadas serão usadas no modelo?\n", "* Quantas *hidden units* são usadas em cada camada?\n", "\n", "Neste exemplo, os dados de entrada são um *array* de palavras-índices. As *labels* para predizer são ou 0 ou 1. Vamos construir um modelo para este problema:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:40:59.985033Z", "iopub.status.busy": "2021-08-13T19:40:59.984468Z", "iopub.status.idle": "2021-08-13T19:41:01.525301Z", "shell.execute_reply": "2021-08-13T19:41:01.524830Z" }, "id": "xpKOoWgu-llD" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2021-08-13 19:41:00.635586: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", "2021-08-13 19:41:00.642489: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", "2021-08-13 19:41:00.643426: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model: \"sequential\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "embedding (Embedding) (None, None, 16) 160000 \n", "_________________________________________________________________\n", "global_average_pooling1d (Gl (None, 16) 0 \n", "_________________________________________________________________\n", "dense (Dense) (None, 16) 272 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 1) 17 \n", "=================================================================\n", "Total params: 160,289\n", "Trainable params: 160,289\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2021-08-13 19:41:00.645808: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 AVX512F FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2021-08-13 19:41:00.646404: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", "2021-08-13 19:41:00.647430: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", "2021-08-13 19:41:00.648403: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", "2021-08-13 19:41:01.191573: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", "2021-08-13 19:41:01.192518: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", "2021-08-13 19:41:01.193438: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", "2021-08-13 19:41:01.194386: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 14648 MB memory: -> device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0\n" ] } ], "source": [ "# O formato de entrada é a contagem vocabulário usados pelas avaliações dos filmes (10000 palavras)\n", "vocab_size = 10000\n", "\n", "model = keras.Sequential()\n", "model.add(keras.layers.Embedding(vocab_size, 16))\n", "model.add(keras.layers.GlobalAveragePooling1D())\n", "model.add(keras.layers.Dense(16, activation='relu'))\n", "model.add(keras.layers.Dense(1, activation='sigmoid'))\n", "\n", "model.summary()" ] }, { "cell_type": "markdown", "metadata": { "id": "6PbKQ6mucuKL" }, "source": [ "As camadas são empilhadas sequencialmente para construir o classificador:\n", "\n", "1. A primeira camada é uma camada `Embedding` (*`Embedding` layer*). Essa camada pega o vocabulário em inteiros e olha o vetor *embedding* em cada palavra-index. Esses vetores são aprendidos pelo modelo, ao longo do treinamento. Os vetores adicionam a dimensão ao *array* de saída. As dimensões resultantes são: `(batch, sequence, embedding)`.\n", "2. Depois, uma camada `GlobalAveragePooling1D` retorna um vetor de saída com comprimento fixo para cada exemplo fazendo a média da sequência da dimensão. Isso permite o modelo de lidar com entradas de tamanhos diferentes da maneira mais simples possível.\n", "3. Esse vetor de saída com tamanho fixo passa por uma camada *fully-connected* (`Dense`) layer com 16 *hidden units*.\n", "4. A última camada é uma *densely connected* com um único nó de saída. Usando uma função de ativação `sigmoid`, esse valor é um float que varia entre 0 e 1, representando a probabilidade, ou nível de confiança." ] }, { "cell_type": "markdown", "metadata": { "id": "0XMwnDOp-llH" }, "source": [ "### Hidden units\n", "\n", "O modelo abaixo tem duas camadas intermediárias ou _\\\"hidden\\\"_ (hidden layers), entre a entrada e saída. O número de saídas (unidades— *units*—, nós ou neurônios) é a dimensão do espaço representacional para a camada. Em outras palavras, a quantidade de liberdade que a rede é permitida enquanto aprende uma representação interna.\n", "\n", "Se o modelo tem mais *hidden units* (um espaço representacional de maior dimensão), e/ou mais camadas, então a rede pode aprender representações mais complexas. Entretanto, isso faz com que a rede seja computacionalmente mais custosa e pode levar ao aprendizado de padrões não desejados— padrões que melhoram a performance com os dados de treinamento, mas não com os de teste. Isso se chama *overfitting*, e exploraremos mais tarde." ] }, { "cell_type": "markdown", "metadata": { "id": "L4EqVWg4-llM" }, "source": [ "### Função Loss e otimizadores (optimizer)\n", "\n", "O modelo precisa de uma função *loss* e um otimizador (*optimizer*) para treinamento. Já que é um problema de classificação binário e o modelo tem como saída uma probabilidade (uma única camada com ativação sigmoide), usaremos a função loss `binary_crossentropy`.\n", "\n", "Essa não é a única escolha de função loss, você poderia escolher, no lugar, a `mean_squared_error`. Mas, geralmente, `binary_crossentropy` é melhor para tratar probabilidades— ela mede a \\\"distância\\\" entre as distribuições de probabilidade, ou, no nosso caso, sobre a distribuição real e as previsões.\n", "\n", "Mais tarde, quando explorarmos problemas de regressão (como, predizer preço de uma casa), veremos como usar outra função loss chamada *mean squared error*.\n", "\n", "Agora, configure o modelo para usar o *optimizer* a função loss:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:41:01.533131Z", "iopub.status.busy": "2021-08-13T19:41:01.532489Z", "iopub.status.idle": "2021-08-13T19:41:01.537063Z", "shell.execute_reply": "2021-08-13T19:41:01.537469Z" }, "id": "Mr0GP-cQ-llN" }, "outputs": [], "source": [ "model.compile(optimizer='adam',\n", " loss='binary_crossentropy',\n", " metrics=['accuracy'])" ] }, { "cell_type": "markdown", "metadata": { "id": "hCWYwkug-llQ" }, "source": [ "## Crie um conjunto de validação\n", "\n", "Quando treinamos. queremos checar a acurácia do modelo com os dados que ele nunca viu. Crie uma conjunto de *validação* tirando 10000 exemplos do conjunto de treinamento original. (Por que não usar o de teste agora? Nosso objetivo é desenvolver e melhorar (tunar) nosso modelo usando somente os dados de treinamento, depois de usar o teste uma única vez para avaliar a previsão)." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:41:01.542120Z", "iopub.status.busy": "2021-08-13T19:41:01.541519Z", "iopub.status.idle": "2021-08-13T19:41:01.543323Z", "shell.execute_reply": "2021-08-13T19:41:01.543667Z" }, "id": "-NpcXY9--llS" }, "outputs": [], "source": [ "x_val = train_data[:10000]\n", "partial_x_train = train_data[10000:]\n", "\n", "y_val = train_labels[:10000]\n", "partial_y_train = train_labels[10000:]" ] }, { "cell_type": "markdown", "metadata": { "id": "35jv_fzP-llU" }, "source": [ "## Treine o modelo\n", "\n", "Treine o modelo em 40 *epochs* com *mini-batches* de 512 exemplos. Essas 40 iterações sobre todos os exemplos nos tensores `x_train` e `y_train`. Enquanto treina, monitore os valores do loss e da acurácia do modelo nos 10000 exemplos do conjunto de validação:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:41:01.548262Z", "iopub.status.busy": "2021-08-13T19:41:01.547617Z", "iopub.status.idle": "2021-08-13T19:41:08.684647Z", "shell.execute_reply": "2021-08-13T19:41:08.684071Z" }, "id": "tXSGrjWZ-llW" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2021-08-13 19:41:01.957999: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:185] None of the MLIR Optimization Passes are enabled (registered 2)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/40\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " 1/30 [>.............................] - ETA: 26s - loss: 0.6933 - accuracy: 0.4902" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.6926 - accuracy: 0.5393 " ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 1s 9ms/step - loss: 0.6921 - accuracy: 0.5348 - val_loss: 0.6907 - val_accuracy: 0.5012\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.6896 - accuracy: 0.5410" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.6888 - accuracy: 0.5245" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 4ms/step - loss: 0.6879 - accuracy: 0.5522 - val_loss: 0.6852 - val_accuracy: 0.6461\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.6832 - accuracy: 0.6797" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.6819 - accuracy: 0.6115" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.6796 - accuracy: 0.6538 - val_loss: 0.6751 - val_accuracy: 0.7048\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 4/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.6707 - accuracy: 0.7793" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.6683 - accuracy: 0.7131" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.6650 - accuracy: 0.7141 - val_loss: 0.6584 - val_accuracy: 0.7496\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 5/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.6561 - accuracy: 0.7695" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.6481 - accuracy: 0.7715" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.6428 - accuracy: 0.7672 - val_loss: 0.6353 - val_accuracy: 0.7492\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 6/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.6290 - accuracy: 0.7656" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.6207 - accuracy: 0.7829" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.6135 - accuracy: 0.7903 - val_loss: 0.6051 - val_accuracy: 0.7895\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 7/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.5981 - accuracy: 0.7988" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.5852 - accuracy: 0.8084" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.5778 - accuracy: 0.8115 - val_loss: 0.5698 - val_accuracy: 0.8056\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 8/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.5518 - accuracy: 0.8496" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.5437 - accuracy: 0.8326" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.5373 - accuracy: 0.8313 - val_loss: 0.5321 - val_accuracy: 0.8194\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 9/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.5062 - accuracy: 0.8633" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.5027 - accuracy: 0.8451" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.4955 - accuracy: 0.8467 - val_loss: 0.4950 - val_accuracy: 0.8287\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 10/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.4648 - accuracy: 0.8613" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.4640 - accuracy: 0.8542" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.4555 - accuracy: 0.8583 - val_loss: 0.4617 - val_accuracy: 0.8392\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 11/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.4382 - accuracy: 0.8652" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.4271 - accuracy: 0.8655" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.4193 - accuracy: 0.8679 - val_loss: 0.4323 - val_accuracy: 0.8469\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 12/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.4008 - accuracy: 0.8633" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.3963 - accuracy: 0.8742" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.3877 - accuracy: 0.8761 - val_loss: 0.4063 - val_accuracy: 0.8535\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 13/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.3862 - accuracy: 0.8633" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.3664 - accuracy: 0.8834" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.3598 - accuracy: 0.8854 - val_loss: 0.3852 - val_accuracy: 0.8599\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 14/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.3388 - accuracy: 0.8926" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.3390 - accuracy: 0.8901" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.3364 - accuracy: 0.8894 - val_loss: 0.3676 - val_accuracy: 0.8633\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 15/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.3259 - accuracy: 0.8789" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.3201 - accuracy: 0.8915" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.3154 - accuracy: 0.8961 - val_loss: 0.3534 - val_accuracy: 0.8675\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 16/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.3031 - accuracy: 0.9102" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.2994 - accuracy: 0.9013" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.2978 - accuracy: 0.9004 - val_loss: 0.3420 - val_accuracy: 0.8688\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 17/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.3040 - accuracy: 0.8965" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.2837 - accuracy: 0.9030" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.2819 - accuracy: 0.9039 - val_loss: 0.3315 - val_accuracy: 0.8731\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 18/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.2541 - accuracy: 0.9238" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.2665 - accuracy: 0.9090" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.2684 - accuracy: 0.9079 - val_loss: 0.3228 - val_accuracy: 0.8748\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 19/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.2770 - accuracy: 0.8906" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.2533 - accuracy: 0.9158" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.2550 - accuracy: 0.9127 - val_loss: 0.3165 - val_accuracy: 0.8764\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 20/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.2578 - accuracy: 0.9102" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.2445 - accuracy: 0.9190" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.2435 - accuracy: 0.9178 - val_loss: 0.3099 - val_accuracy: 0.8785\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 21/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.2472 - accuracy: 0.9141" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "16/30 [===============>..............] - ETA: 0s - loss: 0.2356 - accuracy: 0.9209" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.2327 - accuracy: 0.9205 - val_loss: 0.3058 - val_accuracy: 0.8784\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 22/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.2630 - accuracy: 0.9121" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.2251 - accuracy: 0.9221" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.2228 - accuracy: 0.9249 - val_loss: 0.3006 - val_accuracy: 0.8816\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 23/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.2254 - accuracy: 0.9121" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.2142 - accuracy: 0.9293" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.2138 - accuracy: 0.9278 - val_loss: 0.2971 - val_accuracy: 0.8821\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 24/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.2240 - accuracy: 0.9199" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.2078 - accuracy: 0.9292" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.2053 - accuracy: 0.9297 - val_loss: 0.2949 - val_accuracy: 0.8816\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 25/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.2098 - accuracy: 0.9199" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.1971 - accuracy: 0.9346" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1972 - accuracy: 0.9341 - val_loss: 0.2917 - val_accuracy: 0.8831\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 26/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.2034 - accuracy: 0.9375" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.1889 - accuracy: 0.9378" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1899 - accuracy: 0.9374 - val_loss: 0.2904 - val_accuracy: 0.8833\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 27/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.2099 - accuracy: 0.9258" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.1847 - accuracy: 0.9398" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1828 - accuracy: 0.9401 - val_loss: 0.2890 - val_accuracy: 0.8841\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 28/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1794 - accuracy: 0.9453" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.1789 - accuracy: 0.9427" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1761 - accuracy: 0.9437 - val_loss: 0.2880 - val_accuracy: 0.8848\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 29/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1687 - accuracy: 0.9336" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.1705 - accuracy: 0.9445" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1699 - accuracy: 0.9450 - val_loss: 0.2866 - val_accuracy: 0.8841\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 30/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1446 - accuracy: 0.9590" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.1654 - accuracy: 0.9474" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1638 - accuracy: 0.9485 - val_loss: 0.2862 - val_accuracy: 0.8841\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 31/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1822 - accuracy: 0.9316" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.1599 - accuracy: 0.9505" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1579 - accuracy: 0.9503 - val_loss: 0.2857 - val_accuracy: 0.8859\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 32/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1577 - accuracy: 0.9512" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.1552 - accuracy: 0.9517" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1526 - accuracy: 0.9533 - val_loss: 0.2859 - val_accuracy: 0.8855\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 33/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1418 - accuracy: 0.9590" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.1482 - accuracy: 0.9553" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1469 - accuracy: 0.9550 - val_loss: 0.2870 - val_accuracy: 0.8865\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 34/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1628 - accuracy: 0.9531" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.1438 - accuracy: 0.9556" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1419 - accuracy: 0.9573 - val_loss: 0.2878 - val_accuracy: 0.8851\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 35/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1497 - accuracy: 0.9609" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "17/30 [================>.............] - ETA: 0s - loss: 0.1409 - accuracy: 0.9588" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1374 - accuracy: 0.9590 - val_loss: 0.2901 - val_accuracy: 0.8838\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 36/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1151 - accuracy: 0.9727" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.1350 - accuracy: 0.9604" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1328 - accuracy: 0.9604 - val_loss: 0.2895 - val_accuracy: 0.8853\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 37/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1255 - accuracy: 0.9648" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.1319 - accuracy: 0.9623" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1287 - accuracy: 0.9629 - val_loss: 0.2902 - val_accuracy: 0.8861\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 38/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1351 - accuracy: 0.9531" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.1234 - accuracy: 0.9651" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1239 - accuracy: 0.9643 - val_loss: 0.2925 - val_accuracy: 0.8843\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 39/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1040 - accuracy: 0.9688" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.1218 - accuracy: 0.9646" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1197 - accuracy: 0.9663 - val_loss: 0.2941 - val_accuracy: 0.8851\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 40/40\n", "\r", " 1/30 [>.............................] - ETA: 0s - loss: 0.1375 - accuracy: 0.9668" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "18/30 [=================>............] - ETA: 0s - loss: 0.1132 - accuracy: 0.9694" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "30/30 [==============================] - 0s 5ms/step - loss: 0.1157 - accuracy: 0.9679 - val_loss: 0.2952 - val_accuracy: 0.8844\n" ] } ], "source": [ "history = model.fit(partial_x_train,\n", " partial_y_train,\n", " epochs=40,\n", " batch_size=512,\n", " validation_data=(x_val, y_val),\n", " verbose=1)" ] }, { "cell_type": "markdown", "metadata": { "id": "9EEGuDVuzb5r" }, "source": [ "## Avalie o modelo\n", "\n", "E vamos ver como o modelo se saiu. Dois valores serão retornados. Loss (um número que representa o nosso erro, valores mais baixos são melhores), e acurácia." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:41:08.689609Z", "iopub.status.busy": "2021-08-13T19:41:08.688949Z", "iopub.status.idle": "2021-08-13T19:41:09.655589Z", "shell.execute_reply": "2021-08-13T19:41:09.655116Z" }, "id": "zOMKywn4zReN" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "782/782 - 1s - loss: 0.3137 - accuracy: 0.8739\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[0.3136511445045471, 0.8739200234413147]\n" ] } ], "source": [ "results = model.evaluate(test_data, test_labels, verbose=2)\n", "\n", "print(results)" ] }, { "cell_type": "markdown", "metadata": { "id": "z1iEXVTR0Z2t" }, "source": [ "Esta é uma abordagem ingênua que conseguiu uma acurácia de 87%. Com abordagens mais avançadas, o modelo deve chegar em 95%." ] }, { "cell_type": "markdown", "metadata": { "id": "5KggXVeL-llZ" }, "source": [ "## Crie um gráfico de acurácia e loss por tempo\n", "\n", "`model.fit()` retorna um objeto `History` que contém um dicionário de tudo o que aconteceu durante o treinamento:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:41:09.660870Z", "iopub.status.busy": "2021-08-13T19:41:09.660282Z", "iopub.status.idle": "2021-08-13T19:41:09.663429Z", "shell.execute_reply": "2021-08-13T19:41:09.662979Z" }, "id": "VcvSXvhp-llb" }, "outputs": [ { "data": { "text/plain": [ "dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "history_dict = history.history\n", "history_dict.keys()" ] }, { "cell_type": "markdown", "metadata": { "id": "nRKsqL40-lle" }, "source": [ "Tem 4 entradas: uma para cada métrica monitorada durante a validação e treinamento. Podemos usá-las para plotar a comparação do loss de treinamento e validação, assim como a acurácia de treinamento e validação:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:41:09.669522Z", "iopub.status.busy": "2021-08-13T19:41:09.668913Z", "iopub.status.idle": "2021-08-13T19:41:10.560342Z", "shell.execute_reply": "2021-08-13T19:41:10.560736Z" }, "id": "nGoYf2Js-lle" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "acc = history_dict['accuracy']\n", "val_acc = history_dict['val_accuracy']\n", "loss = history_dict['loss']\n", "val_loss = history_dict['val_loss']\n", "\n", "epochs = range(1, len(acc) + 1)\n", "\n", "# \"bo\" is for \"blue dot\"\n", "plt.plot(epochs, loss, 'bo', label='Training loss')\n", "# b is for \"solid blue line\"\n", "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n", "plt.title('Training and validation loss')\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Loss')\n", "plt.legend()\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2021-08-13T19:41:10.583771Z", "iopub.status.busy": "2021-08-13T19:41:10.578319Z", "iopub.status.idle": "2021-08-13T19:41:10.714304Z", "shell.execute_reply": "2021-08-13T19:41:10.714697Z" }, "id": "6hXx-xOv-llh" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAvPklEQVR4nO3deXyU9bn//9dFBEIEQdlEggl6RFwoqygudameUmmlWDmCtBW1ckR7bP1208Opcmz5ddGqtVV7sK0r7qemWLG2btVWTwVbsYBiEYIsAiEq+871++NzTzIZZiZDkslMZt7Px+N+zL3NzJU7yX3dn+X+3ObuiIhI8WqX6wBERCS3lAhERIqcEoGISJFTIhARKXJKBCIiRU6JQESkyCkRyD7M7Bkzu7il980lM6s2s7Oz8LluZv8Szf/CzL6byb5N+J5JZvaHpsYpko7pPoLCYGab4xbLgB3Anmj53919VutHlT/MrBr4irs/18Kf68BR7r6kpfY1s0pgGdDe3Xe3SKAiaRyQ6wCkZbh759h8upOemR2gk4vkC/095gdVDRU4MzvDzFaa2XfMbA1wj5kdbGa/M7MaM/somi+Pe89LZvaVaH6ymf3ZzG6O9l1mZp9p4r79zexlM9tkZs+Z2R1m9mCKuDOJ8Xtm9pfo8/5gZj3itn/JzJabWa2ZTUtzfE40szVmVhK3bpyZvRXNjzSz18zsYzP7wMx+bmYdUnzWvWb2/bjlb0XvWW1mlybsO8bM/m5mG81shZlNj9v8cvT6sZltNrNRsWMb9/6TzWyumW2IXk/O9Njs53E+xMzuiX6Gj8ysKm7bWDN7M/oZ3jOz0dH6BtVwZjY99ns2s8qoiuwyM3sfeCFa/3j0e9gQ/Y0cF/f+Tmb2k+j3uSH6G+tkZk+b2X8k/Dxvmdm4ZD+rpKZEUBwOBQ4BKoAphN/7PdHy4cA24Odp3n8isBjoAfwY+JWZWRP2fQh4HegOTAe+lOY7M4nxIuASoBfQAfgmgJkdC9wVff5h0feVk4S7/xXYApyV8LkPRfN7gGuin2cU8CngyjRxE8UwOornHOAoILF9YgvwZaAbMAaYamafj7Z9Mnrt5u6d3f21hM8+BHgauD362W4Bnjaz7gk/wz7HJonGjvMDhKrG46LPujWKYSRwP/Ct6Gf4JFCd4juSOR04Bvh0tPwM4Tj1Av4GxFdl3gwMB04m/B1/G9gL3Ad8MbaTmQ0G+hKOjewPd9dUYBPhH/LsaP4MYCdQmmb/IcBHccsvEaqWACYDS+K2lQEOHLo/+xJOMruBsrjtDwIPZvgzJYvxv+KWrwR+H81fDzwSt+3A6BicneKzvw/8OprvQjhJV6TY9+vAk3HLDvxLNH8v8P1o/tfAD+P2GxC/b5LPvQ24NZqvjPY9IG77ZODP0fyXgNcT3v8aMLmxY7M/xxnoQzjhHpxkv/+JxZvu7y9anh77Pcf9bEekiaFbtE9XQqLaBgxOsl8p8BGh3QVCwrgzG/9ThT6pRFAcatx9e2zBzMrM7H+iovZGQlVEt/jqkQRrYjPuvjWa7byf+x4GfBi3DmBFqoAzjHFN3PzWuJgOi/9sd98C1Kb6LsLV//lm1hE4H/ibuy+P4hgQVZesieL4/wilg8Y0iAFYnvDznWhmL0ZVMhuAKzL83NhnL09Yt5xwNRyT6tg00Mhx7kf4nX2U5K39gPcyjDeZumNjZiVm9sOoemkj9SWLHtFUmuy7or/pR4Evmlk7YCKhBCP7SYmgOCR2DfsGcDRworsfRH1VRKrqnpbwAXCImZXFreuXZv/mxPhB/GdH39k91c7uvohwIv0MDauFIFQxvUO46jwI+M+mxEAoEcV7CJgN9HP3rsAv4j63sa58qwlVOfEOB1ZlEFeidMd5BeF31i3J+1YAR6b4zC2E0mDMoUn2if8ZLwLGEqrPuhJKDbEY1gPb03zXfcAkQpXdVk+oRpPMKBEUpy6E4vbHUX3zDdn+wugKex4w3cw6mNko4HNZivEJ4LNmdmrUsHsjjf+tPwR8jXAifDwhjo3AZjMbCEzNMIbHgMlmdmyUiBLj70K42t4e1bdfFLethlAlc0SKz54DDDCzi8zsADO7EDgW+F2GsSXGkfQ4u/sHhLr7O6NG5fZmFksUvwIuMbNPmVk7M+sbHR+AN4EJ0f4jgAsyiGEHodRWRih1xWLYS6hmu8XMDotKD6Oi0hvRiX8v8BNUGmgyJYLidBvQiXC19X/A71vpeycRGlxrCfXyjxJOAMncRhNjdPeFwFWEk/sHhHrklY287WFCA+YL7r4+bv03CSfpTcDdUcyZxPBM9DO8ACyJXuNdCdxoZpsIbRqPxb13KzAD+IuF3konJXx2LfBZwtV8LaHx9LMJcWfqNtIf5y8BuwilonWENhLc/XVCY/StwAbgT9SXUr5LuIL/CPhvGpawkrmfUCJbBSyK4oj3TeAfwFzgQ+BHNDx33Q8MIrQ5SRPohjLJGTN7FHjH3bNeIpHCZWZfBqa4+6m5jqWtUolAWo2ZnWBmR0ZVCaMJ9cJVOQ5L2rCo2u1KYGauY2nLlAikNR1K6Nq4mdAHfqq7/z2nEUmbZWafJrSnrKXx6idJQ1VDIiJFTiUCEZEi1+YGnevRo4dXVlbmOgwRkTbljTfeWO/uPZNta3OJoLKyknnz5uU6DBGRNsXMEu9Gr6OqIRGRIqdEICJS5JQIRESKXJtrI0hm165drFy5ku3btze+s+REaWkp5eXltG/fPtehiEiCgkgEK1eupEuXLlRWVpL6eSmSK+5ObW0tK1eupH///rkOR0QSFETV0Pbt2+nevbuSQJ4yM7p3764Sm0gTzZoFlZXQrl14nTWrsXfsn4JIBICSQJ7T70cktXQn+lmzYMoUWL4c3MPrlCktmwwKJhGIiORKY1fszTnRT5sGW7c2/LytW8P6lqJE0AJqa2sZMmQIQ4YM4dBDD6Vv3751yzt37kz73nnz5nH11Vc3+h0nn3xyS4UrIvupOSfy5p7o338/eUyp1jdJrh+avL/T8OHDPdGiRYv2WZfOgw+6V1S4m4XXBx/cr7endcMNN/hNN93UYN2uXbta7gvasP39PYm0plTnhQcfdC8rcw+n8TCVldVvr6houC02VVRktt0s+XazzN6fKWCe6+H1QWvUtwFMnjyZK664ghNPPJFvf/vbvP7664waNYqhQ4dy8skns3jxYgBeeuklPvvZzwIwffp0Lr30Us444wyOOOIIbr/99rrP69y5c93+Z5xxBhdccAEDBw5k0qRJeDSC7Jw5cxg4cCDDhw/n6quvrvvceNXV1Zx22mkMGzaMYcOG8eqrr9Zt+9GPfsSgQYMYPHgw1157LQBLlizh7LPPZvDgwQwbNoz33mvO88pFcqepV/XNvWJvbPvhiU+zpuH6GTOgrKzhtrKysL7FpMoQ+To1t0TQUtk1lViJ4OKLL/YxY8b47t273d19w4YNdSWDP/7xj37++ee7u/uLL77oY8aMqXvvqFGjfPv27V5TU+OHHHKI79y5093dDzzwwLr9DzroIF+xYoXv2bPHTzrpJH/llVd827ZtXl5e7kuXLnV39wkTJtR9brwtW7b4tm3b3N393Xff9djxnDNnjo8aNcq3bNni7u61tbXu7j5y5Ej/zW9+4+7u27Ztq9veFCoRSHM0VpJPt705V/XNvWJvbHtjsWXys2cClQjqtUp9W2T8+PGUlJQAsGHDBsaPH8/xxx/PNddcw8KFC5O+Z8yYMXTs2JEePXrQq1cv1q5du88+I0eOpLy8nHbt2jFkyBCqq6t55513OOKII+r66U+cODHp5+/atYvLL7+cQYMGMX78eBYtWgTAc889xyWXXEJZdOlxyCGHsGnTJlatWsW4ceOAcFNYWeKliUgryGU9fHOv2BvbPmkSzJwJFRVgFl5nzgzrYyZNgupq2Ls3vMZvawlFlwga+6W2pAMPPLBu/rvf/S5nnnkmCxYs4KmnnkrZp75jx4518yUlJezevbtJ+6Ry66230rt3b+bPn8+8efMabcwWaUmNVc+k2tbYiby51TfpzgvNPZHnw4m+MUWXCFqlvi2JDRs20LdvXwDuvffeFv/8o48+mqVLl1JdXQ3Ao48+mjKOPn360K5dOx544AH27NkDwDnnnMM999zD1ui/6cMPP6RLly6Ul5dTVVUFwI4dO+q2i+yvdFftjV3R57IeviVO5Lk+0Tem6BJBJr/UbPj2t7/Nddddx9ChQ/frCj5TnTp14s4772T06NEMHz6cLl260LVr1332u/LKK7nvvvsYPHgw77zzTl2pZfTo0Zx33nmMGDGCIUOGcPPNNwPwwAMPcPvtt/OJT3yCk08+mTVr1rR47NJ2NKe/fLqr9sau6Bs7kTe3+iaTq/p8PpE3W6rGg3ydWqL7aKHatGmTu7vv3bvXp06d6rfcckuOI2pIv6e2rbFGzca2p2t0baxBtrnfHdsnW93G2wLSNBbn/MS+v5MSQWq33HKLDx482I855hi/6KKLmtXDJxv0e8p/6U6Wze0dk257Jr35mtNrSJQIJE/o95R7zeli2dhVe3Ou6jO5opfmSZcIiq6NQKRYNbeLZXPr6dPVw+eq7U4CJQKRApOqwba5XSyb218e0je6FnyDbB5TIhBpY5o6VEJzu1i2RH95yVOp6ozydVIbQdul31NmsjVUQksMdSBtF2ojyK4zzzyTZ599tsG62267jalTp6Z8zxlnnMG8efMAOPfcc/n444/32Wf69Ol1/flTqaqqqhsmAuD666/nueee24/opbVlc2z6dFf9LTHUgRQmJYIWMHHiRB555JEG6x555JGU4/0kmjNnDt26dWvSdycmghtvvJGzzz67SZ8l2ZftsenTVe+0haEOJDeUCFrABRdcwNNPP103bk91dTWrV6/mtNNOY+rUqYwYMYLjjjuOG264Ien7KysrWb9+PQAzZsxgwIABnHrqqXVDVQPcfffdnHDCCQwePJgvfOELbN26lVdffZXZs2fzrW99iyFDhvDee+8xefJknnjiCQCef/55hg4dyqBBg7j00kvZsWNH3ffdcMMNDBs2jEGDBvHOO+/sE5OGq2665oyZk+0hi3Wil6RS1Rnl69RYG8HXvuZ++uktO33ta43Xv40ZM8arqqrc3f0HP/iBf+Mb33D3+uGcd+/e7aeffrrPnz/f3d1PP/10nzt3rru7V1RUeE1Njc+bN8+PP/5437Jli2/YsMGPPPLIuofcrF+/vu67pk2b5rfffru7u1988cX++OOP122LLceGpV68eLG7u3/pS1/yW2+9te77Yu+/4447/LLLLtvn58nGcNWF1EbQ1IeYNHdIY91BK02F2giyL756KL5a6LHHHmPYsGEMHTqUhQsXNqjGSfTKK68wbtw4ysrKOOiggzjvvPPqti1YsIDTTjuNQYMGMWvWrJTDWMcsXryY/v37M2DAAAAuvvhiXn755brt559/PgDDhw+vG6gunoarTq05DzHJ9pg4sX101S/744BcB9DSbrstN987duxYrrnmGv72t7+xdetWhg8fzrJly7j55puZO3cuBx98MJMnT045/HRjJk+eTFVVFYMHD+bee+/lpZdeala8saGsUw1jHT9c9d69eyktLW3W9xWSdCf7TPriT5nS8P2JJ/rYd8TGwo+NgBkTuwFLpKWoRNBCOnfuzJlnnsmll15aVxrYuHEjBx54IF27dmXt2rU888wzaT/jk5/8JFVVVWzbto1Nmzbx1FNP1W3btGkTffr0YdeuXcyKq3Tu0qULmzZt2uezjj76aKqrq1myZAkQRhE9/fTTM/55in246nT1/M15iImu6CUfKRG0oIkTJzJ//vy6RDB48GCGDh3KwIEDueiiizjllFPSvn/YsGFceOGFDB48mM985jOccMIJddu+973vceKJJ3LKKacwcODAuvUTJkzgpptuYujQoQ0aaEtLS7nnnnsYP348gwYNol27dlxxxRUZ/yzFPFx1Yz17mvMQE9CJXvJQqsaDfJ10Q1nblU+/p+aMspnJkMhqrJV8gxqLpdg056atxur5i/4hJlJwlAik4GR7lE3QyV4KS1YTgZmNNrPFZrbEzK5Nsr3CzJ43s7fM7CUzK2/qd4WSj+Srlv79ZPOmrVw911okV7KWCMysBLgD+AxwLDDRzI5N2O1m4H53/wRwI/CDpnxXaWkptbW1SgZ5yt2pra1tsS6oza3aaYmePSKFxLJ18jSzUcB0d/90tHwdgLv/IG6fhcBod19hZgZscPeD0n3uiBEjPDZYW8yuXbtYuXJlk/voS/aVlpZSXl5O+/btM35P7AatxP70lZXh5J+ooiJU0zS2PZZIEvvy62QvhczM3nD3Ecm2ZfOGsr7AirjllcCJCfvMB84HfgqMA7qYWXd3r43fycymAFMADk9yOde+fXv69+/fcpFLziWerGNX/dA6N22JFJNcNxZ/EzjdzP4OnA6sAvYk7uTuM919hLuP6NmzZ2vHKFnS1Hp+3bQl0rKyWSJYBfSLWy6P1tVx99WEEgFm1hn4grt/nMWYJE+ku+KfNCn9Vf8DD6S/4o99hk7uIpnJZolgLnCUmfU3sw7ABGB2/A5m1sPMYjFcB/w6i/FIK2tOz57mjqsvIpnLWiJw993AV4FngbeBx9x9oZndaGaxYTXPABab2btAb0Ad9ApEc3v2aFx9aYrdu8Mk+ydrvYayJVmvIck/ze3ZA6l7DUl2ucO2baGEFntNnIeQmMvKoFOnfecPSFPpvGcP1NTABx8kn2proaQEOnSA9u33fQXYtAk2btx32rYtbO/WDbp3hx49kr8ecsi+U+fOoYTpHj6/pqZ+Wr8+vNbWwubNsGVLmOLnt2wJ7z30UOjTJ/nUqVPD/RM/o6Rk32Mav3zYYdC1a9N+r+l6DSkRSFa0axf+KRKZhat4deEM9u6FnTthx459JzPo2DGcADt2bDiZhX3iT1bxU20t7NoVTrp79oTviZ/fvTv5iWzLlvA7ae3Tghn06hVOlj16hBh37QrHJvEV4KCDGk5dutTP79kTfv7a2nACj5/fsiV1DAccEE6ymzbVf0+ijh1DwjjwwPrX+AlgzZr6pLZ5c8sepzvvhDSPQk8rV91HpcClu2I//PDkV/zxPXugOK74d+2Cf/4T/vEPWLCg/vX998O2pmjfPvV7S0rCFW7HjiEhl5SEKX6+pCScuA46KJx8E09sZWX1r8muTiF1aWHr1nAyTsUsnOzjr5R79Upfimgp27fDhx+mnj7+OCSVnj33nXr0CMfELPPv27y5YWln+/Z9k0f8tHdvw+OZeIyHDcvOcVGJQJqksSv6Qrridw9XkytWhOn998Pr6tXhH9csTO3aNXzdtg0WLYJ33qm/wiwpgQEDYNAg6N8/nFSTXfF37Bi+N1VpYceOcMLq0WPfE1a3biEGkXiqGpIWVwh1/Js3w9q1sG5dmOLnY8urVoWTfuJN6x06hPra9u3DCXvv3n1fO3SAY46B448PJ/7jj4eBA8NJXqS1KRFIi2usDSDXtm+HefNg4cJQZ7tmTTixx7+meoha166hqqJXL+jbNySxfv0aTj176qpb2ha1EUiTNKcNoLXV1sKrr8Kf/wx/+QvMnduwwa97d+jdO/ToOOmk+vlevcJ87LVnT12xS/FRIpCkGrvzt7HxfFrK3r2wYUPqxr333w8n/rffDvu3bw/Dh8PVV8Opp4bGtd69QzWNiCSnqiFJKldtAGvWwGuvhZP7q6/CG2+k7soHoXfMSSfBKaeEE/8JJ9T3ahGRemojkP3WGm0AO3eGXjX/93/1J/6lS8O2jh1hxIhwki8vT34D0MEH199gJCLpqY1AUkp1Vd/SbQDr18P8+WF6883w+vbb9X3he/cOV/VXXQUnnwxDh6quXqS1KBEUsXTtAM1tA9i+HZ55Bh55JDTgrl5dv+2ww2DwYDj33PA6cmToU78/N+qISMtRIihi6UYAjbUD7E8bwO7d8Pzz8PDD8OSTYeyXXr3gnHPCFf7gwWHSIyVE8ovaCIpYS7QD7N0b6vYffhgefzyMc9O1K5x/PkycCGee2TpDB4hIemojkKSa0w6wcGGoWpo1K5QYOnWCz30unPxHj4YWek69iLQC3RtZ4NI9HKaxMf8TrV4NP/lJqOY5/nj48Y/huOPCE8PWroVHH4XPf15JQKStUYmggDV2U1gmI4Bu3gxPPBE+6/nnQ1XSyJHw05/ChReG3j4i0rapjaCAZXJTWCqLF4exz++9NzT6HnlkffIYMCALwYpIVqmNoEg19jjIRLt3w+9+B3fcAc89F27WGj8+PAjjlFPUvVOkUCkRFLBMG4PXrYNf/hJ+8Ysw5HJ5OXz/+/CVr6jqR6QYqLG4gDXWGLxxI3znOyExTJsWqnx+8xtYtiwsKwmIFAclgjYuXa+gSZPCE8EqKkK1TkVFWJ4wAe6+G446KvT8mTAhDPfw3HMwbpz6/YsUG/3Lt2GN9QqKvcb3AnrxxTA081tvhdE6n346DO4mIsVLJYI2LN0QEYmWLAlX+2edFcb3f+wxePllJQERUSJo0zLpFVRTA9/4Bhx7bKj6+cEPwsPUx49XLyARCVQ11Ial6xVUWws33ww/+xls2waTJ4dG4kMPbfUwRSTPqUTQhiXrFdSpUxjhs7ISfvQjOO+8MC7Qr36lJCAiySkRtGHxvYIgjPrpDrNnh7H+//EPeOghGDgwt3GKSH5TImjjJkwId/4edFBoBB4zJvQIevTRMCCciEhjlAjyXLr7BNasgX/9V7j2Wjj99PAIyCeegEGDchSsiLRJaizOY+nuE+jTBy66KJQCfvUruOQS9QISkaZRIshjqe4TuOqqMDzE0UfDH/+oEoCINI+qhvJYqvsENmyAL34R5s5VEhCR5lMiyGOpHhnZvTvcdx907ty68YhIYcpqIjCz0Wa22MyWmNm1SbYfbmYvmtnfzewtMzs3m/G0NTNmhPsC4pWWhqeDqT1ARFpK1hKBmZUAdwCfAY4FJprZsQm7/RfwmLsPBSYAd2Yrnrbo3/4tPBYypl+/8NyA+EHkRESaK5slgpHAEndf6u47gUeAsQn7OHBQNN8VWJ3FeNqUjRvhc5+DP/0J/uu/YO/e0GagJCAiLS2bvYb6AivillcCJybsMx34g5n9B3AgcHayDzKzKcAUgMNTVZwXkFWrwo1hCxaEEsBll+U6IhEpZLluLJ4I3Ovu5cC5wANmtk9M7j7T3Ue4+4iePXu2epDZlHjD2A9/CCedBO+9F54VoCQgItmWzRLBKqBf3HJ5tC7eZcBoAHd/zcxKgR7AuizGlTeS3TB23XVw8MHwyiswZEhOwxORIpHNEsFc4Cgz629mHQiNwbMT9nkf+BSAmR0DlAI1WYwpryS7YQzCiKJKAiLSWrKWCNx9N/BV4FngbULvoIVmdqOZnRft9g3gcjObDzwMTHZ3z1ZM+SbVDWOr1WQuIq0oq0NMuPscYE7Cuuvj5hcBp2QzhnyW7sEyIiKtJdeNxUVtxgzo2LHhurKysF5EpLUoEeTQpEnQvz+UlITliorwoBndKyAiranRRGBmn0vWpVOab+7c8CD5H/84PFmsulpJQERaXyYn+AuBf5rZj81MDz1sQTfdFB4vefnluY5ERIpZo4nA3b8IDAXeA+41s9fMbIqZdcl6dAVs6VL43/+FK66ALjqSIpJDGVX5uPtG4AnCeEF9gHHA36KhIaQRyR43ecstoW3g6qtzHZ2IFLtGu49Gff4vAf4FuB8Y6e7rzKwMWAT8LLshtm3J7h6+/HLYsyc8XOaww3Ibn4hIJvcRfAG41d1fjl/p7lvNTCPhNCLZ3cPbtoXXb36z9eMREUmUSSKYDnwQWzCzTkBvd6929+ezFVihSHX3MMCxiU9nEBHJgUzaCB4H9sYt74nWSQZS3SXcu3frxiEikkomieCA6MEyAETzHbIXUmGZMSPcLRyvXTu4+ebcxCMikiiTRFATN0gcZjYWWJ+9kArLpEnhbuGKivp1V10VGopFRPKBNTbYp5kdCcwCDgOM8NSxL7v7kuyHt68RI0b4vHnzcvHVzeIOo0ZBTQ28+279sBIiIq3BzN5w9xHJtjXaWOzu7wEnmVnnaHlzC8dXFP78Z/jrX+HnP1cSEJH8ktEw1GY2BjgOKDUzANz9xizG1ebs2hWmDh3CiT46THVuugm6d4dLLslNfCIiqWRyQ9kvgDLgTOCXwAXA61mOq0356CMYMADWx7WcdOgA7dvXv65bB9dfv2/DsYhIrmVSIjjZ3T9hZm+5+3+b2U+AZ7IdWFty330hCfznf0JpaSgZ7NzZ8PWAA+DrX891pCIi+8okEWyPXrea2WFALWG8ISE0At91F5x0kh4oIyJtUyaJ4Ckz6wbcBPwNcODubAbVlrzwQugFdP/9uY5ERKRp0iaC6IE0z7v7x8D/mtnvgFJ339AawbUFd90VGoHHj891JCIiTZP2hjJ33wvcEbe8Q0mg3urVUFUVegKVluY6GhGRpsnkzuLnzewLZokdIuXuu8Nw0ldcketIRESaLpNE8O+EQeZ2mNlGM9tkZhuzHFfe2707JIJPfxqOPDLX0YiINF0mdxbrQYpJPPUUrFoFd9zR+L4iIvkskxvKPplsfeKDaorNnXdCeTmMGZPrSEREmieT7qPfipsvBUYCbwBnZSWiNuCf/4TnnoPvfS/cKCYi0pZlUjX0ufhlM+sH3JatgNqCX/wiJICvfCXXkYiINF8mjcWJVgLHtHQgbcW2bXDPPTBuHBx6aK6jERFpvkYTgZn9zMxuj6afA68Q7jAuSo8+GgaZmzq1ft2sWVBZGZ48VlkZlkVE2opMarjjnwKzG3jY3f+SpXjy3l13wcCBcMYZYXnWLJgyBbZuDcvLl4dlCE8nExHJd5kkgieA7e6+B8DMSsyszN23Zje0/PPGG/D66/DTn9Y/b2DatPokELN1a1ivRCAibUFGdxYDneKWOwHPZSec/HbXXeF5Al/+cv26999Pvm+q9SIi+SaTRFAa/3jKaL7oHq/y8cfw0EMwcSJ061a//vDDk++far2ISL7JJBFsMbNhsQUzGw5sy15I+en++0OPoSuvbLh+xox9nzpWVqZnE4hI25FJG8HXgcfNbDVgwKHAhZl8uJmNBn4KlAC/dPcfJmy/lfAITAiljF7u3i2jyFvZ3XfDyJEwbFjD9bF2gGnTQnXQ4YeHJKD2ARFpKzK5oWyumQ0Ejo5WLXb3XY29z8xKCENYn0O492Cumc1290Vxn31N3P7/AQzdz/hbxbvvwoIFoZE4mUmTdOIXkbYrk/sIrgIOdPcF7r4A6GxmVzb2PsJQFEvcfam77wQeAcam2X8i8HAmQbe2qqrw+vnP5zIKEZHsyKSN4PLoCWUAuPtHwOUZvK8vsCJueWW0bh9mVgH0B15IsX2Kmc0zs3k1NTUZfHXLqqoKVUJqABaRQpRJIiiJfyhNVOXToYXjmAA8EbtXIZG7z3T3Ee4+omfPni381el98AG89ppKAyJSuDJpLP498KiZ/U+0/O/AMxm8bxXQL265PFqXzATgqgw+s9XNnh1ex43LbRwiItmSSSL4DjAFiD2Q8S1Cz6HGzAWOMrP+hAQwAbgocaeoIfpg4LVMAm5tVVXhCWTHHZfrSEREsqPRqqHoAfZ/BaoJDcBnAW9n8L7dwFeBZ6P9H3P3hWZ2o5mdF7frBOARd/f9Dz+7NmyA558P1UJ6YrOIFKqUJQIzG0DoyTMRWA88CuDuZ6Z6TyJ3nwPMSVh3fcLy9MzDbV3PPAO7dqlaSEQKW7qqoXcIQ05/1t2XAJjZNWn2LzhVVdCrF5x0Uq4jERHJnnRVQ+cDHwAvmtndZvYpwp3FRWHHDpgzB8aOhZKSXEcjIpI9KROBu1e5+wRgIPAiYaiJXmZ2l5n9ayvFlzMvvACbNqnbqIgUvkwai7e4+0PRs4vLgb8TehIVtKoq6NwZzjor15GIiGTXfj2z2N0/im7u+lS2AsoHe/bAb38L554LpaW5jkZEJLua8vD6gvfXv8LataoWEpHioESQRFUVtG8fSgQiIoVOiSCBOzz5ZGgb6No119GIiGSfEkGCRYtgyRJVC4lI8VAiSBB79sDYdE9OEBEpIEoECZ58MtxJ3KdP/bpZs6CyEtq1C6+zZuUqOhGRlqdEEGfFCnjjjYbVQrNmwZQpsHx5aD9YvjwsKxmISKFQIojz29+G1/hB5qZNg61bG+63dWtYLyJSCJQI4jz5JBxzDAwYUL/u/feT75tqvYhIW6NEEPnwQ/jTn/YdcjrVc4r1/GIRKRRKBJGnnw5DSyR2G50xA8rKGq4rKwvrRUQKgRJB5Pe/Dz2Fhg9vuH7SJJg5EyoqwlPKKirC8qRJuYlTRKSlZfLM4qKwZEl4LnG7JKlx0iSd+EWkcKlEEFm2DPr3z3UUIiKtT4kA2LIFamrCzWIiIsVGiQCorg6vKhGISDFSIqA+EahEICLFSImA0D4AKhGISHFSIiCUCEpLoXfvXEciItL6lAgIJYLKynCfgIhIsVEiIJQIVC0kIsVKiYD6EoGISDEq+kSwYQN89JFKBCJSvIo+EajrqIgUu6JPBOo6KiLFrugTgUoEIlLsij4RLFsGnTtD9+65jkREJDeKPhHEuo7qHgIRKVZZTQRmNtrMFpvZEjO7NsU+/2Zmi8xsoZk9lM14klHXUREpdll7MI2ZlQB3AOcAK4G5Zjbb3RfF7XMUcB1wirt/ZGa9shVPMu6hRHDmma35rSIi+SWbJYKRwBJ3X+ruO4FHgLEJ+1wO3OHuHwG4+7osxrOPDz+ETZtUIhCR4pbNRNAXWBG3vDJaF28AMMDM/mJm/2dmo5N9kJlNMbN5ZjavpqamxQJU11ERkdw3Fh8AHAWcAUwE7jazbok7uftMdx/h7iN69uzZYl+urqMiItlNBKuAfnHL5dG6eCuB2e6+y92XAe8SEkOriJUIlAhEpJhlMxHMBY4ys/5m1gGYAMxO2KeKUBrAzHoQqoqWZjGmBqqroVu3MImIFKusJQJ33w18FXgWeBt4zN0XmtmNZnZetNuzQK2ZLQJeBL7l7rXZiinRsmVqHxARyVr3UQB3nwPMSVh3fdy8A/8vmlpddTUcc0wuvllEJH/kurE4Z2L3EKh9QESKXdEmgnXrYNs2VQ2JiBRtIlCPIRGRoGgTQeweApUIRKTYFW0iiJUIKipyG4eISK4VdSLo2TM8i0BEpJgVbSJQjyERkaBoE4FuJhMRCYoyEezdC8uXKxGIiECRJoLVq2HXLlUNiYhAkSYCdR0VEalXlIkg8WayWbPCfLt24XXWrBwFJiKSA1kddC5fxUoEFRXhpD9lCmzdGtYtXx6WASZNykl4IiKtqmhLBH36QGkpTJtWnwRitm4N60VEikHRJoJY+8D77yffJ9V6EZFCU5SJIP5mssMPT75PqvUiIoWm6BLB7t2wYkV9iWDGDCgra7hPWVlYLyJSDIouEaxcCXv21JcIJk2CmTNDw7FZeJ05Uw3FIlI8iq7XUKzraPw9BJMm6cQvIsWrKEoE8fcJjB8f1ulmMhGRoOATQew+geXLw3OKa2vD+ldeyW1cIiL5ouATQbL7BABuuKH1YxERyUcFnwh0n4CISHoFnwh0n4CISHoFnwiS3SdwwAG6T0BEJKbgE0H8fQIxl16q7qIiIjEFnwggnPSrq+EPfwjLF12U03BERPJKUSSCmGQ3k4mIFLuiSgTV1aF9oG/fXEciIpI/iioRLFsWeguVlOQ6EhGR/FFUiaC6WtVCIiKJiioRLFtWP+qoiIgERZMItm2DtWtVIhARSZTVRGBmo81ssZktMbNrk2yfbGY1ZvZmNH0lW7HEHlivEoGISENZex6BmZUAdwDnACuBuWY2290XJez6qLt/NVtxxKjrqIhIctksEYwElrj7UnffCTwCjM3i96WlEoGISHLZTAR9gRVxyyujdYm+YGZvmdkTZtYv2QeZ2RQzm2dm82pqapoWTF/4/Ofh0EOb9HYRkYKV68bip4BKd/8E8EfgvmQ7uftMdx/h7iN69uzZpC8aOxaefDI8pUxEROpl87S4Coi/wi+P1tVx91p33xEt/hIYnsV4REQkiWwmgrnAUWbW38w6ABOA2fE7mFmfuMXzgLezGI+IiCSRtV5D7r7bzL4KPAuUAL9294VmdiMwz91nA1eb2XnAbuBDYHK24hERkeTM3XMdw34ZMWKEz5s3L9dhiIi0KWb2hruPSLZNTaciIkVOiUBEpMgpEYiIFDklAhGRItfmGovNrAZYnmJzD2B9K4azv/I5PsXWNIqtaRRb0zQntgp3T3pHbptLBOmY2bxUreL5IJ/jU2xNo9iaRrE1TbZiU9WQiEiRUyIQESlyhZYIZuY6gEbkc3yKrWkUW9MotqbJSmwF1UYgIiL7r9BKBCIisp+UCEREilzBJAIzG21mi81siZldm+t44plZtZn9w8zeNLOcjphnZr82s3VmtiBu3SFm9kcz+2f0enAexTbdzFZFx+5NMzs3R7H1M7MXzWyRmS00s69F63N+7NLElvNjZ2alZva6mc2PYvvvaH1/M/tr9P/6aDRUfb7Edq+ZLYs7bkNaO7a4GEvM7O9m9rtoOTvHzd3b/EQY5vo94AigAzAfODbXccXFVw30yHUcUSyfBIYBC+LW/Ri4Npq/FvhRHsU2HfhmHhy3PsCwaL4L8C5wbD4cuzSx5fzYAQZ0jubbA38FTgIeAyZE638BTM2j2O4FLsj131wU1/8DHgJ+Fy1n5bgVSolgJLDE3Ze6+07gEWBsjmPKS+7+MuHZD/HGUv+Y0PuAz7dmTDEpYssL7v6Bu/8tmt9EeIhSX/Lg2KWJLec82Bwtto8mB84CnojW5+q4pYotL5hZOTCG8PRGzMzI0nErlETQF1gRt7ySPPlHiDjwBzN7w8ym5DqYJHq7+wfR/Bqgdy6DSeKrZvZWVHWUk2qreGZWCQwlXEHm1bFLiA3y4NhF1RtvAusIzyZ/D/jY3XdHu+Ts/zUxNnePHbcZ0XG71cw65iI24Dbg28DeaLk7WTpuhZII8t2p7j4M+AxwlZl9MtcBpeKhzJk3V0XAXcCRwBDgA+AnuQzGzDoD/wt83d03xm/L9bFLElteHDt33+PuQwjPLR8JDMxFHMkkxmZmxwPXEWI8ATgE+E5rx2VmnwXWufsbrfF9hZIIVgH94pbLo3V5wd1XRa/rgCcJ/wz5ZG3s+dHR67ocx1PH3ddG/6x7gbvJ4bEzs/aEE+0sd/9NtDovjl2y2PLp2EXxfAy8CIwCuplZ7FG5Of9/jYttdFTV5u6+A7iH3By3U4DzzKyaUNV9FvBTsnTcCiURzAWOilrUOwATgNk5jgkAMzvQzLrE5oF/BRakf1ermw1cHM1fDPw2h7E0EDvJRsaRo2MX1c/+Cnjb3W+J25TzY5cqtnw4dmbW08y6RfOdgHMIbRgvAhdEu+XquCWL7Z24xG6EOvhWP27ufp27l7t7JeF89oK7TyJbxy3XreItNQHnEnpLvAdMy3U8cXEdQejFNB9YmOvYgIcJ1QS7CHWMlxHqHp8H/gk8BxySR7E9APwDeItw0u2To9hOJVT7vAW8GU3n5sOxSxNbzo8d8Ang71EMC4Dro/VHAK8DS4DHgY55FNsL0XFbADxI1LMoVxNwBvW9hrJy3DTEhIhIkSuUqiEREWkiJQIRkSKnRCAiUuSUCEREipwSgYhIkVMiEImY2Z64ESfftBYcxdbMKuNHVRXJJwc0votI0djmYbgBkaKiEoFIIyw8T+LHFp4p8bqZ/Uu0vtLMXogGJ3vezA6P1vc2syejce7nm9nJ0UeVmNnd0dj3f4juZsXMro6eJfCWmT2Sox9TipgSgUi9TglVQxfGbdvg7oOAnxNGhQT4GXCfu38CmAXcHq2/HfiTuw8mPF9hYbT+KOAOdz8O+Bj4QrT+WmBo9DlXZOdHE0lNdxaLRMxss7t3TrK+GjjL3ZdGg7utcffuZraeMGzDrmj9B+7ew8xqgHIPg5bFPqOSMMzxUdHyd4D27v59M/s9sBmoAqq8fox8kVahEoFIZjzF/P7YETe/h/o2ujHAHYTSw9y40SVFWoUSgUhmLox7fS2af5UwMiTAJOCVaP55YCrUPfika6oPNbN2QD93f5Ew7n1XYJ9SiUg26cpDpF6n6GlVMb9391gX0oPN7C3CVf3EaN1/APeY2beAGuCSaP3XgJlmdhnhyn8qYVTVZEqAB6NkYcDtHsbGF2k1aiMQaUTURjDC3dfnOhaRbFDVkIhIkVOJQESkyKlEICJS5JQIRESKnBKBiEiRUyIQESlySgQiIkXu/wc+6mhjHLhF8AAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.clf() # clear figure\n", "\n", "plt.plot(epochs, acc, 'bo', label='Training acc')\n", "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n", "plt.title('Training and validation accuracy')\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Accuracy')\n", "plt.legend()\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "oFEmZ5zq-llk" }, "source": [ "No gráfico, os pontos representam o loss e acurácia de treinamento, e as linhas são o loss e a acurácia de validação.\n", "\n", "Note: que o loss de treinamento *diminui* a cada *epoch* e a acurácia *aumenta*. Isso é esperado quando usado um gradient descent optimization—ele deve minimizar a quantidade desejada a cada iteração.\n", "\n", "Esse não é o caso do loss e da acurácia de validação— eles parecem ter um pico depois de 20 epochs. Isso é um exemplo de *overfitting*: o modelo desempenha melhor nos dados de treinamento do que quando usado com dados nunca vistos. Depois desse ponto, o modelo otimiza além da conta e aprende uma representação *especifica* para os dados de treinamento e não *generaliza* para os dados de teste.\n", "\n", "Para esse caso particular, podemos prevenir o *overfitting* simplesmente parando o treinamento após mais ou menos 20 epochs. Depois, você verá como fazer isso automaticamente com um *callback*." ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "text_classification.ipynb", "toc_visible": true }, "kernelspec": { "display_name": "Python 3", "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.7.5" } }, "nbformat": 4, "nbformat_minor": 0 }