{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"},{"sourceId":9243,"sourceType":"datasetVersion","datasetId":2243}],"dockerImageVersionId":23025,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Flatten, Conv2D, Dropout, MaxPooling2D, BatchNormalization\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n\n# Constants for image dimensions and number of classes\nimg_rows, img_cols = 28, 28\nnum_classes = 10\n\ndef data_prep(raw):\n    out_y = tf.keras.utils.to_categorical(raw.label, num_classes)\n    num_images = raw.shape[0]\n    x_as_array = raw.values[:,1:]\n    x_shaped_array = x_as_array.reshape(num_images, img_rows, img_cols, 1)\n    out_x = x_shaped_array / 255\n    return out_x, out_y\n\ndef test_data_prep(raw):\n    num_images = raw.shape[0]\n    x_as_array = raw.values\n    x_shaped_array = x_as_array.reshape(num_images, img_rows, img_cols, 1)\n    out_x = x_shaped_array / 255\n    return out_x\n\n# Load training data\ntrain_file = \"../input/digit-recognizer/train.csv\"\nraw_data = pd.read_csv(train_file)\nx_train, y_train = data_prep(raw_data)\n\n# Data augmentation generator\ndatagen = 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# Define the model\nmodel = Sequential([\n    Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(img_rows, img_cols, 1)),\n    BatchNormalization(),\n    Conv2D(32, (3, 3), activation='relu'),\n    BatchNormalization(),\n    MaxPooling2D(pool_size=(2, 2)),\n    Dropout(0.25),\n    Conv2D(64, (3, 3), activation='relu'),\n    BatchNormalization(),\n    Conv2D(64, (3, 3), activation='relu'),\n    BatchNormalization(),\n    MaxPooling2D(pool_size=(2, 2)),\n    Dropout(0.25),\n    Flatten(),\n    Dense(256, activation='relu'),\n    Dropout(0.5),\n    Dense(num_classes, activation='softmax')\n])\n\n# Compile the model\nmodel.compile(optimizer='adam', loss=tf.keras.losses.categorical_crossentropy, metrics=['accuracy'])\n\n# Learning rate reduction\nlr_reduction = ReduceLROnPlateau(monitor='val_accuracy', patience=3, verbose=1, factor=0.5, min_lr=0.00001)\n\n# Train the model\nmodel.fit(datagen.flow(x_train, y_train, batch_size=32),\n          steps_per_epoch=len(x_train) / 32, epochs=13,\n          callbacks=[lr_reduction])\n\n# Load test data\ntest_file = \"../input/digit-recognizer/test.csv\"\nraw_test_data = pd.read_csv(test_file)\nx_test = test_data_prep(raw_test_data)\n\n# Predict the labels\npredictions = model.predict(x_test)\npredicted_classes = np.argmax(predictions, axis=1)\n\n# Create submission DataFrame\nsubmission = pd.DataFrame({\n    \"ImageId\": range(1, len(predicted_classes) + 1),\n    \"Label\": predicted_classes\n})\n\n# Save submission file\nsubmission.to_csv('submission.csv', index=False)\n","metadata":{"execution":{"iopub.status.busy":"2024-04-12T00:35:29.340157Z","iopub.execute_input":"2024-04-12T00:35:29.340547Z","iopub.status.idle":"2024-04-12T00:49:53.857576Z","shell.execute_reply.started":"2024-04-12T00:35:29.340485Z","shell.execute_reply":"2024-04-12T00:49:53.856325Z"},"trusted":true},"execution_count":null,"outputs":[]}]}