{"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":13836,"databundleVersionId":1718836,"sourceType":"competition"}],"dockerImageVersionId":31012,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras import layers, models\nfrom tensorflow.keras.applications import EfficientNetB0\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport os\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Data paths\nDATA_DIR = \"/kaggle/input/cassava-leaf-disease-classification\"\nTRAIN_DIR = os.path.join(DATA_DIR, \"train_images\")\n\n# Load labels\ndf_train = pd.read_csv(os.path.join(DATA_DIR, \"train.csv\"))\ndf_train['label'] = df_train['label'].astype(str)\n\n# Class names\nclass_names = {\n    '0': 'Cassava Bacterial Blight (CBB)',\n    '1': 'Cassava Brown Streak Disease (CBSD)',\n    '2': 'Cassava Green Mottle (CGM)',\n    '3': 'Cassava Mosaic Disease (CMD)',\n    '4': 'Healthy'\n}\n\n\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Parameters\nBATCH_SIZE = 32\nIMG_SIZE = (224, 224)\nEPOCHS = 15\n\n# Data generators\ntrain_datagen = tf.keras.preprocessing.image.ImageDataGenerator(\n    rescale=1./255,\n    validation_split=0.2,\n    rotation_range=20,\n    zoom_range=0.2,\n    horizontal_flip=True\n)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    dataframe=df_train,\n    directory=TRAIN_DIR,\n    x_col=\"image_id\",\n    y_col=\"label\",\n    subset=\"training\",\n    batch_size=BATCH_SIZE,\n    seed=42,\n    shuffle=True,\n    class_mode=\"categorical\",\n    target_size=IMG_SIZE\n)\n\nvalid_generator = train_datagen.flow_from_dataframe(\n    dataframe=df_train,\n    directory=TRAIN_DIR,\n    x_col=\"image_id\",\n    y_col=\"label\",\n    subset=\"validation\",\n    batch_size=BATCH_SIZE,\n    seed=42,\n    shuffle=False,\n    class_mode=\"categorical\",\n    target_size=IMG_SIZE\n)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Model\nbase_model = EfficientNetB0(weights=\"imagenet\", include_top=False, input_shape=(224, 224, 3))\nbase_model.trainable = False  # Freeze the pretrained layers\n\nmodel = models.Sequential([\n    base_model,\n    layers.GlobalAveragePooling2D(),\n    layers.Dense(256, activation='relu'),\n    layers.Dropout(0.4),\n    layers.Dense(5, activation='softmax')\n])\n\nmodel.compile(\n    optimizer=Adam(learning_rate=0.001),\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Callbacks\nearly_stop = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)\nreduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.3, patience=2, verbose=1)\ncheckpoint = ModelCheckpoint('best_model.keras', monitor='val_loss', save_best_only=True)\n\n# Training\nhistory = model.fit(\n    train_generator,\n    epochs=EPOCHS,\n    validation_data=valid_generator,\n    callbacks=[early_stop, reduce_lr, checkpoint]\n)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n\n# Plot history\nplt.figure(figsize=(14,5))\n\n# Accuracy\nplt.subplot(1, 2, 1)\nplt.plot(history.history['accuracy'], label='Train Accuracy', marker='o')\nplt.plot(history.history['val_accuracy'], label='Validation Accuracy', marker='o')\nplt.title('Model Accuracy')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.legend()\nplt.grid()\n\n# Loss\nplt.subplot(1, 2, 2)\nplt.plot(history.history['loss'], label='Train Loss', marker='o')\nplt.plot(history.history['val_loss'], label='Validation Loss', marker='o')\nplt.title('Model Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.legend()\nplt.grid()\n\nplt.show()\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}