{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","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":"gpu","dataSources":[{"sourceId":14774,"databundleVersionId":875431,"sourceType":"competition"}],"dockerImageVersionId":30919,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true},"papermill":{"default_parameters":{},"duration":6537.319034,"end_time":"2024-09-07T06:55:49.558981","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-09-07T05:06:52.239947","version":"2.5.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"id":"d9bc5e01","cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom tensorflow.keras.applications import EfficientNetV2S, DenseNet201\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Dropout, concatenate, Input, BatchNormalization\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau\nfrom tensorflow.keras.optimizers import Adam\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.preprocessing import LabelEncoder\nimport os\n\n# Use GPU if available, otherwise use CPU\ngpus = tf.config.experimental.list_physical_devices('GPU')\nif gpus:\n    try:\n        for gpu in gpus:\n            tf.config.experimental.set_memory_growth(gpu, True)\n        print(\"Using GPU\")\n    except RuntimeError as e:\n        print(e)\nelse:\n    print(\"Using CPU\")\n\n# Load and preprocess data\ntrain_df = pd.read_csv('/kaggle/input/aptos2019-blindness-detection/train.csv')\ntrain_df['diagnosis'] = train_df['diagnosis'].astype(str)\ntrain_df['id_code'] = train_df['id_code'].apply(lambda x: f\"{x}.png\")\n\n# Label encoding\nle = LabelEncoder()\ntrain_df['diagnosis'] = le.fit_transform(train_df['diagnosis'])\n\ndef preprocess_image(image_path, label):\n    img = tf.io.read_file(image_path)\n    img = tf.image.decode_png(img, channels=3)\n    img = tf.image.resize(img, (380, 380))\n    img = tf.cast(img, tf.float32) / 255.0\n    return img, label\n\ndef augment(image, label):\n    image = tf.image.random_flip_left_right(image)\n    image = tf.image.random_flip_up_down(image)\n    image = tf.image.random_brightness(image, max_delta=0.2)\n    image = tf.image.random_contrast(image, lower=0.8, upper=1.2)\n    image = tf.image.random_saturation(image, lower=0.8, upper=1.2)\n    image = tf.image.random_hue(image, max_delta=0.2)\n    return image, label\n\ndef create_dataset(dataframe, batch_size, is_training=True):\n    image_paths = tf.constant([f\"/kaggle/input/aptos2019-blindness-detection/train_images/{filename}\" for filename in dataframe['id_code']])\n    labels = tf.constant(dataframe['diagnosis'].values, dtype=tf.int32)\n    \n    dataset = tf.data.Dataset.from_tensor_slices((image_paths, labels))\n    dataset = dataset.map(preprocess_image, num_parallel_calls=tf.data.AUTOTUNE)\n    \n    if is_training:\n        dataset = dataset.map(augment, num_parallel_calls=tf.data.AUTOTUNE)\n        dataset = dataset.shuffle(buffer_size=len(dataframe))\n    \n    dataset = dataset.batch(batch_size)\n    dataset = dataset.prefetch(tf.data.AUTOTUNE)\n    return dataset\n\ndef create_model(input_shape=(380, 380, 3), num_classes=5):\n    input_tensor = Input(shape=input_shape)\n    \n    base_model_1 = EfficientNetV2S(weights='imagenet', include_top=False, input_tensor=input_tensor)\n    x1 = GlobalAveragePooling2D()(base_model_1.output)\n    x1 = BatchNormalization()(x1)\n    x1 = Dropout(0.5)(x1)\n    x1 = Dense(512, activation='relu')(x1)\n    x1 = BatchNormalization()(x1)\n    x1 = Dropout(0.3)(x1)\n    \n    base_model_2 = DenseNet201(weights='imagenet', include_top=False, input_tensor=input_tensor)\n    x2 = GlobalAveragePooling2D()(base_model_2.output)\n    x2 = BatchNormalization()(x2)\n    x2 = Dropout(0.5)(x2)\n    x2 = Dense(512, activation='relu')(x2)\n    x2 = BatchNormalization()(x2)\n    x2 = Dropout(0.3)(x2)\n    \n    combined = concatenate([x1, x2])\n    combined = Dense(256, activation='relu')(combined)\n    combined = BatchNormalization()(combined)\n    combined = Dropout(0.3)(combined)\n    output = Dense(num_classes, activation='softmax')(combined)\n    \n    model = Model(inputs=input_tensor, outputs=output)\n    return model\n\n# Implement k-fold cross-validation\nn_splits = 2\nskf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)\n\nfor fold, (train_idx, val_idx) in enumerate(skf.split(train_df, train_df['diagnosis']), 1):\n    print(f\"Training Fold {fold}\")\n    \n    train_fold = train_df.iloc[train_idx].reset_index(drop=True)\n    val_fold = train_df.iloc[val_idx].reset_index(drop=True)\n    \n    model = create_model()\n    optimizer = Adam(learning_rate=0.0001)\n    model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n    \n    # Callbacks\n    callbacks = [\n        EarlyStopping(patience=15, restore_best_weights=True),\n        ModelCheckpoint(f'best_model_fold_{fold}.keras', save_best_only=True),\n        ReduceLROnPlateau(factor=0.5, patience=7, min_lr=1e-6)\n    ]\n    \n    # Create datasets\n    batch_size = 16  # Adjust based on your GPU memory\n    train_dataset = create_dataset(train_fold, batch_size)\n    val_dataset = create_dataset(val_fold, batch_size, is_training=False)\n    \n    # Train model\n    try:\n        history = model.fit(\n            train_dataset,\n            validation_data=val_dataset,\n            epochs=20,\n            callbacks=callbacks,\n            steps_per_epoch=len(train_fold) // batch_size,\n            validation_steps=len(val_fold) // batch_size,\n            verbose=2\n        )\n        \n        # Print fold results\n        print(f\"Fold {fold} - Best validation accuracy: {max(history.history['val_accuracy'])}\")\n    except Exception as e:\n        print(f\"An error occurred during training fold {fold}: {str(e)}\")\n        continue\n\nprint(\"Training completed for all folds.\")","metadata":{"papermill":{"duration":6530.394207,"end_time":"2024-09-07T06:55:45.376309","exception":false,"start_time":"2024-09-07T05:06:54.982102","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-03-11T16:40:41.045734Z","iopub.execute_input":"2025-03-11T16:40:41.045918Z","execution_failed":"2025-03-11T16:48:56.027Z"}},"outputs":[],"execution_count":null},{"id":"7fff2b3d","cell_type":"code","source":"","metadata":{"papermill":{"duration":0.015478,"end_time":"2024-09-07T06:55:45.407710","exception":false,"start_time":"2024-09-07T06:55:45.392232","status":"completed"},"tags":[]},"outputs":[],"execution_count":null}]}