{"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":"markdown","source":"Citation\nWill Cukierski. (2013). CIFAR-10 - Object Recognition in Images. Kaggle. https://kaggle.com/competitions/cifar-10","metadata":{}},{"cell_type":"markdown","source":"**Add libarchive to the Environment**","metadata":{}},{"cell_type":"code","source":"!pip install libarchive-c\nimport libarchive\nlibarchive.extract_file('/kaggle/input/cifar-10/test.7z')\nlibarchive.extract_file('/kaggle/input/cifar-10/train.7z')","metadata":{"execution":{"iopub.status.busy":"2023-10-12T11:59:19.909236Z","iopub.execute_input":"2023-10-12T11:59:19.909580Z","iopub.status.idle":"2023-10-12T12:01:05.092920Z","shell.execute_reply.started":"2023-10-12T11:59:19.909554Z","shell.execute_reply":"2023-10-12T12:01:05.091865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Coding for CNN**","metadata":{}},{"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# import backend\nimport tensorflow as  tf\n\n# Model architecture\nfrom PIL import Image\nfrom sklearn.model_selection import train_test_split\nfrom keras.models import Sequential\nfrom tensorflow.keras.models import Sequential, load_model\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, BatchNormalization\nfrom keras.layers import MaxPool2D, Activation, MaxPooling2D\n#from keras.layers.convolutionalimport Convolution2D, MaxPooling2D\n\n# model optimisation and scores\nfrom sklearn import metrics\nfrom sklearn.metrics import accuracy_score, f1_score\nfrom tensorflow.keras.optimizers import Adam, SGD\nfrom sklearn.metrics import confusion_matrix, classification_report\nfrom sklearn.metrics import roc_auc_score, auc, roc_curve\n\n\n# Annealer\nfrom keras.callbacks import LearningRateScheduler\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint\n\n\n# Data processing\n# from keras.preprocessing.image import ImageDataGenerator\nfrom keras.utils import to_categorical\n# from keras.preprocessing import image\n\n#Save the model\nfrom tensorflow.keras.models import load_model\n\n# Visualization\nimport matplotlib.pyplot as plt\nimport h5py\n\ndef load_images_from_directory(directory, label_provided=True):\n    images_list = []\n    labels_list = []\n    for filename in sorted(os.listdir(directory), key=lambda x: int(x.split('.')[0])):  # Sort by ID\n        with Image.open(os.path.join(directory, filename)) as img:\n            images_list.append(np.array(img))\n            if label_provided:\n                image_id = int(filename.split('.')[0])\n                labels_list.append(label_to_index[label_mapping[image_id]])\n    images = np.array(images_list)\n    labels = np.array(labels_list) if label_provided else None\n    return images, labels\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\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input/cifar-10'):\n    for filename in filenames:\n        print(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\nsample_submission = pd.read_csv('../input/cifar-10/sampleSubmission.csv')\ntrain_labels = pd.read_csv('../input/cifar-10/trainLabels.csv')\n\nprint(\"Number of training sample: \",train_labels.shape[0])\nprint(\"Number of test samples: \", sample_submission.shape[0])\n\n\n#import h5py\n#with h5py.File('/kaggle/input/cifar-10/train.7z', 'r') as file:\n    #train_ids = pd.DataFrame(np.array(np.squeeze(file['train_ids'])),columns=['id'])\n    #train_data = np.array(file['train_images']).reshape(-1, 32, 32, 3)\n    \n#train_data = train_data\n#target_variable = train_labels.label\n\n# Load Data\nlabel_to_index = {label: index for index, label in enumerate(train_labels['label'].unique())}\nlabel_mapping = dict(zip(train_labels['id'].values, train_labels['label'].values))\nTrain_Data, Train_Label = load_images_from_directory('/kaggle/working/train')\nprint('Shape of Test_Data',Train_Data.shape)\n\n# Normalize the data\nx_train = Train_Data.astype('float32') / 255.0\ny_train = tf.keras.utils.to_categorical(Train_Label, 10)\n\n#Two GPU Function\nstrategy = tf.distribute.MirroredStrategy()\nprint('Number of devices: {}'.format(strategy.num_replicas_in_sync))\n\n# Open a strategy scope.\nwith strategy.scope():\n    # Everything that creates variables should be under the strategy scope.\n    # In general this is only model's `build`, `compile`.\n    \n    # Build the model\n    model = Sequential([\n        Conv2D(128, (3, 3),padding='same',input_shape=(32, 32, 3),activation='relu', ),\n        BatchNormalization(),\n        MaxPooling2D(2, 2),\n        Conv2D(512, (3, 3),padding='same', activation='relu'),\n        BatchNormalization(),\n        MaxPooling2D(2, 2),\n        Conv2D(256, (3, 3),padding='same', activation='relu'),\n        BatchNormalization(),\n        MaxPooling2D(2, 2),\n        Conv2D(256, (3, 3),padding='same', activation='relu'),\n        Flatten(),\n        Dense(512, activation='relu'),\n        Dense(10, activation='softmax')\n    ])\n    \n    # Compile the model\n    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n\n#adjusting learning rate    \ndef lr_schedule(epoch):\n    lrate = 0.001\n    if epoch>10:\n        lrate = 0.0005\n    return lrate\n\n# Train the model\nhistory = model.fit(x_train, y_train, epochs=20, callbacks=[LearningRateScheduler(lr_schedule)], batch_size=128, validation_split=0.2)\n\n# To evaluate on validation data we use:\nvalidation_loss, validation_accuracy = model.evaluate(x_train[int(0.8*len(x_train)):], y_train[int(0.8*len(y_train)):])\nprint(f\"Validation Accuracy: {validation_accuracy * 100:.2f}%\")\n\nAccuracy = str(validation_accuracy*100)[:2]\nprint(\"Accuracy\",Accuracy)\n\n# Save the model (optional)\nmodel.save(f\"cifar10_model_0.{Accuracy}.h5\")\n\n\n\n# Load the model\nloaded_model = load_model(f\"cifar10_model_0.{Accuracy}.h5\")\nTEST_DIR = \"/kaggle/working/test\"\n\n# Create a dataframe with filepaths\nfilepaths = [os.path.join(TEST_DIR, fname) for fname in os.listdir(TEST_DIR) if fname.endswith('.png')]\ndf_test = pd.DataFrame({'filename': filepaths})\n\n# Use ImageDataGenerator with flow_from_dataframe\ntest_datagen = ImageDataGenerator(rescale=1./255)\ntest_gen = test_datagen.flow_from_dataframe(dataframe=df_test, \n                                            x_col=\"filename\", \n                                            y_col=None, \n                                            target_size=(32, 32), \n                                            batch_size=64, \n                                            class_mode=None, \n                                            shuffle=False)\n\npredictions_vecs = loaded_model.predict(test_gen)\n\npredictions_final = np.argmax(predictions_vecs, axis=1)\n\nclass_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']\n\npredicted_classes = [class_names[i] for i in predictions_final]\n\n# Extract file IDs\nids = [int(fname.split(sep=\"/\")[-1].split(sep=\".\")[0]) for fname in test_gen.filenames]\n\n\n# Generate submission DataFrame\nsubmission = pd.DataFrame({\n    'id': ids,\n    'label': predicted_classes\n})\n\n# Ensure labels are strings and sort by 'id'\nsubmission = submission.sort_values(by='id').reset_index(drop=True)\n\n# Save submission to CSV\nsubmission.to_csv('submission.csv', index=False)\n\nmodel.save('cnn_20_epochs.h5')\nprint('model saved')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-12T12:02:47.184875Z","iopub.execute_input":"2023-10-12T12:02:47.185229Z","iopub.status.idle":"2023-10-12T12:10:52.921620Z","shell.execute_reply.started":"2023-10-12T12:02:47.185200Z","shell.execute_reply":"2023-10-12T12:10:52.920364Z"},"trusted":true},"execution_count":null,"outputs":[]}]}