{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        os.path.join(dirname, filename)\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-06-26T20:38:32.767127Z","iopub.execute_input":"2023-06-26T20:38:32.767616Z","iopub.status.idle":"2023-06-26T20:38:37.434865Z","shell.execute_reply.started":"2023-06-26T20:38:32.767582Z","shell.execute_reply":"2023-06-26T20:38:37.433884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Instalando o TensorFlow\n!pip install tensorflow\n\nimport os  # Biblioteca para manipulação de diretórios e arquivos\nimport numpy as np  # Biblioteca para manipulação de arrays e operações matemáticas\nimport pandas as pd  # Biblioteca para manipulação e análise de dados\nimport matplotlib.pyplot as plt  # Biblioteca para visualização de gráficos\nimport tensorflow as tf  # Biblioteca para TensorFlow \n\n\nfrom sklearn.model_selection import StratifiedKFold  # Classe para realizar validação cruzada estratificada\n","metadata":{"execution":{"iopub.status.busy":"2023-06-26T20:38:41.913903Z","iopub.execute_input":"2023-06-26T20:38:41.914246Z","iopub.status.idle":"2023-06-26T20:47:09.448687Z","shell.execute_reply.started":"2023-06-26T20:38:41.914219Z","shell.execute_reply":"2023-06-26T20:47:09.447622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# Definindo o diretório de onde os arquivos serão lidos\ndir_path = \"../input/dog-breed-identification/\"\nos.listdir(dir_path)\n\n# Definindo o caminho das imagens de treinamento e teste\ntrain_images_path = \"../input/dog-breed-identification/train/\"\ntest_images_path = \"../input/dog-breed-identification/test/\"\n\n# Lendo o arquivo CSV com os rótulos\nlabels_df = pd.read_csv(dir_path + 'labels.csv')\n\n# Criando uma lista de nomes de arquivos de treinamento\nfilenames = [train_images_path + fname + '.jpg' for fname in labels_df['id']]\n\n# Criando uma lista de nomes de classes\nclass_names = labels_df['breed'].unique()\n\n# Criando uma lista de rótulos de destino\ntarget_labels = [breed for breed in labels_df['breed']]\n\n# Codificando os rótulos de destino\ntarget_labels_encoded = [label == np.array(class_names) for label in target_labels]\n\n# Carregando os rótulos dos arquivos de treinamento\nlabels = np.loadtxt(\"/kaggle/input/dog-breed-identification/labels.csv\", delimiter=\",\", dtype=str, skiprows=1)\n\n# Criando uma lista de arquivos de treinamento\ntrain_files = [train_images_path + file_name + '.jpg' for file_name in labels[:,0]]\n\n\n","metadata":{"execution":{"iopub.status.busy":"2023-06-26T20:47:43.548700Z","iopub.execute_input":"2023-06-26T20:47:43.549331Z","iopub.status.idle":"2023-06-26T20:47:43.674438Z","shell.execute_reply.started":"2023-06-26T20:47:43.549292Z","shell.execute_reply":"2023-06-26T20:47:43.673460Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Definindo o tamanho das imagens\ntam = 100\n\n# Função para converter a imagem em um array\ndef img2arr(image_path):\n    # Carregar a imagem e redimensioná-la para o tamanho especificado\n    img = tf.keras.utils.load_img(image_path, target_size=(tam, tam))\n    \n    # Converter a imagem em um array e normalizá-lo dividindo por 255\n    arr = tf.keras.utils.img_to_array(img) / 255\n    \n    return arr\n","metadata":{"execution":{"iopub.status.busy":"2023-06-26T20:47:47.808494Z","iopub.execute_input":"2023-06-26T20:47:47.808962Z","iopub.status.idle":"2023-06-26T20:47:47.816631Z","shell.execute_reply.started":"2023-06-26T20:47:47.808914Z","shell.execute_reply":"2023-06-26T20:47:47.815010Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Definindo o tamanho do conjunto de treinamento\ntrain_size = -1  # Usar todos os dados de treinamento\n\n# Criando um array vazio para armazenar as imagens de treinamento\nx_train = np.empty((len(train_files[:train_size]), tam, tam, 3))\n\n# Carregando as imagens de treinamento e armazenando-as no array\nfor i, file in enumerate(train_files[:train_size]):\n    x_train[i] = img2arr(file)\n\n# Obtendo os rótulos de treinamento\ny_train = labels[:, 1]\n\n# Reduzindo os rótulos de treinamento para o tamanho especificado\ny_train = y_train[:train_size]\n\n","metadata":{"execution":{"iopub.status.busy":"2023-06-26T20:47:51.156642Z","iopub.execute_input":"2023-06-26T20:47:51.157452Z","iopub.status.idle":"2023-06-26T20:48:55.625380Z","shell.execute_reply.started":"2023-06-26T20:47:51.157418Z","shell.execute_reply":"2023-06-26T20:48:55.624078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.base import BaseEstimator, ClassifierMixin\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom sklearn.metrics import accuracy_score\nimport numpy as np\n\n# Classe da Rede Neural personalizada\nclass RedeNeural(BaseEstimator, ClassifierMixin):\n    def __init__(self, epochs=15, batch_size=128):\n        self.epochs = epochs\n        self.batch_size = batch_size\n\n    def fit(self, X, y):\n        # Obter as classes únicas do conjunto de dados de destino\n        self.labels, ids = np.unique(y, return_inverse=True)\n        # Converter os rótulos em formato one-hot encoding\n        yhot = keras.utils.to_categorical(ids)\n        \n        # Definir a arquitetura do modelo de Rede Neural\n        self.model = keras.Sequential([\n            layers.Conv2D(4, 4, activation='relu'),  # Camada de convolução 2D\n            layers.Flatten(),                        # Camada de achatamento\n            layers.Dense(300, activation=\"relu\"),     # Camada densa com ativação ReLU\n            layers.Dense(100, activation=\"relu\"),     # Camada densa com ativação ReLU\n            layers.Dense(yhot.shape[1], activation=\"softmax\")  # Camada densa de saída com ativação softmax\n        ])\n        \n        # Compilar o modelo com otimizador, função de perda e métrica\n        self.model.compile(optimizer=\"rmsprop\",\n                           loss=\"categorical_crossentropy\",\n                           metrics=[\"accuracy\"])\n        \n        # Treinar o modelo usando os dados de entrada e rótulos\n        self.model.fit(X, yhot, epochs=self.epochs, batch_size=self.batch_size)\n        \n        return self\n\n    def predict(self, X, y=None):\n        # Realizar a predição do modelo nos dados de entrada\n        return self.model.predict(X)\n","metadata":{"execution":{"iopub.status.busy":"2023-06-26T20:53:47.752661Z","iopub.execute_input":"2023-06-26T20:53:47.753368Z","iopub.status.idle":"2023-06-26T20:53:47.767438Z","shell.execute_reply.started":"2023-06-26T20:53:47.753326Z","shell.execute_reply":"2023-06-26T20:53:47.766437Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Realizar a validação cruzada apenas se o número de amostras for consistente\nif len(x_train) == len(y_train):\n\n    # Definir o número de folds\n    n_folds = 5\n\n    # Criar o objeto StratifiedKFold para realizar a validação cruzada\n    skf = StratifiedKFold(n_splits=n_folds)\n\n    # Inicializar a lista para armazenar as previsões em cada fold\n    all_y_pred = []\n\n    # Realizar a validação cruzada\n    for train_index, val_index in skf.split(x_train, y_train):\n        # Dividir os dados em conjunto de treinamento e conjunto de validação\n        X_train_fold, X_val_fold = x_train[train_index], x_train[val_index]\n        y_train_fold, y_val_fold = y_train[train_index], y_train[val_index]\n\n        # Inicializar o modelo\n        modelo = RedeNeural()\n\n        # Treinar o modelo no fold atual\n        modelo.fit(X_train_fold, y_train_fold)\n\n        # Realizar a predição no conjunto de validação\n        y_pred_fold = modelo.predict(X_val_fold)\n\n        # Armazenar as previsões do fold atual na lista\n        all_y_pred.append(y_pred_fold)\n\n    # Concatenar as previsões de todos os folds\n    y_pred_cv = np.concatenate(all_y_pred)\n\n    # Salvar as previsões em um arquivo CSV\n    np.savetxt(\"submission_cv.csv\", y_pred_cv, delimiter=\",\")\nelse:\n    print(\"O número de amostras nos dados de treinamento é inconsistente. Verifique seus dados.\")","metadata":{"execution":{"iopub.status.busy":"2023-06-26T20:53:52.628218Z","iopub.execute_input":"2023-06-26T20:53:52.629124Z","iopub.status.idle":"2023-06-26T20:59:20.953809Z","shell.execute_reply.started":"2023-06-26T20:53:52.629084Z","shell.execute_reply":"2023-06-26T20:59:20.952629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del x_train","metadata":{"execution":{"iopub.status.busy":"2023-06-26T20:59:30.866654Z","iopub.execute_input":"2023-06-26T20:59:30.867074Z","iopub.status.idle":"2023-06-26T20:59:30.878711Z","shell.execute_reply.started":"2023-06-26T20:59:30.867040Z","shell.execute_reply":"2023-06-26T20:59:30.877674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"modelo.model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-06-26T20:59:34.659896Z","iopub.execute_input":"2023-06-26T20:59:34.660752Z","iopub.status.idle":"2023-06-26T20:59:34.679608Z","shell.execute_reply.started":"2023-06-26T20:59:34.660710Z","shell.execute_reply":"2023-06-26T20:59:34.678586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Lista para armazenar os caminhos dos arquivos de teste\ntest_files = []\n\n# Percorrer o diretório de teste e obter os caminhos dos arquivos\nfor dirname, _, filenames in os.walk('/kaggle/input/dog-breed-identification/test/'):\n    for filename in filenames:\n        test_files.append(os.path.join(dirname, filename))\n\n# Criar um array vazio para armazenar as imagens de teste\nx_test = np.empty((len(test_files), tam, tam, 3))\n\n# Carregar as imagens de teste e armazenar no array\nfor i, file in enumerate(test_files):\n    x_test[i] = img2arr(file)\n\n# Imprimir a forma (shape) do array de teste\nprint(x_test.shape)\n","metadata":{"execution":{"iopub.status.busy":"2023-06-26T21:00:14.070817Z","iopub.execute_input":"2023-06-26T21:00:14.071638Z","iopub.status.idle":"2023-06-26T21:01:22.164126Z","shell.execute_reply.started":"2023-06-26T21:00:14.071599Z","shell.execute_reply":"2023-06-26T21:01:22.162658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Realizar a predição do modelo nos dados de teste\ny_pred = modelo.predict(x_test)\n\n# Salvar as predições em um arquivo CSV\nnp.savetxt(\"submission.csv\", y_pred, delimiter=\",\")","metadata":{"execution":{"iopub.status.busy":"2023-06-26T21:02:02.445448Z","iopub.execute_input":"2023-06-26T21:02:02.445867Z","iopub.status.idle":"2023-06-26T21:02:07.528039Z","shell.execute_reply.started":"2023-06-26T21:02:02.445836Z","shell.execute_reply":"2023-06-26T21:02:07.526775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del x_test","metadata":{"execution":{"iopub.status.busy":"2023-06-26T21:02:46.295590Z","iopub.execute_input":"2023-06-26T21:02:46.296031Z","iopub.status.idle":"2023-06-26T21:02:46.307374Z","shell.execute_reply.started":"2023-06-26T21:02:46.295997Z","shell.execute_reply":"2023-06-26T21:02:46.306249Z"},"trusted":true},"execution_count":null,"outputs":[]}]}