{"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":"gpu","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":"!pip install py7zr","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T15:50:30.397254Z","iopub.execute_input":"2025-09-26T15:50:30.397415Z","iopub.status.idle":"2025-09-26T15:50:36.141102Z","shell.execute_reply.started":"2025-09-26T15:50:30.397400Z","shell.execute_reply":"2025-09-26T15:50:36.140384Z"},"_kg_hide-input":true,"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import shutil, os\n\n# 🚨 CAREFUL: This deletes everything in /kaggle/working\nshutil.rmtree(\"/kaggle/working\", ignore_errors=True)\nos.makedirs(\"/kaggle/working\", exist_ok=True)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T16:24:47.502677Z","iopub.execute_input":"2025-09-26T16:24:47.502972Z","iopub.status.idle":"2025-09-26T16:24:47.507336Z","shell.execute_reply.started":"2025-09-26T16:24:47.502949Z","shell.execute_reply":"2025-09-26T16:24:47.506771Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## ResNet","metadata":{}},{"cell_type":"code","source":"\nimport os, glob\nimport numpy as np\nimport pandas as pd\nfrom PIL import Image\n\nimport py7zr \n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\n\n# --- Paths ---\nWORK_DIR = \"/kaggle/working\"\nINPUT_DIR = \"/kaggle/input/cifar-10\"\nTRAIN_7Z = f\"{INPUT_DIR}/train.7z\"\nTEST_7Z  = f\"{INPUT_DIR}/test.7z\"\nTRAIN_CSV = f\"{INPUT_DIR}/trainLabels.csv\"\n\nTRAIN_DIR = f\"{WORK_DIR}/train\"\nTEST_DIR  = f\"{WORK_DIR}/test\"\n\n# --- Extract train/test ---\nprint(\"Extracting train...\")\nwith py7zr.SevenZipFile(TRAIN_7Z, mode='r') as z:\n    z.extractall(path=TRAIN_DIR)\n\nprint(\"Extracting test...\")\nwith py7zr.SevenZipFile(TEST_7Z, mode='r') as z:\n    z.extractall(path=TEST_DIR)\n\nprint(\"Train files:\", len(glob.glob(f\"{TRAIN_DIR}/train/*.png\")))\nprint(\"Test files:\", len(glob.glob(f\"{TEST_DIR}/test/*.png\")))\n\n# --- Load labels ---\nTRAIN_DIR = f\"{TRAIN_DIR}/train\"\nTEST_DIR = f\"{TEST_DIR}/test\"\ndf_train = pd.read_csv(TRAIN_CSV)\nCLASS_NAMES = ['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']\nlabel2id = {c:i for i,c in enumerate(CLASS_NAMES)}\nid2label = {i:c for c,i in label2id.items()}\ndf_train['label_id'] = df_train['label'].map(label2id)\n\n\n# --- Load train images into memory ---\ndef load_images(df, img_dir):\n    X = []\n    y = []\n    for _, row in df.iterrows():\n        img_id = row['id']\n        label = row['label_id']\n        path = os.path.join(img_dir, f\"{img_id}.png\")\n        img = np.array(Image.open(path).convert(\"RGB\"), dtype=np.uint8)\n        X.append(img)\n        y.append(label)\n    return np.array(X), np.array(y)\n\nX, y = load_images(df_train, TRAIN_DIR)\nprint(\"Train data:\", X.shape, y.shape)\n\n# --- Train/Val split ---\nfrom sklearn.model_selection import train_test_split\nX_train, X_val, y_train, y_val = train_test_split(\n    X, y, test_size=0.1, stratify=y, random_state=42\n)\n\n# --- Preprocessing & Augmentation ---\ntrain_datagen = keras.preprocessing.image.ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=15,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    horizontal_flip=True,\n)\nval_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\ntrain_gen = train_datagen.flow(X_train, y_train, batch_size=152)\nval_gen   = val_datagen.flow(X_val, y_val, batch_size=152)\n\n\n# --- ResNet Model (with residual connections) ---\nfrom tensorflow.keras import layers, models\n\ndef residual_block(x, filters, downsample=False):\n    shortcut = x\n    stride = 2 if downsample else 1\n\n    x = layers.Conv2D(filters, (3,3), strides=stride, padding='same', activation='relu')(x)\n    x = layers.Conv2D(filters, (3,3), strides=1, padding='same')(x)\n\n    if downsample or shortcut.shape[-1] != filters:\n        shortcut = layers.Conv2D(filters, (1,1), strides=stride, padding='same')(shortcut)\n\n    x = layers.Add()([x, shortcut])\n    x = layers.ReLU()(x)\n    return x\n\ndef build_resnet_small(input_shape=(32,32,3), num_classes=10):\n    inputs = layers.Input(shape=input_shape)\n\n    x = layers.Conv2D(32, (3,3), strides=1, padding='same', activation='relu')(inputs)\n\n    # Stage 1\n    x = residual_block(x, 32)\n    x = residual_block(x, 32)\n\n    # Stage 2\n    x = residual_block(x, 64, downsample=True)\n    x = residual_block(x, 64)\n\n    # Stage 3\n    x = residual_block(x, 128, downsample=True)\n    x = residual_block(x, 128)\n\n    x = layers.GlobalAveragePooling2D()(x)\n    outputs = layers.Dense(num_classes, activation='softmax')(x)\n\n    model = models.Model(inputs, outputs)\n    return model\n\nmodel = build_resnet_small()\nmodel.compile(optimizer=keras.optimizers.Adam(1e-3),\n              loss='sparse_categorical_crossentropy',\n              metrics=['accuracy'])\nmodel.summary()\n\n\n# --- Train ---\nEPOCHS = 50\nhistory = model.fit(train_gen, validation_data=val_gen, epochs=EPOCHS)\n\n# --- Evaluate on val set (proxy for Kaggle score) ---\nval_loss, val_acc = model.evaluate(val_gen, verbose=0)\nprint(\"Validation Accuracy:\", val_acc)\n\n# --- Predict on Kaggle test set (300k images) ---\ntest_ids = [int(os.path.splitext(os.path.basename(p))[0]) for p in glob.glob(f\"{TEST_DIR}/*.png\")]\ntest_ids.sort()\n\ndef load_test_image(img_id):\n    path = os.path.join(TEST_DIR, f\"{img_id}.png\")\n    img = np.array(Image.open(path).convert(\"RGB\"), dtype=np.uint8)\n    return img\n\nX_test = np.array([load_test_image(i) for i in test_ids])\nX_test = X_test.astype('float32') / 255.0\n\ny_pred = model.predict(X_test, batch_size=256)\nlabels = [id2label[np.argmax(p)] for p in y_pred]\n\nsub = pd.DataFrame({\"id\": test_ids, \"label\": labels})\nsub.to_csv(\"submission.csv\", index=False)\nprint(\"Saved submission.csv:\", sub.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T16:25:28.657270Z","iopub.execute_input":"2025-09-26T16:25:28.657536Z","iopub.status.idle":"2025-09-26T16:47:00.014321Z","shell.execute_reply.started":"2025-09-26T16:25:28.657518Z","shell.execute_reply":"2025-09-26T16:47:00.013584Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Simple ConvNet","metadata":{}},{"cell_type":"code","source":"# ======================================================\n# CIFAR-10 Kaggle Competition (Keras ConvNet, random init)\n# ======================================================\n# Dataset files:\n#   /kaggle/input/cifar-10/train.7z\n#   /kaggle/input/cifar-10/test.7z\n#   /kaggle/input/cifar-10/trainLabels.csv\n#\n# Output:\n#   /kaggle/working/submission.csv\n# ======================================================\n\nimport os, glob\nimport numpy as np\nimport pandas as pd\nfrom PIL import Image\n\nimport py7zr \n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\n\n# --- Paths ---\nWORK_DIR = \"/kaggle/working\"\nINPUT_DIR = \"/kaggle/input/cifar-10\"\nTRAIN_7Z = f\"{INPUT_DIR}/train.7z\"\nTEST_7Z  = f\"{INPUT_DIR}/test.7z\"\nTRAIN_CSV = f\"{INPUT_DIR}/trainLabels.csv\"\n\nTRAIN_DIR = f\"{WORK_DIR}/train\"\nTEST_DIR  = f\"{WORK_DIR}/test\"\n\n# --- Extract train/test ---\nprint(\"Extracting train...\")\nwith py7zr.SevenZipFile(TRAIN_7Z, mode='r') as z:\n    z.extractall(path=TRAIN_DIR)\n\nprint(\"Extracting test...\")\nwith py7zr.SevenZipFile(TEST_7Z, mode='r') as z:\n    z.extractall(path=TEST_DIR)\n\nprint(\"Train files:\", len(glob.glob(f\"{TRAIN_DIR}/train/*.png\")))\nprint(\"Test files:\", len(glob.glob(f\"{TEST_DIR}/test/*.png\")))\n\n# --- Load labels ---\nTRAIN_DIR = f\"{TRAIN_DIR}/train\"\nTEST_DIR = f\"{TEST_DIR}/test\"\ndf_train = pd.read_csv(TRAIN_CSV)\nCLASS_NAMES = ['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']\nlabel2id = {c:i for i,c in enumerate(CLASS_NAMES)}\nid2label = {i:c for c,i in label2id.items()}\ndf_train['label_id'] = df_train['label'].map(label2id)\n\n# --- Load train images into memory ---\ndef load_images(df, img_dir):\n    X = []\n    y = []\n    for _, row in df.iterrows():\n        img_id = row['id']\n        label = row['label_id']\n        path = os.path.join(img_dir, f\"{img_id}.png\")\n        img = np.array(Image.open(path).convert(\"RGB\"), dtype=np.uint8)\n        X.append(img)\n        y.append(label)\n    return np.array(X), np.array(y)\n\nX, y = load_images(df_train, TRAIN_DIR)\nprint(\"Train data:\", X.shape, y.shape)\n\n# --- Train/Val split ---\nfrom sklearn.model_selection import train_test_split\nX_train, X_val, y_train, y_val = train_test_split(\n    X, y, test_size=0.1, stratify=y, random_state=42\n)\n\n# --- Preprocessing & Augmentation ---\ntrain_datagen = keras.preprocessing.image.ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=15,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    horizontal_flip=True,\n)\nval_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\ntrain_gen = train_datagen.flow(X_train, y_train, batch_size=128)\nval_gen   = val_datagen.flow(X_val, y_val, batch_size=128)\n\n# --- ConvNet Model ---\ndef build_convnet():\n    model = keras.Sequential([\n        layers.Conv2D(64, (3,3), activation='relu', padding='same', input_shape=(32,32,3)),\n        layers.BatchNormalization(),\n        layers.Conv2D(64, (3,3), activation='relu', padding='same'),\n        layers.BatchNormalization(),\n        layers.MaxPooling2D((2,2)),\n        layers.Dropout(0.25),\n\n        layers.Conv2D(128, (3,3), activation='relu', padding='same'),\n        layers.BatchNormalization(),\n        layers.Conv2D(128, (3,3), activation='relu', padding='same'),\n        layers.BatchNormalization(),\n        layers.MaxPooling2D((2,2)),\n        layers.Dropout(0.25),\n\n        layers.Conv2D(256, (3,3), activation='relu', padding='same'),\n        layers.BatchNormalization(),\n        layers.Conv2D(256, (3,3), activation='relu', padding='same'),\n        layers.BatchNormalization(),\n        layers.MaxPooling2D((2,2)),\n        layers.Dropout(0.25),\n\n        layers.Flatten(),\n        layers.Dense(512, activation='relu'),\n        layers.BatchNormalization(),\n        layers.Dropout(0.5),\n        layers.Dense(len(CLASS_NAMES), activation='softmax')\n    ])\n    return model\n\nmodel = build_convnet()\nmodel.compile(optimizer=keras.optimizers.Adam(1e-3),\n              loss='sparse_categorical_crossentropy',\n              metrics=['accuracy'])\nmodel.summary()\n\n# --- Train ---\nEPOCHS = 50\nhistory = model.fit(train_gen, validation_data=val_gen, epochs=EPOCHS)\n\n# --- Evaluate on val set (proxy for Kaggle score) ---\nval_loss, val_acc = model.evaluate(val_gen, verbose=0)\nprint(\"Validation Accuracy:\", val_acc)\n\n# --- Predict on Kaggle test set (300k images) ---\ntest_ids = [int(os.path.splitext(os.path.basename(p))[0]) for p in glob.glob(f\"{TEST_DIR}/*.png\")]\ntest_ids.sort()\n\ndef load_test_image(img_id):\n    path = os.path.join(TEST_DIR, f\"{img_id}.png\")\n    img = np.array(Image.open(path).convert(\"RGB\"), dtype=np.uint8)\n    return img\n\nX_test = np.array([load_test_image(i) for i in test_ids])\nX_test = X_test.astype('float32') / 255.0\n\ny_pred = model.predict(X_test, batch_size=256)\nlabels = [id2label[np.argmax(p)] for p in y_pred]\n\nsub = pd.DataFrame({\"id\": test_ids, \"label\": labels})\nsub.to_csv(\"submission.csv\", index=False)\nprint(\"Saved submission.csv:\", sub.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T01:24:55.425162Z","iopub.execute_input":"2025-09-23T01:24:55.425785Z","iopub.status.idle":"2025-09-23T01:46:12.335660Z","shell.execute_reply.started":"2025-09-23T01:24:55.425761Z","shell.execute_reply":"2025-09-23T01:46:12.334766Z"},"jupyter":{"outputs_hidden":true,"source_hidden":true},"collapsed":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nmodel.summary","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T01:59:24.444957Z","iopub.execute_input":"2025-09-23T01:59:24.445254Z","iopub.status.idle":"2025-09-23T01:59:24.449823Z","shell.execute_reply.started":"2025-09-23T01:59:24.445237Z","shell.execute_reply":"2025-09-23T01:59:24.449256Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}