{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Digit Recognizer"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt\nfrom tensorflow import keras\nfrom sklearn.model_selection import train_test_split\nimport numpy as np\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.metrics import confusion_matrix\nimport seaborn as sns\nfrom sklearn.utils import shuffle\nsns.set()\n\nfrom random import choices\nfrom random import seed","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Importando Dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"digits_PATH = '/kaggle/input/digit-recognizer/'\n\ndigits_train = pd.read_csv(digits_PATH+'train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X, y = digits_train.iloc[:,1:].values/255, digits_train.iloc[:,0].values\n\nX = X.reshape(-1,28, 28, 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"seed(1)\n\nN_images = 50\n\n# localização dos exemplos na matriz de dados \nrows = choices(range(0, 42000), k=N_images)\n\n# selecionando os dígitos, já no formato de matriz\ndigitos = [X[i].reshape(28,28) for i in rows]\nlabel_value = y[rows]\n\n# criando figura do matplotlib\nfig, ax = plt.subplots(5, int(len(rows)/5),figsize=(18,10))\n\n# plotando!\nfor i in range(len(rows)):\n    j = int(i/10)\n    k = i - j*10\n    ax[j, k].imshow(digitos[i], cmap = plt.cm.binary, interpolation=\"nearest\")\n    ax[j, k].set_title(label_value[i])\n    ax[j, k].axis('off')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Separando Treino, Validação e Teste"},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.9, random_state=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig, ax = plt.subplots(2,2,figsize=(12,10))\n\nsns.countplot(y, ax=ax[0,0])\nax[0,0].set_title('Distribuição Original')\nsns.countplot(y_train, ax=ax[0,1])\nax[0,1].set_title('Distribuição do Treinamento')\nsns.countplot(y_test, ax=ax[1,0])\nax[1,0].set_title('Distribuição do Teste')\n\n\nplt.plot()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"A distribuição dos números nos 3 no conjunto de teste e validação está próxima a ser homogênea."},{"metadata":{},"cell_type":"markdown","source":"## Funções Auxiliares"},{"metadata":{"trusted":true},"cell_type":"code","source":"def plot_erros(model, X, target, cols=10, rows=5):\n\n    y_pred = model.predict(X)\n    y_pred = np.argmax(y_pred, axis=1)\n    \n    predicao = pd.DataFrame(data={'predicao':y_pred, 'target':target})\n    predicao_erros = predicao[predicao.predicao != predicao.target]\n    \n    digitos = predicao_erros.index\n\n    fig, ax = plt.subplots(rows, cols,figsize=(4*rows,1.2*cols))\n\n    count = 0\n    for row in range(0, rows):\n        for col in range(0, cols):\n            if count<len(digitos):\n                ax[row, col].imshow(X[digitos[count],:,:,0], cmap = plt.cm.binary, interpolation=\"nearest\")\n                ax[row, col].set_title(f'{target[digitos[count]]} confused {y_pred[digitos[count]]}')\n            ax[row, col].axis('off')\n            count +=1\n            ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Keras CNN"},{"metadata":{"trusted":true},"cell_type":"code","source":"class MultiCNN():\n    def __init__(self, model_generator, num_models=1):\n        self.models = []\n        self.create_models(model_generator, num_models)\n        \n    def create_models(self, model_generator, num_models=1):\n        for i in range(0,num_models):\n            m = keras.models.Sequential(model_generator())\n\n            m.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n\n            self.models.append(m)\n            \n    def fit(self, train_inputs, train_targets, early_stop=True, verbose=2, batch_size=200, epochs=100):\n        callback = []\n        \n        if early_stop:\n            callback.append(keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=1e-6, patience=5))\n        \n        for m in self.models:\n            X_train2, X_val2, y_train2, y_val2 = train_test_split(train_inputs, train_targets, test_size = 0.2)\n            m.fit(X_train2, y_train2, \n                  batch_size= batch_size, \n                  epochs = epochs,\n                  callbacks=callback,\n                  validation_data = (X_val2, y_val2),\n                  verbose=verbose\n                 )\n            \n    def fit_generator(self, generator, train_inputs, train_targets, early_stop=True, verbose=2, batch_size=32, epochs=100):\n        callback = []\n        \n        if early_stop:\n            callback.append(keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=1e-6, patience=5))\n        \n        for m in self.models:\n            X_train2, X_val2, y_train2, y_val2 = train_test_split(train_inputs, train_targets, test_size = 0.2)\n            \n            m.fit_generator(generator.flow(X_train2,y_train2, batch_size=batch_size),\n                            epochs = epochs,\n                            callbacks=callback,\n                            validation_data = (X_val2, y_val2),\n                            verbose=verbose\n                            )\n            \n    def predict(self, test_inputs):\n        prediction = [model.predict(test_inputs) for model in self.models]\n        return sum(prediction)/len(prediction)\n    \n    def acuracia(self, test_input, test_target):\n        prediction = self.predict(test_input)\n        prediction = np.argmax(prediction, axis=1)\n        return accuracy_score(prediction, test_target)\n    \n    def confusion_matrix(self, test_input, test_target):\n        \n        y_pred = self.predict(test_input)\n\n        y_pred = np.argmax(y_pred, axis=1)\n\n        confusao = confusion_matrix(y_pred, test_target)\n\n        fig, ax = plt.subplots(1, figsize=(10,10))\n        sns.heatmap(pd.DataFrame(confusao), ax=ax, cbar=False, annot=True)\n        ax.set_title('Matriz de confusão', size=20)\n        ax.set_yticklabels(ax.get_xticklabels(), rotation=0, size=15)\n        ax.set_xticklabels(ax.get_yticklabels(), rotation=0, size=15)\n        plt.show()\n        \n    def acuracia_individual(self, test_input, test_target):\n        return [accuracy_score(np.argmax(m.predict(X_test), axis=1), y_test) for m in self.models]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_CNN():\n    return  [\n\n            keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation=\"relu\", input_shape=(28, 28, 1)),\n            keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n\n            keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n            keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n\n            keras.layers.Flatten(),\n            keras.layers.Dense(units=64, activation=\"relu\"),\n\n            keras.layers.Dropout(0.2),\n\n            keras.layers.Dense(units=10, activation=\"softmax\")\n\n            ]\n    \n\n\nmultiCNN_default = MultiCNN(make_CNN, num_models=15)\n\nmultiCNN_default.fit(X_train, y_train, verbose = 0, early_stop=True)\n\nmultiCNN_default.acuracia(X_test, y_test)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Adicionando uma camada ao final "},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_CNN():\n    return  [\n\n                keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation=\"relu\", input_shape=(28, 28, 1)),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n\n                keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n\n                keras.layers.Flatten(),\n                keras.layers.Dense(units=64, activation=\"relu\"),\n                keras.layers.Dense(units=64, activation=\"relu\"),\n\n                keras.layers.Dropout(0.2),\n\n                keras.layers.Dense(units=10, activation=\"softmax\")\n\n            ]\n\nmultiCNN_plus_layer = MultiCNN(make_CNN, num_models=15)\n\nmultiCNN_plus_layer.fit(X_train, y_train, verbose = 0, early_stop=True)\n\nmultiCNN_plus_layer.acuracia(X_test, y_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig,axes = plt.subplots(1)\naxes = sns.kdeplot(multiCNN_default.acuracia_individual(X_test, y_test), shade=True, color='r', label='default')\naxes = sns.kdeplot(multiCNN_plus_layer.acuracia_individual(X_test, y_test), shade=True, color='b', label='layer add')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Não aumentou a qualidade do modelo"},{"metadata":{},"cell_type":"markdown","source":"## Alteração da camada de Pooling para média"},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_CNN():\n    return [\n\n                keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation=\"relu\", input_shape=(28, 28, 1)),\n                keras.layers.AveragePooling2D(pool_size = (2,2), strides = 2),\n\n                keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n                keras.layers.AveragePooling2D(pool_size = (2,2), strides = 2),\n\n                keras.layers.Flatten(),\n                keras.layers.Dense(units=64, activation=\"relu\"),\n\n                keras.layers.Dropout(0.2),\n\n                keras.layers.Dense(units=10, activation=\"softmax\")\n\n                ]\n\n\nmultiCNN_pooling = MultiCNN(make_CNN, num_models=15)\n\nmultiCNN_pooling.fit(X_train, y_train, verbose = 0, early_stop=True)\n\nmultiCNN_pooling.acuracia(X_test, y_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig,axes = plt.subplots(1)\naxes = sns.kdeplot(multiCNN_default.acuracia_individual(X_test, y_test), shade=True, color='r', label='default')\naxes = sns.kdeplot(multiCNN_pooling.acuracia_individual(X_test, y_test), shade=True, color='b', label='pooling average')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Afetou negativamente o resultado"},{"metadata":{},"cell_type":"markdown","source":"## Normalização por lote"},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_CNN():\n    return [\n\n                keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation=\"relu\", input_shape=(28, 28, 1)),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n\n                keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n    \n\n                keras.layers.Flatten(),\n                keras.layers.Dense(units=64, activation=\"relu\"),\n\n                keras.layers.Dropout(0.2),\n\n                keras.layers.Dense(units=10, activation=\"softmax\")\n\n                ]\n\nmultiCNN_batch_normalization = MultiCNN(make_CNN, num_models=15)\n\nmultiCNN_batch_normalization.fit(X_train, y_train, verbose = 0, early_stop=True)\n\nmultiCNN_batch_normalization.acuracia(X_test, y_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig,axes = plt.subplots(1)\naxes = sns.kdeplot(multiCNN_default.acuracia_individual(X_test, y_test), shade=True, color='r', label='default')\naxes = sns.kdeplot(multiCNN_batch_normalization.acuracia_individual(X_test, y_test), shade=True, color='b', label='batch normalization')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Aumentou um pouco a qualidade do modelo."},{"metadata":{},"cell_type":"markdown","source":"## Adição de mais camadas de dropout"},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_CNN():\n    return [\n\n                keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation=\"relu\", input_shape=(28, 28, 1)),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n\n                keras.layers.Dropout(0.2),\n    \n                keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n    \n                keras.layers.Dropout(0.2),\n\n                keras.layers.Flatten(),\n                keras.layers.Dense(units=64, activation=\"relu\"),\n\n                keras.layers.Dropout(0.2),\n\n                keras.layers.Dense(units=10, activation=\"softmax\")\n\n                ]\n\nmultiCNN_dropout = MultiCNN(make_CNN, num_models=15)\n\nmultiCNN_dropout.fit(X_train, y_train, verbose = 0, early_stop=True)\n\nmultiCNN_dropout.acuracia(X_test, y_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig,axes = plt.subplots(1)\naxes = sns.kdeplot(multiCNN_default.acuracia_individual(X_test, y_test), shade=True, color='r', label='default')\naxes = sns.kdeplot(multiCNN_dropout.acuracia_individual(X_test, y_test), shade=True, color='b', label='dropout-layers')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Adição de dropouts após cada camada apresentou pequena melhora"},{"metadata":{},"cell_type":"markdown","source":"## Aumento do número de neurônios na última camada"},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_CNN():\n    return [\n\n                keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation=\"relu\", input_shape=(28, 28, 1)),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n\n                keras.layers.Dropout(0.2),\n    \n                keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n    \n                keras.layers.Dropout(0.2),\n\n                keras.layers.Flatten(),\n                keras.layers.Dense(units=200, activation=\"relu\"),\n\n                keras.layers.Dropout(0.2),\n\n                keras.layers.Dense(units=10, activation=\"softmax\")\n\n                ]\n\n\nmultiCNN_200 = MultiCNN(make_CNN, num_models=15)\n\nmultiCNN_200.fit(X_train, y_train, verbose = 0, early_stop=True)\n\nmultiCNN_200.acuracia(X_test, y_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig,axes = plt.subplots(1)\naxes = sns.kdeplot(multiCNN_default.acuracia_individual(X_test, y_test), shade=True, color='r', label='default')\naxes = sns.kdeplot(multiCNN_200.acuracia_individual(X_test, y_test), shade=True, color='b', label='200 last layer')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Houve melhora no modelo."},{"metadata":{},"cell_type":"markdown","source":"## Aumento do Tamanho do kernel"},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_CNN():\n    return [\n\n                keras.layers.Conv2D(filters=32, kernel_size=(5,5), activation=\"relu\", input_shape=(28, 28, 1)),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n\n                keras.layers.Dropout(0.2),\n    \n                keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n    \n                keras.layers.Dropout(0.2),\n\n                keras.layers.Flatten(),\n                keras.layers.Dense(units=200, activation=\"relu\"),\n\n                keras.layers.Dropout(0.2),\n\n                keras.layers.Dense(units=10, activation=\"softmax\")\n\n                ]\n\nmultiCNN_bigger_kernel = MultiCNN(make_CNN, num_models=15)\n\nmultiCNN_bigger_kernel.fit(X_train, y_train, verbose = 0, early_stop=True)\n\nmultiCNN_bigger_kernel.acuracia(X_test, y_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig,axes = plt.subplots(1)\naxes = sns.kdeplot(multiCNN_default.acuracia_individual(X_test, y_test), shade=True, color='r', label='default')\naxes = sns.kdeplot(multiCNN_bigger_kernel.acuracia_individual(X_test, y_test), shade=True, color='b', label='5x5 kernel')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Não afetou a qualidade do modelo"},{"metadata":{},"cell_type":"markdown","source":"## Diminuição número máximo de Epochs"},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_CNN():\n    return [\n\n                keras.layers.Conv2D(filters=32, kernel_size=(5,5), activation=\"relu\", input_shape=(28, 28, 1)),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n\n                keras.layers.Dropout(0.2),\n    \n                keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n    \n                keras.layers.Dropout(0.2),\n\n                keras.layers.Flatten(),\n                keras.layers.Dense(units=200, activation=\"relu\"),\n\n                keras.layers.Dropout(0.2),\n\n                keras.layers.Dense(units=10, activation=\"softmax\")\n\n                ]\n\n\nmultiCNN_min_epochs = MultiCNN(make_CNN, num_models=15)\n\nmultiCNN_min_epochs.fit(X_train, y_train, verbose = 0, early_stop=True, epochs=10)\n\nmultiCNN_min_epochs.acuracia(X_test, y_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig,axes = plt.subplots(1)\naxes = sns.kdeplot(multiCNN_default.acuracia_individual(X_test, y_test), shade=True, color='r', label='default')\naxes = sns.kdeplot(multiCNN_min_epochs.acuracia_individual(X_test, y_test), shade=True, color='b', label='max 10 epochs')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Aumentou a qualidade do modelo"},{"metadata":{},"cell_type":"markdown","source":"## Adição de dados"},{"metadata":{"trusted":true},"cell_type":"code","source":"datagen = keras.preprocessing.image.ImageDataGenerator(\n                                                        featurewise_center=False,\n                                                        samplewise_center=False,\n                                                        featurewise_std_normalization=False,\n                                                        samplewise_std_normalization=False,\n                                                        zca_whitening=False,\n                                                        zca_epsilon=1e-06,\n                                                        rotation_range=10,\n                                                        width_shift_range=0.1,\n                                                        height_shift_range=0.1,\n                                                        brightness_range=None,\n                                                        zoom_range=0.1,\n                                                        fill_mode=\"nearest\",\n                                                        cval=0.0,\n                                                        horizontal_flip=False,\n                                                        vertical_flip=False,\n                                                        rescale=None,\n                                                        preprocessing_function=None,\n                                                        data_format=None,\n                                                        validation_split=0.0,\n                                                        dtype=None,\n                                                    )\n\ndatagen.fit(X_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_CNN():\n    return [\n\n                keras.layers.Conv2D(filters=32, kernel_size=(5,5), activation=\"relu\", input_shape=(28, 28, 1)),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n\n                keras.layers.Dropout(0.2),\n    \n                keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n    \n                keras.layers.Dropout(0.2),\n\n                keras.layers.Flatten(),\n                keras.layers.Dense(units=200, activation=\"relu\"),\n\n                keras.layers.Dropout(0.2),\n\n                keras.layers.Dense(units=10, activation=\"softmax\")\n\n                ]\n\n\nmultiCNN_data_augmentation = MultiCNN(make_CNN, num_models=15)\n\nmultiCNN_data_augmentation.fit_generator(datagen, X_train, y_train, verbose = 0, early_stop=True)\n\nmultiCNN_data_augmentation.acuracia(X_test, y_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig,axes = plt.subplots(1)\naxes = sns.kdeplot(multiCNN_default.acuracia_individual(X_test, y_test), shade=True, color='r', label='default')\naxes = sns.kdeplot(multiCNN_data_augmentation.acuracia_individual(X_test, y_test), shade=True, color='b', label='Data Augmentation')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Usar imagens geradas aumentaram a qualidade do modelo "},{"metadata":{},"cell_type":"markdown","source":"## Erros do Melhor modelo"},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_erros(multiCNN_data_augmentation, X_test, y_test, cols=10, rows=5)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Treinamento para submissão"},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_CNN():\n    return [\n\n                keras.layers.Conv2D(filters=32, kernel_size=(5,5), activation=\"relu\", input_shape=(28, 28, 1)),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n\n                keras.layers.Dropout(0.2),\n    \n                keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n                keras.layers.MaxPooling2D(pool_size = (2,2), strides = 2),\n                keras.layers.BatchNormalization(),\n    \n                keras.layers.Dropout(0.2),\n\n                keras.layers.Flatten(),\n                keras.layers.Dense(units=200, activation=\"relu\"),\n\n                keras.layers.Dropout(0.2),\n\n                keras.layers.Dense(units=10, activation=\"softmax\")\n\n                ]\n\nmultiCNN_final = MultiCNN(make_CNN, num_models=15)\n\nmultiCNN_final.fit_generator(datagen, X_train, y_train, verbose = 0, early_stop=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"multiCNN_final.acuracia(X_test, y_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.read_csv(digits_PATH+'sample_submission.csv', index_col=0)\ntest = pd.read_csv(digits_PATH+'test.csv')/255\ntest = test.values.reshape(-1,28, 28, 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission['Label'] = np.argmax(multiCNN_final.predict(test), axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.Label.value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.to_csv('submission.csv')","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}