{"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":"!pip install py7zr","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:07:58.839975Z","iopub.execute_input":"2023-10-02T07:07:58.840621Z","iopub.status.idle":"2023-10-02T07:08:11.946213Z","shell.execute_reply.started":"2023-10-02T07:07:58.840591Z","shell.execute_reply":"2023-10-02T07:08:11.945124Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import py7zr\n\nwith py7zr.SevenZipFile('/kaggle/input/cifar-10/test.7z', mode='r') as z:\n    z.extractall(path=\"/kaggle/working/\")\n\nwith py7zr.SevenZipFile('/kaggle/input/cifar-10/train.7z', mode='r') as z:\n    z.extractall(path=\"/kaggle/working/\")","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:08:11.948792Z","iopub.execute_input":"2023-10-02T07:08:11.949175Z","iopub.status.idle":"2023-10-02T07:22:22.678442Z","shell.execute_reply.started":"2023-10-02T07:08:11.949137Z","shell.execute_reply":"2023-10-02T07:22:22.677433Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install numpy==1.22.0","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:22:22.679699Z","iopub.execute_input":"2023-10-02T07:22:22.680322Z","iopub.status.idle":"2023-10-02T07:22:42.075510Z","shell.execute_reply.started":"2023-10-02T07:22:22.680291Z","shell.execute_reply":"2023-10-02T07:22:42.074274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array\n# from keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array\n# why keras only\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom keras.optimizers import Adam\nfrom keras.callbacks import EarlyStopping, ReduceLROnPlateau","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:22:42.078642Z","iopub.execute_input":"2023-10-02T07:22:42.079818Z","iopub.status.idle":"2023-10-02T07:22:56.320709Z","shell.execute_reply.started":"2023-10-02T07:22:42.079776Z","shell.execute_reply":"2023-10-02T07:22:56.319752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"strategy = tf.distribute.MirroredStrategy()\nprint(\"Number of devices: {}\".format(strategy.num_replicas_in_sync))","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:22:56.322204Z","iopub.execute_input":"2023-10-02T07:22:56.322899Z","iopub.status.idle":"2023-10-02T07:23:03.169068Z","shell.execute_reply.started":"2023-10-02T07:22:56.322863Z","shell.execute_reply":"2023-10-02T07:23:03.168211Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = \"/kaggle/working/train/\"\ntest_dir = \"/kaggle/working/test/\"","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:23:03.172931Z","iopub.execute_input":"2023-10-02T07:23:03.174902Z","iopub.status.idle":"2023-10-02T07:23:03.180986Z","shell.execute_reply.started":"2023-10-02T07:23:03.174871Z","shell.execute_reply":"2023-10-02T07:23:03.179812Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\n# Data Augmentation\ndatagen = ImageDataGenerator(\n    rescale=1./255,          # Rescale pixel values to [0, 1]\n    validation_split=0.2,    # Reserve some data for validation\n    horizontal_flip=True,    # Random horizontal flip\n    width_shift_range=0.1,   # Horizontal shift\n    height_shift_range=0.1,  # Vertical shift\n    rotation_range=20,       # Random rotation between -20 to 20 degrees\n    zoom_range=0.15,         # Random zoom in the range [0.85, 1.15]\n    shear_range=0.15         # Shear Intensity\n)","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:23:03.185721Z","iopub.execute_input":"2023-10-02T07:23:03.187790Z","iopub.status.idle":"2023-10-02T07:23:03.197715Z","shell.execute_reply.started":"2023-10-02T07:23:03.187756Z","shell.execute_reply":"2023-10-02T07:23:03.196621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv('/kaggle/input/cifar-10/trainLabels.csv')\n\n# Convert class labels from string to str format\n# df_train['label'] = df_train['label'].astype(str)\n# df_train['id'] = df_train['id'].astype(str) + '.png'\ndf_train['id'] = df_train['id'].astype(str) + '.png'\n\n\n# Load images using Keras's ImageDataGenerator\ndatagen = ImageDataGenerator(\n    rescale=1./255,\n    validation_split=0.2,\n    horizontal_flip=True,\n    width_shift_range=0.1,\n    height_shift_range=0.1\n)\n\ntrain_generator = datagen.flow_from_dataframe(\n    df_train,\n    directory=train_dir,\n    x_col='id',\n    y_col='label',\n    target_size=(32, 32),\n    class_mode='categorical',\n    batch_size=64,\n    subset='training'\n)\n\nvalidation_generator = datagen.flow_from_dataframe(\n    df_train,\n    directory=train_dir,\n    x_col='id',\n    y_col='label',\n    target_size=(32, 32),\n    class_mode='categorical',\n    batch_size=128,\n    subset='validation'\n)","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:23:03.201909Z","iopub.execute_input":"2023-10-02T07:23:03.204329Z","iopub.status.idle":"2023-10-02T07:23:04.493670Z","shell.execute_reply.started":"2023-10-02T07:23:03.204298Z","shell.execute_reply":"2023-10-02T07:23:04.492602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import gc\ndel df_train\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:23:04.495102Z","iopub.execute_input":"2023-10-02T07:23:04.495415Z","iopub.status.idle":"2023-10-02T07:23:04.682693Z","shell.execute_reply.started":"2023-10-02T07:23:04.495385Z","shell.execute_reply":"2023-10-02T07:23:04.681682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.layers import BatchNormalization, DepthwiseConv2D\nfrom tensorflow.keras.layers import Dense, Dropout, Activation,Flatten,Conv2D,MaxPooling2D\nwith strategy.scope():\n    model = Sequential()\n    model.add(Conv2D(32, (3, 3), activation='relu', strides=(1,1), padding='same', input_shape=(32, 32, 3)))\n    model.add(BatchNormalization())\n    model.add(DepthwiseConv2D(kernel_size=(3,3), strides=(1, 1), padding='same', activation='relu'))\n    model.add(Dropout(rate =0.1))\n\n    \n        \n    model.add(Conv2D(64, (3, 3), activation='relu', strides=(2, 2), padding='same'))\n    model.add(BatchNormalization())\n    model.add(DepthwiseConv2D(kernel_size=(3,3), strides=(1, 1), padding='same', activation='relu'))\n    model.add(Dropout(rate = 0.1))   \n              \n    \n    model.add(Conv2D(128, (3, 3), activation='relu', strides=(1, 1), padding='same'))\n    model.add(BatchNormalization())\n    model.add(DepthwiseConv2D(kernel_size=(3,3), strides=(1, 1), padding='same', activation='relu'))\n\n    model.add(Dropout(rate = 0.4))\n    \n    model.add(Conv2D(128, (3, 3), activation='relu', strides=(1, 1), padding='same'))\n    model.add(BatchNormalization())\n    model.add(DepthwiseConv2D(kernel_size=(1,1), strides=(1, 1), padding='same', activation='relu'))\n    \n    \n    model.add(Conv2D(256, (3, 3), activation='relu', strides=(2, 2), padding='same'))\n    model.add(BatchNormalization())\n    model.add(DepthwiseConv2D(kernel_size=(3,3), strides=(1, 1), padding='same', activation='relu'))\n    \n    \n    \n    model.add(Conv2D(512, (1, 1), activation='relu', strides=(2, 2), padding='same'))\n    model.add(BatchNormalization())\n    model.add(DepthwiseConv2D(kernel_size=(1,1), strides=(1, 1), padding='same', activation= 'relu'))\n    \n    model.add(Dropout(rate = 0.4))\n    \n    model.add(Flatten())\n    model.add(Dropout(rate = 0.3))\n    model.add(Dense(2048, activation='relu'))\n    model.add(Dropout(rate = 0.3))\n    model.add(Dense(512, activation='relu'))\n    model.add(Dropout(rate = 0.4))\n    model.add(Dense(10, activation='softmax'))\n\nmodel.compile(loss='categorical_crossentropy', optimizer= Adam(learning_rate= 0.003 ), metrics=['accuracy'])\n              ","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:23:04.686399Z","iopub.execute_input":"2023-10-02T07:23:04.686658Z","iopub.status.idle":"2023-10-02T07:23:05.272279Z","shell.execute_reply.started":"2023-10-02T07:23:04.686637Z","shell.execute_reply":"2023-10-02T07:23:05.271314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import plot_model\n\n# Assuming 'model' is your Keras model\nplot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True)\n\n# Visualization of the model\n# keras.utils.plot_model(model)","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:23:05.280633Z","iopub.execute_input":"2023-10-02T07:23:05.281310Z","iopub.status.idle":"2023-10-02T07:23:05.968859Z","shell.execute_reply.started":"2023-10-02T07:23:05.281278Z","shell.execute_reply":"2023-10-02T07:23:05.968017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.callbacks import ModelCheckpoint\nmcp_save = ModelCheckpoint('../working/best_model', save_best_only=True, monitor='val_accuracy', mode='max')","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:23:05.969783Z","iopub.execute_input":"2023-10-02T07:23:05.970245Z","iopub.status.idle":"2023-10-02T07:23:05.976516Z","shell.execute_reply.started":"2023-10-02T07:23:05.970200Z","shell.execute_reply":"2023-10-02T07:23:05.975752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# early_stop = EarlyStopping(patience=10, restore_best_weights=True)\n# reduce_lr = ReduceLROnPlateau(factor=0.2, patience=3)\n\nhistory = model.fit(train_generator, validation_data=validation_generator, epochs=100, callbacks=[mcp_save])\n","metadata":{"execution":{"iopub.status.busy":"2023-10-02T07:23:05.978341Z","iopub.execute_input":"2023-10-02T07:23:05.979028Z","iopub.status.idle":"2023-10-02T09:00:43.621993Z","shell.execute_reply.started":"2023-10-02T07:23:05.978999Z","shell.execute_reply":"2023-10-02T09:00:43.620936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save(\"/kaggle/working/cifar10_model03.h5\")","metadata":{"execution":{"iopub.status.busy":"2023-10-02T09:30:06.237388Z","iopub.execute_input":"2023-10-02T09:30:06.237715Z","iopub.status.idle":"2023-10-02T09:30:09.623592Z","shell.execute_reply.started":"2023-10-02T09:30:06.237690Z","shell.execute_reply":"2023-10-02T09:30:09.622638Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Clear Memory\ndel train_generator, validation_generator\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2023-10-02T09:30:26.562070Z","iopub.execute_input":"2023-10-02T09:30:26.562438Z","iopub.status.idle":"2023-10-02T09:30:26.812921Z","shell.execute_reply.started":"2023-10-02T09:30:26.562411Z","shell.execute_reply":"2023-10-02T09:30:26.811576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the best model checkpoint\nfrom tensorflow.keras.models import load_model\nmodel_best = load_model('/kaggle/working/best_model', compile=False)\n\ntest_files = os.listdir(test_dir)\n\nbatch_size = 1024\npredicted_classes = []\n\nprint(f\"Total test files: {len(test_files)}\")\n\nfor i in range(0, len(test_files), batch_size):\n    print(f\"Processing images {i} to {i+batch_size}...\")\n    \n    batch_files = test_files[i:i+batch_size]\n    test_images = [load_img(test_dir + fname, target_size=(32,32)) for fname in batch_files]\n    test_array = np.array([img_to_array(img) for img in test_images]) / 255.0\n\n    batch_predictions = model_best.predict(test_array)\n    batch_labels = np.argmax(batch_predictions, axis=1)\n    predicted_classes.extend(batch_labels)\n\n    # Freeing up memory\n    del test_images, test_array, batch_predictions\n    gc.collect()\n\npredicted_classes = np.array(predicted_classes)\nprint(f\"Total predicted classes: {len(predicted_classes)}\")\n\n# rest of the code \n\n# Assuming these are the class names in the order you trained your model\nclass_names = [\"airplane\", \"automobile\", \"bird\", \"cat\", \"deer\", \"dog\", \"frog\", \"horse\", \"ship\", \"truck\"]\n\n# Map the numerical labels to class names\npredicted_class_names = [class_names[label] for label in predicted_classes]\n\n# Create CSV for Submission\nsubmission_df = pd.DataFrame({\n    'id': [int(fname.split('.')[0]) for fname in test_files],  # Convert to integer to ensure proper format\n    'label': predicted_class_names\n})\n\n# Sort the dataframe by 'id' column for cleaner output\nsubmission_df = submission_df.sort_values(by='id')\n\nsubmission_df.to_csv(\"/kaggle/working/submission02.csv\", index=False)\n\n","metadata":{"execution":{"iopub.status.busy":"2023-10-02T09:40:58.819483Z","iopub.execute_input":"2023-10-02T09:40:58.819838Z","iopub.status.idle":"2023-10-02T09:44:11.019014Z","shell.execute_reply.started":"2023-10-02T09:40:58.819810Z","shell.execute_reply":"2023-10-02T09:44:11.018032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}