{"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"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"},{"sourceId":118995,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":100068,"modelId":124236}],"dockerImageVersionId":30761,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Data Analysis\nimport pandas as pd\nimport numpy as np\n# Plots\nimport matplotlib.pyplot as plt\n# Keras\nfrom tensorflow.keras.datasets import cifar10\nfrom tensorflow.keras.models import Sequential, load_model\nfrom tensorflow.keras.layers import LSTM, Dense, Dropout, SimpleRNN, Flatten, Conv2D, MaxPooling2D\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.preprocessing import image\n\n\n# Check if a model is already created\ncheck_model = 0\nselect_name_model = 'cifar10_model.h5'\ntry:\n    model = load_model('cifar10_model.h5')\n    print('Model found. Proceed with evaluations')\n    check_model = 1\nexcept:\n    print('No model loaded. Proceed to creating, training and saving a new one')\n\nif check_model == 0:\n    # Load dataset CIFAR-10\n    (X_train, y_train), (X_test, y_test) = cifar10.load_data()\n\n    # Normalize data\n    X_train = X_train.astype('float32') / 255\n    X_test = X_test.astype('float32') / 255\n\n    # Convert labels in one-hot encoding\n    y_train = to_categorical(y_train, 10)\n    y_test = to_categorical(y_test, 10)\n\n    # Define model Sequential CNN\n    model = Sequential()\n\n    # Add levels\n    model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)))\n    model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n    model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))\n    model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n    # Level fully connected\n    model.add(Flatten())\n    model.add(Dense(512, activation='relu'))\n    model.add(Dropout(0.5))\n    model.add(Dense(10, activation='softmax'))\n\n    # Compile model\n    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n\n    # Define EarlyStopping to prevent overfitting\n    early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)\n\n    # Train model - 26 is the max number of epoch after EarlyStopping. It should work too, but i leave 26\n    history = model.fit(X_train, y_train, batch_size=64, epochs=26, validation_data=(X_test, y_test),\n                        callbacks=[early_stopping])\n\n    # SAVE MODEL\n    model.save(select_name_model)\n\n\n# Evaluate model\ntest_loss, test_acc = model.evaluate(X_test, y_test)\nprint(f'Test accuracy: {test_acc:.4f}')\n\n# Show previsions\npredictions = model.predict(X_test)\npredicted_classes = np.argmax(predictions, axis=1)\ntrue_classes = np.argmax(y_test, axis=1)\n\nlist_classifications = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', \n                        'ship', 'truck']\n# Convert predictions to labels\npredicted_labels = [list_classifications[i] for i in predicted_classes]\n# Create a DataFrame with 'id' and 'label' columns\nsubmission_df = pd.DataFrame({\n    'id': range(len(predicted_labels)),  \n    'label': predicted_labels\n})\n\n# Show images with previsions\nplt.figure(figsize=(10, 10))\nfor i in range(25):\n    plt.subplot(5, 5, i + 1)\n    plt.xticks([])\n    plt.yticks([])\n    plt.grid(False)\n    plt.imshow(X_test[i])\n    plt.xlabel(f'Pred: {predicted_classes[i]} | True: {true_classes[i]}')\nplt.show()\n\n# Save the DataFrame to a CSV file\nsubmission_df.to_csv('submission.csv', index=False)\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]}]}