{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","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":31090,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"\n!pip install -q py7zr tqdm\n\nimport tensorflow as tf\nfrom tensorflow.keras.datasets import cifar10\n\n# Load CIFAR-10\n(x_train, y_train), (x_test, y_test) = cifar10.load_data()\n\n# Normalize\nx_train = x_train.astype(\"float32\") / 255.0\nx_test = x_test.astype(\"float32\") / 255.0\n\n# One-hot encode labels\ny_train = tf.keras.utils.to_categorical(y_train, 10)\ny_test = tf.keras.utils.to_categorical(y_test, 10)\n\nprint(\"Train:\", x_train.shape, y_train.shape)\nprint(\"Test:\", x_test.shape, y_test.shape)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-09-20T18:36:13.470975Z","iopub.execute_input":"2025-09-20T18:36:13.471611Z","iopub.status.idle":"2025-09-20T18:36:26.907645Z","shell.execute_reply.started":"2025-09-20T18:36:13.471590Z","shell.execute_reply":"2025-09-20T18:36:26.906917Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\ndatagen = ImageDataGenerator(\n    rotation_range=15,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    horizontal_flip=True,\n    zoom_range=0.1,\n    shear_range=0.1,\n    fill_mode='reflect'\n)\ndatagen.fit(x_train)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T18:36:26.909640Z","iopub.execute_input":"2025-09-20T18:36:26.910347Z","iopub.status.idle":"2025-09-20T18:36:27.126902Z","shell.execute_reply.started":"2025-09-20T18:36:26.910320Z","shell.execute_reply":"2025-09-20T18:36:27.126318Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras import layers, models, regularizers\n\ndef build_cifar_model():\n    model = models.Sequential()\n\n    # Block 1\n    model.add(layers.Conv2D(64, (3,3), padding='same', activation='relu',\n                            kernel_initializer='he_normal', input_shape=(32,32,3)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Conv2D(64, (3,3), padding='same', activation='relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.MaxPooling2D((2,2)))\n    model.add(layers.Dropout(0.3))\n\n    # Block 2\n    model.add(layers.Conv2D(128, (3,3), padding='same', activation='relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Conv2D(128, (3,3), padding='same', activation='relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.MaxPooling2D((2,2)))\n    model.add(layers.Dropout(0.4))\n\n    # Block 3\n    model.add(layers.Conv2D(256, (3,3), padding='same', activation='relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Conv2D(256, (3,3), padding='same', activation='relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.MaxPooling2D((2,2)))\n    model.add(layers.Dropout(0.4))\n\n    # Dense layers\n    model.add(layers.Flatten())\n    model.add(layers.Dense(512, activation='relu', kernel_regularizer=regularizers.l2(1e-4)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dropout(0.5))\n    model.add(layers.Dense(10, activation='softmax'))\n\n    return model\n\nmodel = build_cifar_model()\nmodel.summary()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T18:36:27.127603Z","iopub.execute_input":"2025-09-20T18:36:27.127856Z","iopub.status.idle":"2025-09-20T18:36:30.626601Z","shell.execute_reply.started":"2025-09-20T18:36:27.127832Z","shell.execute_reply":"2025-09-20T18:36:30.625850Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras import optimizers\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint\n\nmodel.compile(\n    optimizer=optimizers.Adam(learning_rate=1e-3),\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)\n\ncallbacks = [\n    ReduceLROnPlateau(monitor='val_accuracy', factor=0.5, patience=3, verbose=1, min_lr=1e-5),\n    EarlyStopping(monitor='val_accuracy', patience=7, restore_best_weights=True),\n    ModelCheckpoint(\"best_model.h5\", monitor='val_accuracy', save_best_only=True, verbose=1)\n]\n\nhistory = model.fit(\n    datagen.flow(x_train, y_train, batch_size=64),\n    steps_per_epoch=x_train.shape[0] // 64,\n    epochs=60,\n    validation_data=(x_test, y_test),\n    callbacks=callbacks,\n    verbose=2\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T18:36:30.627399Z","iopub.execute_input":"2025-09-20T18:36:30.627656Z","iopub.status.idle":"2025-09-20T18:48:26.039073Z","shell.execute_reply.started":"2025-09-20T18:36:30.627639Z","shell.execute_reply":"2025-09-20T18:48:26.038315Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Step 1: Imports running...\")\n\nimport os\nimport numpy as np\nimport pandas as pd\nimport cv2\nfrom tensorflow.keras.models import load_model\nfrom tqdm import tqdm\n\nprint(\"Step 1: Imports complete ✅\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T18:48:26.236053Z","iopub.execute_input":"2025-09-20T18:48:26.236340Z","iopub.status.idle":"2025-09-20T18:48:26.264858Z","shell.execute_reply.started":"2025-09-20T18:48:26.236311Z","shell.execute_reply":"2025-09-20T18:48:26.264340Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import py7zr\nimport os\nimport glob\n\nprint(\"⏳ Extracting Kaggle test set (300,000 images)...\")\n\ntest_archive = \"/kaggle/input/cifar-10/test.7z\"\n\nwith py7zr.SevenZipFile(test_archive, mode='r') as archive:\n    archive.extractall(path=\"./test\")\n\nprint(\"✅ Extraction complete!\")\n\n# Recursively check all PNG files\nnum_files = len(glob.glob('./test/**/*.png', recursive=True))\nprint(\"🖼️ Total extracted images:\", num_files)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T18:48:26.265643Z","iopub.execute_input":"2025-09-20T18:48:26.265880Z","iopub.status.idle":"2025-09-20T18:50:32.444306Z","shell.execute_reply.started":"2025-09-20T18:48:26.265854Z","shell.execute_reply":"2025-09-20T18:50:32.443638Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"⏳ Step 1: Imports running...\")\n\n# Safe installation for version saving\ntry:\n    import py7zr\nexcept ModuleNotFoundError:\n    !pip install -q py7zr tqdm\n    import py7zr\n\nimport os\nimport glob\nimport numpy as np\nimport cv2\nfrom tqdm import tqdm\n\nprint(\"✅ Step 1: Imports complete\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T18:50:32.445152Z","iopub.execute_input":"2025-09-20T18:50:32.445428Z","iopub.status.idle":"2025-09-20T18:50:32.451118Z","shell.execute_reply.started":"2025-09-20T18:50:32.445398Z","shell.execute_reply":"2025-09-20T18:50:32.450401Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport cv2\nimport numpy as np\nfrom tqdm import tqdm\n\nprint(\"⏳ Preprocessing Kaggle test images...\")\n\ntest_path = \"./test/\"  \n\n# Recursively search for PNG files in all subfolders\nfile_names = sorted(\n    [os.path.join(dp, f) for dp, dn, fn in os.walk(test_path) for f in fn if f.endswith('.png')],\n    key=lambda x: int(os.path.basename(x).split('.')[0])\n)\n\nX_test = []\nfor f in tqdm(file_names, desc=\"Processing images\"):\n    img = cv2.imread(f)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    img = cv2.resize(img, (32, 32))\n    img = img.astype(\"float32\") / 255.0\n    X_test.append(img)\n\nX_test = np.array(X_test)\n\nprint(\"✅ Preprocessing complete! Final test shape:\", X_test.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T18:50:32.451994Z","iopub.execute_input":"2025-09-20T18:50:32.452236Z","iopub.status.idle":"2025-09-20T18:51:08.831504Z","shell.execute_reply.started":"2025-09-20T18:50:32.452203Z","shell.execute_reply":"2025-09-20T18:51:08.830545Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"⏳ Running predictions on Kaggle test set...\")\n\n# Predict probabilities\npred_probs = model.predict(X_test, batch_size=128, verbose=1)\n\n# Convert to class labels\npred_classes = np.argmax(pred_probs, axis=1)\n\nprint(\"✅ Predictions complete! Sample output:\", pred_classes[:10])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T18:51:08.832593Z","iopub.execute_input":"2025-09-20T18:51:08.832896Z","iopub.status.idle":"2025-09-20T18:51:48.478769Z","shell.execute_reply.started":"2025-09-20T18:51:08.832870Z","shell.execute_reply":"2025-09-20T18:51:48.478032Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# CIFAR-10 label mapping\nlabel_map = {\n    0: \"airplane\",\n    1: \"automobile\",\n    2: \"bird\",\n    3: \"cat\",\n    4: \"deer\",\n    5: \"dog\",\n    6: \"frog\",\n    7: \"horse\",\n    8: \"ship\",\n    9: \"truck\"\n}\n\n# Convert numeric predictions to text labels\npred_labels = [label_map[i] for i in pred_classes]\n\n# Build submission DataFrame with numeric IDs\nsubmission = pd.DataFrame({\n    \"id\": range(1, len(pred_labels) + 1),   # strictly 1,2,3...300000\n    \"label\": pred_labels\n})\n\n# Save correctly formatted CSV\nsubmission.to_csv(\"submission.csv\", index=False)\nprint(\"✅ submission.csv created with correct ID format!\")\nsubmission.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T18:51:48.479646Z","iopub.execute_input":"2025-09-20T18:51:48.479951Z","iopub.status.idle":"2025-09-20T18:51:48.828096Z","shell.execute_reply.started":"2025-09-20T18:51:48.479930Z","shell.execute_reply":"2025-09-20T18:51:48.827404Z"}},"outputs":[],"execution_count":null}]}