{"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":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30919,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Digit Recognizer - Achieving 0.99489 Accuracy\n## CNN, Data Augmentation, and TTA \n\n\n#### Hi, thanks for checking in! 😊 If you found this helpful, I’d really appreciate an upvote—it helps keep me motivated, and your support means a lot!","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.optimizers import Adam\nimport tensorflow as tf\n\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau\n\n\ntrain = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\") \ntest = pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")   \nsubmission = pd.read_csv(\"/kaggle/input/digit-recognizer/sample_submission.csv\")  \n\n\nX = train.drop(\"label\", axis=1).values / 255.0  # convert pixels to values between 0 and 1\ny = to_categorical(train[\"label\"].values, num_classes=10) \ntest = test.values / 255.0  \n\nX = X.reshape(-1, 28, 28, 1) \ntest = test.reshape(-1, 28, 28, 1) \nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.1, random_state=42)  \n\n# Data Augmentation \ndatagen = ImageDataGenerator(\n    rotation_range=20,  \n    zoom_range=0.2, \n    width_shift_range=0.2, \n    height_shift_range=0.2 \n)\ndatagen.fit(X_train)  \n\n#  CNN Model\nmodel = Sequential([\n    Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), \n    Conv2D(32, (3, 3), activation='relu'), \n    MaxPooling2D(pool_size=(2, 2)),Dropout(0.25),  # Dropout to prevent overfitting\n    Conv2D(64, (3, 3), activation='relu'),  \n    Conv2D(64, (3, 3), activation='relu'),  \n    MaxPooling2D(pool_size=(2, 2)), Dropout(0.25),  Flatten(), \n    Dense(256, activation='relu'), Dropout(0.5),  Dense(10, activation='softmax')  \n])\n\noptimizer = Adam(learning_rate=0.0005)\n\nmodel.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])  \n\n\n\n# callbacks for training control\nearly_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True) \nlr_scheduler = ReduceLROnPlateau(monitor='val_loss', patience=3, factor=0.5) \n\n# Train  model\nhistory = model.fit(\n    datagen.flow(X_train, y_train, batch_size=64),  \n    epochs=50,  \n    validation_data=(X_val, y_val),  \n    callbacks=[early_stop, lr_scheduler] \n)\n\n#   validation accuracy\nval_loss, val_accuracy = model.evaluate(X_val, y_val, verbose=0) \nprint(f\"\\n  Validation Accuracy: {val_accuracy:.4f}\")  #  validation accuracy\n\n# Test-Time Augmentation \ntta_steps = 10  \npredictions = np.zeros((test.shape[0], 10))  \n\ntta_datagen = ImageDataGenerator(\n    rotation_range=10, \n    zoom_range=0.1,  \n    width_shift_range=0.1, \n    height_shift_range=0.1  \n)\n\n#  TTA for robust predictions\nprint(\"\\ Test-Time Augmentation...\")\nfor i in range(tta_steps):\n    print(f\"TTA round {i+1}/{tta_steps}\")  \n    test_augmented = tta_datagen.flow(test, shuffle=False, batch_size=64)  \n    predictions += model.predict(test_augmented, verbose=0)  \n    \n\npredictions /= tta_steps \ny_final = np.argmax(predictions, axis=1) \n\n\n\n\n#submission[\"Label\"] = y_final \n#submission.to_csv(\"/kaggle/working/submission_01.csv\", index=False)  \n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T15:21:30.534782Z","iopub.execute_input":"2025-04-04T15:21:30.535114Z","iopub.status.idle":"2025-04-04T15:29:35.607698Z","shell.execute_reply.started":"2025-04-04T15:21:30.535090Z","shell.execute_reply":"2025-04-04T15:29:35.606726Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null}]}