{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"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\nimport cv2\nfor dirname, _, filenames in os.walk('/kaggle/input'):\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","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-01-12T08:06:29.953091Z","iopub.execute_input":"2025-01-12T08:06:29.953431Z","iopub.status.idle":"2025-01-12T08:06:30.519784Z","shell.execute_reply.started":"2025-01-12T08:06:29.953406Z","shell.execute_reply":"2025-01-12T08:06:30.519005Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport matplotlib.pyplot as plt \nimport keras\n\n(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T08:06:31.880732Z","iopub.execute_input":"2025-01-12T08:06:31.881102Z","iopub.status.idle":"2025-01-12T08:06:45.555857Z","shell.execute_reply.started":"2025-01-12T08:06:31.881081Z","shell.execute_reply":"2025-01-12T08:06:45.555138Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"x_train[0].shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T08:06:49.659316Z","iopub.execute_input":"2025-01-12T08:06:49.659601Z","iopub.status.idle":"2025-01-12T08:06:49.664514Z","shell.execute_reply.started":"2025-01-12T08:06:49.659580Z","shell.execute_reply":"2025-01-12T08:06:49.663809Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#plotting 5x5 images from xtrain with y_train:\n\ngrid = 7 \n\nfig, ax = plt.subplots(grid,grid,figsize=(12,12))\n\nfor i in range(grid*grid):\n    imaj = x_train[i]\n    imaj = cv2.cvtColor(imaj,cv2.COLOR_BGR2RGB)\n    ax[i//grid][i%grid].imshow(imaj)\n    ax[i//grid][i%grid].set_title(y_train[i],fontsize = 12)\n    ax[i//grid][i%grid].axis('off')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T20:22:56.118206Z","iopub.execute_input":"2025-01-11T20:22:56.118442Z","iopub.status.idle":"2025-01-11T20:22:58.756004Z","shell.execute_reply.started":"2025-01-11T20:22:56.118423Z","shell.execute_reply":"2025-01-11T20:22:58.755041Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# If no data augmentation","metadata":{}},{"cell_type":"code","source":"print('input data:',x_train.shape)\nprint('val data: ',x_test.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T20:22:58.757444Z","iopub.execute_input":"2025-01-11T20:22:58.757682Z","iopub.status.idle":"2025-01-11T20:22:58.762826Z","shell.execute_reply.started":"2025-01-11T20:22:58.757662Z","shell.execute_reply":"2025-01-11T20:22:58.761931Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Input\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Conv2D\nfrom tensorflow.keras.layers import MaxPooling2D\nfrom tensorflow.keras.layers import Flatten\nfrom tensorflow.keras.layers import Dropout\nfrom tensorflow.keras.layers import Dense\nfrom tensorflow.keras.layers import BatchNormalization","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T08:06:53.887566Z","iopub.execute_input":"2025-01-12T08:06:53.887845Z","iopub.status.idle":"2025-01-12T08:06:53.918020Z","shell.execute_reply.started":"2025-01-12T08:06:53.887824Z","shell.execute_reply":"2025-01-12T08:06:53.917410Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#normalizing the input is necessary\n\nx_train_norm = x_train/255\nx_test_norm = x_test/255","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T20:22:58.802040Z","iopub.execute_input":"2025-01-11T20:22:58.802308Z","iopub.status.idle":"2025-01-11T20:22:59.245429Z","shell.execute_reply.started":"2025-01-11T20:22:58.802282Z","shell.execute_reply":"2025-01-11T20:22:59.244762Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"x_train[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T20:22:59.246183Z","iopub.execute_input":"2025-01-11T20:22:59.246380Z","iopub.status.idle":"2025-01-11T20:22:59.251842Z","shell.execute_reply.started":"2025-01-11T20:22:59.246362Z","shell.execute_reply":"2025-01-11T20:22:59.251039Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"x_train_norm[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T20:22:59.252579Z","iopub.execute_input":"2025-01-11T20:22:59.252824Z","iopub.status.idle":"2025-01-11T20:22:59.267726Z","shell.execute_reply.started":"2025-01-11T20:22:59.252802Z","shell.execute_reply":"2025-01-11T20:22:59.266991Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# if using categorical cross entropy, then i need to make the output one hot encoding\nfrom tensorflow.keras.utils import to_categorical\n\nprint('first element of y_train',y_train[0])\n\ny_train_norm = to_categorical(y_train,num_classes= 10)\n\nprint('first element of norm_y_train', y_train_norm[0])\n\ny_test_norm = to_categorical(y_test,num_classes = 10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T08:06:58.513610Z","iopub.execute_input":"2025-01-12T08:06:58.513879Z","iopub.status.idle":"2025-01-12T08:06:58.523897Z","shell.execute_reply.started":"2025-01-12T08:06:58.513859Z","shell.execute_reply":"2025-01-12T08:06:58.523022Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"##  Input&Output Set Summary:\n\n* X needs to be normalized by 255\n* y needs to be categorical by one-hot encoding\n\n","metadata":{}},{"cell_type":"code","source":"x_train[0].shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T20:22:59.283951Z","iopub.execute_input":"2025-01-11T20:22:59.284255Z","iopub.status.idle":"2025-01-11T20:22:59.289244Z","shell.execute_reply.started":"2025-01-11T20:22:59.284225Z","shell.execute_reply":"2025-01-11T20:22:59.288442Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model Building","metadata":{}},{"cell_type":"markdown","source":"### Info about padding in model adding\n\n* **When to Use Padding:**\nImage Classification: Use padding='same' to maintain dimensions and extract hierarchical features across the entire image.\nObject Detection or Segmentation: padding='same' helps preserve spatial resolution, which is important for locating objects in an image.\nDeep Networks: To avoid shrinking dimensions too quickly, especially in deep CNNs.\n* **When Not to Use Padding:**\nFeature Reduction: If reducing spatial dimensions early in the network is desirable, use padding='valid'.\nSimple Datasets: For simpler tasks (e.g., MNIST), where preserving full spatial resolution isn't as critical.","metadata":{}},{"cell_type":"code","source":"x_train_norm.shape[1:]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T20:22:59.290073Z","iopub.execute_input":"2025-01-11T20:22:59.290268Z","iopub.status.idle":"2025-01-11T20:22:59.300431Z","shell.execute_reply.started":"2025-01-11T20:22:59.290252Z","shell.execute_reply":"2025-01-11T20:22:59.299702Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Keynotes:\n\n- For more complex datasets (e.g., CIFAR-10 or ImageNet), a single layer may not be sufficient to capture all low-level features. Adding multiple layers with 32 filters helps the model learn a richer set of low-level patterns.\n\n\n- (WO Padding in mid and high layers) Mid and high-level layers learn abstract and high-level patterns (e.g., object parts, shapes). These don’t require precise spatial details, so shrinking the feature maps without padding is fine.\n","metadata":{}},{"cell_type":"code","source":"# I prefer to have frontier layers more so it captures/extract quick information from the pic such as edge, corner, shape etc. \nfrom tensorflow.keras.layers import ReLU\n\nmodel = Sequential()\n\n#convolution layer:\nmodel.add(Input(shape = (x_train_norm.shape[1:]))) #32x32x3                  #input layer \n\nmodel.add(Conv2D(32,(3,3),activation = 'relu', padding = 'same',kernel_initializer='he_uniform'))      #Layer1 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(Conv2D(32,(3,3),activation = 'relu', padding='same',kernel_initializer='he_uniform'))        #Layer2 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(Conv2D(32,(3,3),activation = 'relu', padding='same',kernel_initializer='he_uniform'))        #Layer3 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size = (2,2)))\nmodel.add(Dropout(0.3))\n\nmodel.add(Conv2D(64,(3,3),activation = 'relu', padding = 'same',kernel_initializer='he_uniform'))      #Layer1 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(Conv2D(64,(3,3),activation = 'relu', padding='same',kernel_initializer='he_uniform'))        #Layer2 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(Conv2D(64,(3,3),activation = 'relu', padding='same',kernel_initializer='he_uniform'))        #Layer3 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size = (2,2)))\nmodel.add(Dropout(0.3))\n\nmodel.add(Conv2D(128,(3,3),activation = 'relu',padding='same',kernel_initializer='he_uniform'))                       #Layer4 (mid layer) \nmodel.add(BatchNormalization())\nmodel.add(Conv2D(128,(3,3),activation = 'relu',padding='same',kernel_initializer='he_uniform'))                       #Layer5 (mid layer)\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size = (2,2)))                            \nmodel.add(Dropout(0.3))\n\nmodel.add(Conv2D(256,(3,3),activation = 'relu',padding='same',kernel_initializer='he_uniform'))                       #Layer6 (high layer)\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(256,(3,3),activation = 'relu',padding='same',kernel_initializer='he_uniform'))                       #Layer7 (high layer)\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size = (2,2)))\nmodel.add(Dropout(0.4))\n\n\nmodel.add(Flatten())\n\n#fully connecteed layer:\nmodel.add(Dense(128))                                                  #Layer1(FC)\nmodel.add(BatchNormalization())\nmodel.add(ReLU()) \nmodel.add(Dropout(0.5))\n\nmodel.add(Dense(64))                                                  #Layer2(FC)\nmodel.add(BatchNormalization())\nmodel.add(ReLU()) \nmodel.add(Dropout(0.5))\n\nmodel.add(Dense(10,activation = 'softmax'))                            #Layer3(FC)\n\nmodel.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T20:22:59.303020Z","iopub.execute_input":"2025-01-11T20:22:59.303211Z","iopub.status.idle":"2025-01-11T20:23:00.618463Z","shell.execute_reply.started":"2025-01-11T20:22:59.303195Z","shell.execute_reply":"2025-01-11T20:23:00.617818Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#compiling\nfrom tensorflow.keras.callbacks import EarlyStopping\n\ncallback = keras.callbacks.EarlyStopping(\n    monitor=\"val_loss\",\n    patience=10,\n    verbose=1,\n    mode=\"min\",\n    restore_best_weights=True,\n)\n\ncross_entropy = keras.losses.CategoricalCrossentropy()\nadam = keras.optimizers.Adam(learning_rate = 0.00015)\n\nmodel.compile(loss=cross_entropy,optimizer=adam, metrics=['accuracy'])\n\nhistory = model.fit(x_train_norm,y_train_norm,\n                    epochs = 100,\n                    batch_size = 32,\n                    validation_data = (x_test_norm,y_test_norm),\n                    callbacks = [callback]\n                   )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T20:23:00.619752Z","iopub.execute_input":"2025-01-11T20:23:00.620028Z","iopub.status.idle":"2025-01-11T20:32:14.842332Z","shell.execute_reply.started":"2025-01-11T20:23:00.620007Z","shell.execute_reply":"2025-01-11T20:32:14.841599Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ev = model.evaluate(x_test_norm,y_test_norm)\nprint('Test Accuracy: {}'.format(ev[1]))\n\nplt.plot(history.history['accuracy'])\nplt.plot(history.history['val_accuracy'])\nplt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.title('model accuracy')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train_acc', 'val_acc','train_loss','val_loss'], loc='upper left')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T20:32:14.843301Z","iopub.execute_input":"2025-01-11T20:32:14.843521Z","iopub.status.idle":"2025-01-11T20:32:16.325480Z","shell.execute_reply.started":"2025-01-11T20:32:14.843503Z","shell.execute_reply":"2025-01-11T20:32:16.324801Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# If data augmentation","metadata":{}},{"cell_type":"code","source":"# I prefer to have frontier layers more so it captures/extract quick information from the pic such as edge, corner, shape etc. \nfrom tensorflow.keras.layers import ReLU\n\nmodel = Sequential()\n\n#convolution layer:\nmodel.add(Input(shape = (x_train.shape[1:]))) #32x32x3                  #input layer \n\nmodel.add(Conv2D(32,(3,3),activation = 'relu', padding = 'same',kernel_initializer='he_uniform'))      #Layer1 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(Conv2D(32,(3,3),activation = 'relu', padding='same',kernel_initializer='he_uniform'))        #Layer2 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(Conv2D(32,(3,3),activation = 'relu', padding='same',kernel_initializer='he_uniform'))        #Layer3 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size = (2,2)))\nmodel.add(Dropout(0.1))\n\nmodel.add(Conv2D(64,(3,3),activation = 'relu', padding = 'same',kernel_initializer='he_uniform'))      #Layer1 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(Conv2D(64,(3,3),activation = 'relu', padding='same',kernel_initializer='he_uniform'))        #Layer2 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(Conv2D(64,(3,3),activation = 'relu', padding='same',kernel_initializer='he_uniform'))        #Layer3 (early layer) \nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size = (2,2)))\nmodel.add(Dropout(0.2))\n\nmodel.add(Conv2D(128,(3,3),activation = 'relu',padding='same',kernel_initializer='he_uniform'))                       #Layer4 (mid layer) \nmodel.add(BatchNormalization())\nmodel.add(Conv2D(128,(3,3),activation = 'relu',padding='same',kernel_initializer='he_uniform'))                       #Layer5 (mid layer)\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(128,(3,3),activation = 'relu',padding='same',kernel_initializer='he_uniform'))                       #Layer5 (mid layer)\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size = (2,2)))                            \nmodel.add(Dropout(0.3))\n\nmodel.add(Conv2D(256,(3,3),activation = 'relu',padding='same',kernel_initializer='he_uniform'))                       #Layer6 (high layer)\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(256,(3,3),activation = 'relu',padding='same',kernel_initializer='he_uniform'))                       #Layer7 (high layer)\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(256,(3,3),activation = 'relu',padding='same',kernel_initializer='he_uniform'))                       #Layer7 (high layer)\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size = (2,2)))\nmodel.add(Dropout(0.3))\n\n\nmodel.add(Flatten())\n\n#fully connecteed layer:\nmodel.add(Dense(128))                                                  #Layer1(FC)\nmodel.add(BatchNormalization())\nmodel.add(ReLU()) \nmodel.add(Dropout(0.5))\n\nmodel.add(Dense(10,activation = 'softmax'))                            #Layer3(FC)\n\nmodel.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T08:07:18.863661Z","iopub.execute_input":"2025-01-12T08:07:18.863982Z","iopub.status.idle":"2025-01-12T08:07:20.281365Z","shell.execute_reply.started":"2025-01-12T08:07:18.863955Z","shell.execute_reply":"2025-01-12T08:07:20.280639Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport math\n\ntrain_datagen  = ImageDataGenerator(\n    rotation_range=20,         # Random rotation in degrees\n    width_shift_range=0.2,     # Random horizontal shift\n    height_shift_range=0.2,    # Random vertical shift\n    shear_range=0.15,          # Shear angle in counter-clockwise direction\n    zoom_range=0.2,            # Random zoom\n    horizontal_flip=True,      # Randomly flip images horizontally\n    fill_mode='nearest',        # Fill pixels outside boundaries  \n    rescale = 1./255           # Normalize pixel values to [0, 1]\n)\n\n#no augmentation\nval_datagen = ImageDataGenerator(\n    rescale = 1./225\n) # Here, it ensure not using normalization seperately. it makes it normalized.\n\n\ncross_entropy = keras.losses.CategoricalCrossentropy()\nadam = keras.optimizers.Adam(learning_rate = 0.0001)\n\nmodel.compile(loss=cross_entropy,optimizer=adam, metrics=['accuracy'])\n\ncallback = keras.callbacks.EarlyStopping(\n                                            monitor=\"val_loss\",\n                                            #min_delta=0,\n                                            patience=10,\n                                            verbose=1,\n                                            mode=\"min\",\n                                            #baseline=None,\n                                            restore_best_weights=True,\n                                            #start_from_epoch=0\n                                            )\n\ntrain_genetor = train_datagen.flow(x_train,y_train_norm,batch_size = 32, shuffle = True)\nval_generator = val_datagen.flow(x_test, y_test_norm, batch_size=32, shuffle=False)\n\n\naug_history = model.fit(train_genetor,\n                        validation_data = val_generator,\n                        epochs =  100, verbose = 1, callbacks = [callback])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T08:07:25.885349Z","iopub.execute_input":"2025-01-12T08:07:25.885675Z","iopub.status.idle":"2025-01-12T08:59:02.048740Z","shell.execute_reply.started":"2025-01-12T08:07:25.885650Z","shell.execute_reply":"2025-01-12T08:59:02.048051Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#no augmentation\ntest_datagen = ImageDataGenerator(\n    rescale = 1./225\n) # Here, it ensure not using normalization seperately. it makes it normalized.\n\ntest_gen = test_datagen.flow(x_test,y_test_norm,shuffle = False)\n\neval = model.evaluate(test_gen,verbose = 1)\n# Print results\nprint(f\"Test Loss: {eval[0]}\")\nprint(f\"Test Accuracy: {eval[1]}\")\n\n\nplt.plot(aug_history.history['accuracy'])\nplt.plot(aug_history.history['val_accuracy'])\nplt.plot(aug_history.history['loss'])\nplt.plot(aug_history.history['val_loss'])\nplt.title('model accuracy')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train_acc', 'val_acc','train_loss','val_loss'], loc='upper left')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T09:00:15.511708Z","iopub.execute_input":"2025-01-12T09:00:15.512330Z","iopub.status.idle":"2025-01-12T09:00:16.979291Z","shell.execute_reply.started":"2025-01-12T09:00:15.512302Z","shell.execute_reply":"2025-01-12T09:00:16.978480Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pip install py7zr","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T09:00:51.174315Z","iopub.execute_input":"2025-01-12T09:00:51.174599Z","iopub.status.idle":"2025-01-12T09:00:57.545970Z","shell.execute_reply.started":"2025-01-12T09:00:51.174579Z","shell.execute_reply":"2025-01-12T09:00:57.544898Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_link = '/kaggle/input/cifar-10/test.7z'\nmydir = '/kaggle/working/' \n\nimport py7zr\n\narchive = py7zr.SevenZipFile(test_link, mode='r')\narchive.extractall(path=mydir)\narchive.close()\n\ntest_list = []\ntest_path = '/kaggle/working/test/'\n\nfor each in os.listdir(test_path):\n\n    test_list.append(os.path.join(test_path,each))\n\ntest_arr = [] #images in np.arr form\ntest_norm= [] #images in norm form [0] to [1]\ntest_id = [] #id column in submission excel\nfor link in test_list:\n    test_id.append(os.path.splitext(os.path.basename(link))[0])\n    imaj = cv2.imread(link)\n    test_arr.append(imaj)\n    test_norm.append((imaj/255.0))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T09:01:02.541544Z","iopub.execute_input":"2025-01-12T09:01:02.542007Z","iopub.status.idle":"2025-01-12T09:03:50.889669Z","shell.execute_reply.started":"2025-01-12T09:01:02.541963Z","shell.execute_reply":"2025-01-12T09:03:50.888952Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Check the test shape:\n(cv2.imread(test_list[0])).shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T09:04:09.905222Z","iopub.execute_input":"2025-01-12T09:04:09.905569Z","iopub.status.idle":"2025-01-12T09:04:09.910890Z","shell.execute_reply.started":"2025-01-12T09:04:09.905545Z","shell.execute_reply":"2025-01-12T09:04:09.910185Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_norm[0].shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T09:04:26.649930Z","iopub.execute_input":"2025-01-12T09:04:26.650311Z","iopub.status.idle":"2025-01-12T09:04:26.656356Z","shell.execute_reply.started":"2025-01-12T09:04:26.650272Z","shell.execute_reply":"2025-01-12T09:04:26.655332Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"prediction_test = model.predict(test_norm) ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-12T09:04:30.835535Z","iopub.execute_input":"2025-01-12T09:04:30.835840Z","execution_failed":"2025-01-12T09:56:45.899Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class_object= ['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']\nnum_object = [0,1,2,3,4,5,6,7,8,9]\nnum_to_class = dict(zip(num_object, class_object))\n# Convert to class names\nclass_predictions = [num_to_class[num] for num in prediction_test]\nprint(len(class_predictions))","metadata":{"trusted":true,"execution":{"execution_failed":"2025-01-12T09:56:45.899Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Save to CSV (optional)\nimport pandas as pd\ndf = pd.DataFrame({'id': test_id, 'label': class_predictions})\ndf.to_csv('/kaggle/working/test_prediction_aug.csv', index=False)\nprint(\"Predictions saved to test_prediction_aug.csv\")","metadata":{"trusted":true,"execution":{"execution_failed":"2025-01-12T09:56:45.900Z"}},"outputs":[],"execution_count":null}]}