{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","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"}],"dockerImageVersionId":31012,"isInternetEnabled":true,"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 seaborn as sns\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix, classification_report\nimport tensorflow as tf\nfrom tensorflow.keras import layers, models, applications, callbacks\nimport os, warnings\n\nwarnings.filterwarnings(\"ignore\")\nos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'\n\n# Paramètres\nMODEL_NAME = \"EfficientNetB0\"\nIMG_SIZE = 64\nBATCH_SIZE = 64\nEPOCHS = 20\nLR = 1e-3\n\n# Chargement des données\ndf_train = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\")\ndf_test = pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")\n\ny = df_train[\"label\"].values\nX = df_train.drop(\"label\", axis=1).values.reshape(-1, 28, 28, 1)\nX_test = df_test.values.reshape(-1, 28, 28, 1)\n\n# Normalisation\nX = X.astype('float32') / 255.0\nX_test = X_test.astype('float32') / 255.0\n\n# 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# Préprocessing EfficientNet\ndef preprocess_images(x, y=None):\n    x = tf.image.grayscale_to_rgb(tf.convert_to_tensor(x))\n    x = tf.image.resize(x, [IMG_SIZE, IMG_SIZE])\n    x = applications.efficientnet.preprocess_input(x)\n    return x if y is None else (x, y)\n\n# Datasets\ntrain_ds = tf.data.Dataset.from_tensor_slices((X_train, y_train))\ntrain_ds = train_ds.map(preprocess_images, num_parallel_calls=tf.data.AUTOTUNE)\ntrain_ds = train_ds.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)\n\nval_ds = tf.data.Dataset.from_tensor_slices((X_val, y_val))\nval_ds = val_ds.map(preprocess_images, num_parallel_calls=tf.data.AUTOTUNE)\nval_ds = val_ds.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)\n\ntest_ds = tf.data.Dataset.from_tensor_slices(X_test)\ntest_ds = test_ds.map(lambda x: preprocess_images(x))\ntest_ds = test_ds.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)\n\n# Construction du modèle\ndef build_model():\n    base_model = applications.EfficientNetB0(\n        include_top=False,\n        weights='imagenet',\n        input_shape=(IMG_SIZE, IMG_SIZE, 3),\n        pooling='avg'\n    )\n    base_model.trainable = False  # Freeze\n\n    inputs = layers.Input(shape=(IMG_SIZE, IMG_SIZE, 3))\n    x = base_model(inputs)\n    x = layers.Dense(256, activation='relu')(x)\n    x = layers.Dropout(0.5)(x)\n    outputs = layers.Dense(10, activation='softmax')(x)\n\n    model = models.Model(inputs, outputs)\n    model.compile(\n        optimizer=tf.keras.optimizers.Adam(learning_rate=LR),\n        loss='sparse_categorical_crossentropy',\n        metrics=['accuracy']\n    )\n    return model\n\nmodel = build_model()\n\n# Callbacks\nearly_stop = callbacks.EarlyStopping(\n    monitor='val_accuracy',\n    patience=5,\n    restore_best_weights=True\n)\n\nlr_scheduler = callbacks.ReduceLROnPlateau(\n    monitor='val_loss',\n    factor=0.5,\n    patience=3,\n    verbose=1\n)\n\n# Entraînement\nhistory = model.fit(\n    train_ds,\n    validation_data=val_ds,\n    epochs=EPOCHS,\n    callbacks=[early_stop, lr_scheduler],\n    verbose=2\n)\n\n# Évaluation textuelle\nval_preds = model.predict(val_ds)\nval_preds_labels = np.argmax(val_preds, axis=1)\n\nprint(\"\\n=== Rapport de classification sur l'ensemble de validation ===\")\nprint(classification_report(y_val, val_preds_labels))\n\n# Prédictions pour Kaggle\ntest_preds = model.predict(test_ds)\ntest_labels = np.argmax(test_preds, axis=1)\n\nsubmission = pd.DataFrame({\n    \"ImageId\": np.arange(1, len(test_labels) + 1),\n    \"Label\": test_labels\n})\nsubmission.to_csv(\"submission.csv\", index=False)\nprint(\"Fichier 'submission.csv' généré.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-18T13:49:06.802660Z","iopub.execute_input":"2025-04-18T13:49:06.803699Z","iopub.status.idle":"2025-04-18T14:55:41.564456Z","shell.execute_reply.started":"2025-04-18T13:49:06.803662Z","shell.execute_reply":"2025-04-18T14:55:41.563594Z"}},"outputs":[],"execution_count":null}]}