{"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":"# Cell 1: Install packages\nprint(\"Installing packages...\")\n!apt-get update -qq > /dev/null 2>&1\n!apt-get install -y libarchive-dev -qq > /dev/null 2>&1\n!pip install -q libarchive tensorflow > /dev/null 2>&1\nprint(\"Packages installed!\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-09-24T11:57:58.606256Z","iopub.execute_input":"2025-09-24T11:57:58.606992Z","iopub.status.idle":"2025-09-24T11:58:06.946359Z","shell.execute_reply.started":"2025-09-24T11:57:58.606955Z","shell.execute_reply":"2025-09-24T11:58:06.945236Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 2: Extract test data\nimport libarchive.public, glob, os\n\nprint(\"Extracting test data...\")\nsevenz = glob.glob('/kaggle/input/**/test*.7z', recursive=True)\nif sevenz:\n    os.makedirs('test', exist_ok=True)\n    list(libarchive.public.file_pour(sevenz[0]))\n    print(f\"Extraction complete! Files: {len(glob.glob('test/*'))}\")\nelse:\n    print(\"No test.7z found\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T11:58:10.08343Z","iopub.execute_input":"2025-09-24T11:58:10.083701Z","iopub.status.idle":"2025-09-24T11:59:22.954914Z","shell.execute_reply.started":"2025-09-24T11:58:10.083675Z","shell.execute_reply":"2025-09-24T11:59:22.954118Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 3: Load data (minimal output)\nimport os\nos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'\nimport tensorflow as tf\ntf.get_logger().setLevel('ERROR')\nimport numpy as np\n\n# Load and prepare data\n(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()\nx_train, x_test = x_train.astype('float32')/255.0, x_test.astype('float32')/255.0\ny_train = tf.keras.utils.to_categorical(y_train, 10)\ny_test = tf.keras.utils.to_categorical(y_test, 10)\n\nprint(\"✓ CIFAR-10 data ready!\")\nprint(f\"Train: {x_train.shape}, Test: {x_test.shape}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T13:22:09.339303Z","iopub.execute_input":"2025-09-24T13:22:09.33958Z","iopub.status.idle":"2025-09-24T13:22:11.850053Z","shell.execute_reply.started":"2025-09-24T13:22:09.33956Z","shell.execute_reply":"2025-09-24T13:22:11.849262Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 4: Build model\nfrom tensorflow.keras import layers, models\n\nprint(\"Building model...\")\nmodel = models.Sequential([\n    layers.Conv2D(32, (3,3), activation='relu', input_shape=(32,32,3)),\n    layers.MaxPooling2D((2,2)),\n    layers.Conv2D(64, (3,3), activation='relu'),\n    layers.MaxPooling2D((2,2)),\n    layers.Conv2D(64, (3,3), activation='relu'),\n    layers.Flatten(),\n    layers.Dense(64, activation='relu'),\n    layers.Dense(10, activation='softmax')\n])\nmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\nprint(\"Model ready!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T13:22:21.18328Z","iopub.execute_input":"2025-09-24T13:22:21.183533Z","iopub.status.idle":"2025-09-24T13:22:21.231108Z","shell.execute_reply.started":"2025-09-24T13:22:21.183516Z","shell.execute_reply":"2025-09-24T13:22:21.230418Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 5: Build CNN model\ndef create_cnn_model():\n    model = models.Sequential()\n    \n    # First Conv Block\n    model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.MaxPooling2D((2, 2)))\n    model.add(layers.Dropout(0.25))\n    \n    # Second Conv Block\n    model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.MaxPooling2D((2, 2)))\n    model.add(layers.Dropout(0.25))\n    \n    # Third Conv Block - removed pooling to prevent size becoming too small\n    model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dropout(0.25))\n    \n    # Fully Connected Layers\n    model.add(layers.Flatten())\n    model.add(layers.Dense(256, activation='relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dropout(0.5))\n    model.add(layers.Dense(128, activation='relu'))\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\n# Create model\nmodel = create_cnn_model()\nmodel.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T13:35:46.757225Z","iopub.execute_input":"2025-09-24T13:35:46.757977Z","iopub.status.idle":"2025-09-24T13:35:47.093643Z","shell.execute_reply.started":"2025-09-24T13:35:46.75795Z","shell.execute_reply":"2025-09-24T13:35:47.093038Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Data Augmentation\nfrom 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)\n\nhistory = model.fit(datagen.flow(x_train, y_train, batch_size=128),\n                    steps_per_epoch=len(x_train) // 128,\n                    epochs=50,\n                    validation_data=(x_test, y_test),\n                    callbacks=callbacks,\n                    verbose=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T13:55:36.034094Z","iopub.execute_input":"2025-09-24T13:55:36.034399Z","iopub.status.idle":"2025-09-24T14:05:33.119441Z","shell.execute_reply.started":"2025-09-24T13:55:36.034377Z","shell.execute_reply":"2025-09-24T14:05:33.118858Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 6: Compile and train model\n# Compile the model\nmodel.compile(optimizer='adam',\n              loss='categorical_crossentropy',\n              metrics=['accuracy'])\n\n# Set up callbacks\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping\n\ncallbacks = [\n    ReduceLROnPlateau(monitor='val_accuracy', factor=0.5, patience=10, min_lr=1e-7),\n    EarlyStopping(monitor='val_accuracy', patience=20, restore_best_weights=True)\n]\n\nprint(\"Starting training with data augmentation...\")\n# Use data augmentation in training\nhistory = model.fit(datagen.flow(x_train, y_train, batch_size=128),\n                    steps_per_epoch=len(x_train) // 128,\n                    epochs=80,  # Increased epochs since augmentation provides more variety\n                    validation_data=(x_test, y_test),\n                    callbacks=callbacks,\n                    verbose=1)\n\nprint(\"Training completed!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T14:18:01.138778Z","iopub.execute_input":"2025-09-24T14:18:01.139061Z","iopub.status.idle":"2025-09-24T14:36:48.453643Z","shell.execute_reply.started":"2025-09-24T14:18:01.139043Z","shell.execute_reply":"2025-09-24T14:36:48.453064Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 7: Evaluate model\ntest_loss, test_accuracy = model.evaluate(x_test, y_test, verbose=0)\nprint(f\"Final test accuracy: {test_accuracy:.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T14:50:38.759487Z","iopub.execute_input":"2025-09-24T14:50:38.760278Z","iopub.status.idle":"2025-09-24T14:50:40.045429Z","shell.execute_reply.started":"2025-09-24T14:50:38.76025Z","shell.execute_reply":"2025-09-24T14:50:40.04474Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 8: Load Kaggle test images\nimport cv2\nfrom PIL import Image\nimport glob\n\ntest_files = glob.glob('test/*.png')\ntest_files.sort(key=lambda x: int(x.split('/')[-1].split('.')[0]))\n\nx_kaggle_test = []\nprint(\"Loading Kaggle test images...\")\nfor i, file_path in enumerate(test_files):\n    if i % 50000 == 0:\n        print(f\"Processed {i} images...\")\n    img = Image.open(file_path)\n    img = img.resize((32, 32))\n    img_array = np.array(img)\n    x_kaggle_test.append(img_array)\n\nx_kaggle_test = np.array(x_kaggle_test)\nx_kaggle_test = x_kaggle_test.astype('float32') / 255.0\nprint(f\"Kaggle test data shape: {x_kaggle_test.shape}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T14:51:14.484549Z","iopub.execute_input":"2025-09-24T14:51:14.48519Z","iopub.status.idle":"2025-09-24T14:52:01.716368Z","shell.execute_reply.started":"2025-09-24T14:51:14.485163Z","shell.execute_reply":"2025-09-24T14:52:01.715641Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 9: Create submission file\nprint(\"Making predictions...\")\npredictions = model.predict(x_kaggle_test, batch_size=128, verbose=1)\npredicted_classes = np.argmax(predictions, axis=1)\n\nclass_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', \n               'dog', 'frog', 'horse', 'ship', 'truck']\n\nimport pandas as pd\nsubmission = pd.DataFrame({\n    'id': [i for i in range(1, len(predicted_classes) + 1)],\n    'label': [class_names[pred] for pred in predicted_classes]\n})\n\nsubmission.to_csv('submission.csv', index=False)\nprint(\"Submission file created!\")\nprint(submission.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T14:55:16.237021Z","iopub.execute_input":"2025-09-24T14:55:16.237692Z","iopub.status.idle":"2025-09-24T14:55:37.377013Z","shell.execute_reply.started":"2025-09-24T14:55:16.237663Z","shell.execute_reply":"2025-09-24T14:55:37.376139Z"}},"outputs":[],"execution_count":null}]}