{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.14"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":13836,"databundleVersionId":1718836,"sourceType":"competition"},{"sourceId":159890,"sourceType":"modelInstanceVersion","modelInstanceId":135934,"modelId":158658},{"sourceId":160168,"sourceType":"modelInstanceVersion","modelInstanceId":136181,"modelId":158898},{"sourceId":168208,"sourceType":"modelInstanceVersion","modelInstanceId":143106,"modelId":165710},{"sourceId":170146,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":144763,"modelId":167320}],"dockerImageVersionId":30787,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true},"papermill":{"default_parameters":{},"duration":489.922878,"end_time":"2024-11-10T15:13:04.894498","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-11-10T15:04:54.971620","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport re\nfrom datetime import datetime\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nimport tensorflow as tf\nimport tensorflow_hub as hub","metadata":{"execution":{"iopub.status.busy":"2024-11-18T02:47:27.349348Z","iopub.execute_input":"2024-11-18T02:47:27.350216Z","iopub.status.idle":"2024-11-18T02:47:27.355187Z","shell.execute_reply.started":"2024-11-18T02:47:27.350174Z","shell.execute_reply":"2024-11-18T02:47:27.354075Z"},"papermill":{"duration":14.092192,"end_time":"2024-11-10T15:05:12.565373","exception":false,"start_time":"2024-11-10T15:04:58.473181","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras.applications.efficientnet import preprocess_input\nfrom tensorflow.keras.applications import EfficientNetB0\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D\nfrom tensorflow.keras.models import Model\nfrom sklearn.preprocessing import LabelEncoder\n\ndef load_and_preprocess_image(path, label):\n    image = tf.io.read_file(path)\n    image = tf.image.decode_jpeg(image, channels=3)  # Assuming the images are JPEGs\n    image = tf.image.resize(image, [224, 224])  # Resize to the expected input size\n    image = image / 255.0  # Normalize to [0, 1]\n    return image, label\n\nlabel_to_disease = pd.read_json('/kaggle/input/cassava-leaf-disease-classification/label_num_to_disease_map.json', typ='series')\ntrain_csv = pd.read_csv('/kaggle/input/cassava-leaf-disease-classification/train.csv')\n\ntrain_csv['disease'] = train_csv['label'].map(label_to_disease)\ntrain_csv['path'] = '/kaggle/input/cassava-leaf-disease-classification/train_images/' + train_csv['image_id']\n\ntrain_csv['label_encoded'] = LabelEncoder().fit_transform(train_csv['disease'])\n\n# Convert 'disease' and 'label' columns to string type\ntrain_csv['disease'] = train_csv['disease'].astype(str)\ntrain_csv['label'] = train_csv['label'].astype(str)\n\n# Split the data into train and validation sets with stratified sampling\ntrain, valid = train_test_split(train_csv, test_size=0.2, stratify=train_csv['label'])\n\n# Create datasets\ntrain_ds = tf.data.Dataset.from_tensor_slices((train['path'].values, train['label_encoded'].values))\nvalid_ds = tf.data.Dataset.from_tensor_slices((valid['path'].values, valid['label_encoded'].values))\n\n# Map the loading and preprocessing function to the datasets\ntrain_ds = train_ds.map(load_and_preprocess_image).batch(32).prefetch(buffer_size=tf.data.experimental.AUTOTUNE)\nvalid_ds = valid_ds.map(load_and_preprocess_image).batch(32).prefetch(buffer_size=tf.data.experimental.AUTOTUNE)\n\n# Data augmentation and preprocessing for training\ndatagen_aug = ImageDataGenerator(\n    preprocessing_function=preprocess_input,\n    rotation_range=45,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    vertical_flip=True,\n    fill_mode='nearest'\n)\n\n# Generator for the training set\ntrain_generator = datagen_aug.flow_from_dataframe(\n    dataframe=train,\n    x_col='path',\n    y_col='disease',\n    target_size=(224, 224),\n    batch_size=32,\n    class_mode='categorical',\n    shuffle=True\n)\n\n# Generator for the validation set without augmentation\ndatagen_valid = ImageDataGenerator(preprocessing_function=preprocess_input)\n\nvalid_generator = datagen_valid.flow_from_dataframe(\n    dataframe=valid,\n    x_col='path',\n    y_col='disease',\n    target_size=(224, 224),\n    batch_size=32,\n    class_mode='categorical',\n    shuffle=False\n)","metadata":{"execution":{"iopub.status.busy":"2024-11-18T02:47:29.670091Z","iopub.execute_input":"2024-11-18T02:47:29.670935Z","iopub.status.idle":"2024-11-18T02:47:39.426696Z","shell.execute_reply.started":"2024-11-18T02:47:29.670891Z","shell.execute_reply":"2024-11-18T02:47:39.425811Z"},"papermill":{"duration":112.657835,"end_time":"2024-11-10T15:07:05.227177","exception":false,"start_time":"2024-11-10T15:05:12.569342","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.models import Model, load_model\nfrom tensorflow.keras.preprocessing.image import load_img, img_to_array\nfrom tensorflow.keras.layers import Dense\n\n# since cannot load model, redefine and retrain lol \n# Load CropNet feature extractor\nimport tensorflow as tf\nimport tensorflow_hub as hub\nimport numpy as np\n\nfrom tensorflow.keras.applications import DenseNet169\n\nearly_stopping = tf.keras.callbacks.EarlyStopping(\n    monitor='val_loss', \n    patience=3, \n    restore_best_weights=True\n)\n\nlearning_rate_reduction = tf.keras.callbacks.ReduceLROnPlateau(\n    monitor='val_loss', \n    patience=2, \n    factor=0.5, \n    min_lr=1e-6, \n    verbose=1\n)","metadata":{"execution":{"iopub.status.busy":"2024-11-18T02:47:41.810127Z","iopub.execute_input":"2024-11-18T02:47:41.810819Z","iopub.status.idle":"2024-11-18T02:47:41.818208Z","shell.execute_reply.started":"2024-11-18T02:47:41.810778Z","shell.execute_reply":"2024-11-18T02:47:41.817260Z"},"papermill":{"duration":0.013206,"end_time":"2024-11-10T15:07:05.244449","exception":false,"start_time":"2024-11-10T15:07:05.231243","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.layers import Input, TFSMLayer\nfrom tensorflow.keras.models import Model\n\n# Load models with TFSMLayer\ncropnet_layer = TFSMLayer('/kaggle/input/cropnet_from_kaggle/tensorflow2/default/1/kaggle/working/cropnet_model_tf', call_endpoint='serving_default')\ndensenet_layer = TFSMLayer('/kaggle/input/densenet_model/tensorflow2/default/1/kaggle/working/kaggle/working/densenet_model_tf', call_endpoint='serving_default')\nefficientnet_layer = TFSMLayer('/kaggle/input/efficientnetb4_model/tensorflow2/default/1/kaggle/working/kaggle/working/efficientnet_model_tf', call_endpoint='serving_default')\n\n# Define input layer\ninput_layer = Input(shape=(224, 224, 3))\n\n# Get outputs from each model\ncropnet_output = cropnet_layer(input_layer)\ndensenet_output = densenet_layer(input_layer)\nefficientnet_output = efficientnet_layer(input_layer)\n\n# Wrap each model separately\ncropnet_model = Model(inputs=input_layer, outputs=cropnet_output)\ndensenet_model = Model(inputs=input_layer, outputs=densenet_output)\nefficientnet_model = Model(inputs=input_layer, outputs=efficientnet_output)\n\n# Define weights for soft voting\ncropnet_weight = 0.65\ndensenet_weight = 0.25\nefficientnet_weight = 0.1","metadata":{"execution":{"iopub.status.busy":"2024-11-18T02:47:43.566754Z","iopub.execute_input":"2024-11-18T02:47:43.567090Z","iopub.status.idle":"2024-11-18T02:48:00.885525Z","shell.execute_reply.started":"2024-11-18T02:47:43.567058Z","shell.execute_reply":"2024-11-18T02:48:00.884582Z"},"papermill":{"duration":19.741878,"end_time":"2024-11-10T15:07:24.990413","exception":false,"start_time":"2024-11-10T15:07:05.248535","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# import numpy as np\n\n# # Initialize lists to store predictions\n# cropnet_preds = []\n# densenet_preds = []\n# efficientnet_preds = []\n\n# # Iterate over the preprocessed dataset (train_ds)\n# for img_batch, label_batch in train_ds:\n#     # Ensure the images are in the expected shape\n#     img_batch = np.array(img_batch)\n    \n#     # Get predictions from each model and access the probability arrays\n#     cropnet_pred = cropnet_model.predict(img_batch)['output_0']\n#     densenet_pred = densenet_model.predict(img_batch)['output_0']\n#     efficientnet_pred = efficientnet_model.predict(img_batch)['output_0']\n    \n#     # Store the predictions\n#     cropnet_preds.extend(cropnet_pred)\n#     densenet_preds.extend(densenet_pred)\n#     efficientnet_preds.extend(efficientnet_pred)\n\n# # Convert lists to arrays for stacking\n# cropnet_preds = np.array(cropnet_preds)\n# densenet_preds = np.array(densenet_preds)\n# efficientnet_preds = np.array(efficientnet_preds)\n\n# # Stack predictions as features for the meta-model\n# stacked_features = np.hstack((cropnet_preds, densenet_preds, efficientnet_preds))\n\n# # Use the true labels from the train dataset as targets for the meta-model\n# meta_model_targets = train['label_encoded'].values  # Use the encoded labels","metadata":{"papermill":{"duration":293.349603,"end_time":"2024-11-10T15:12:18.344120","exception":false,"start_time":"2024-11-10T15:07:24.994517","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T02:43:01.589362Z","iopub.execute_input":"2024-11-17T02:43:01.589777Z","iopub.status.idle":"2024-11-17T02:43:01.595697Z","shell.execute_reply.started":"2024-11-17T02:43:01.589714Z","shell.execute_reply":"2024-11-17T02:43:01.594609Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# from sklearn.linear_model import LogisticRegression\n# from sklearn.ensemble import RandomForestClassifier\n# from xgboost import XGBClassifier\n\n# # Train logistic regression as the meta-model\n# # meta_model = LogisticRegression(max_iter=1000, multi_class='multinomial')\n# # stacked_features = stacked_features.astype(np.float64)\n# # meta_model.fit(stacked_features, meta_model_targets)\n\n# # # Train random forest as meta model\n# # meta_model = RandomForestClassifier(n_estimators=100, random_state=42)  # Set n_estimators as desired\n# # meta_model.fit(stacked_features, meta_model_targets)\n\n# # Train XGBoost as meta model\n# meta_model = XGBClassifier(n_estimators=100, max_depth=5, learning_rate=0.1, random_state=42)\n# meta_model.fit(stacked_features, meta_model_targets)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-11-17T02:43:01.596973Z","iopub.execute_input":"2024-11-17T02:43:01.597265Z","iopub.status.idle":"2024-11-17T02:43:01.610421Z","shell.execute_reply.started":"2024-11-17T02:43:01.597233Z","shell.execute_reply":"2024-11-17T02:43:01.609664Z"},"papermill":{"duration":1.115299,"end_time":"2024-11-10T15:12:19.713968","exception":false,"start_time":"2024-11-10T15:12:18.598669","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Soft voting then meta model with k fold cross validation\n","metadata":{}},{"cell_type":"code","source":"# Initialize lists to store soft voting probabilities and labels\nsoft_voting_features = []\nsoft_voting_labels = []\n\n# Iterate over the training dataset\nfor img_batch, label_batch in train_ds:\n    img_batch = np.array(img_batch)  # Convert images to numpy array\n\n    # Get probabilities from each model\n    cropnet_probs = cropnet_model.predict(img_batch)['output_0']\n    densenet_probs = densenet_model.predict(img_batch)['output_0']\n    efficientnet_probs = efficientnet_model.predict(img_batch)['output_0']\n    \n    # Calculate weighted soft voting probabilities\n    soft_voting_probs = (\n        cropnet_weight * cropnet_probs + \n        densenet_weight * densenet_probs + \n        efficientnet_weight * efficientnet_probs\n    )\n    \n    # Store soft voting probabilities and true labels\n    soft_voting_features.extend(soft_voting_probs)\n    soft_voting_labels.extend(label_batch)\n\n# Convert lists to arrays\nsoft_voting_features = np.array(soft_voting_features)\nsoft_voting_labels = np.array(soft_voting_labels)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-18T02:48:00.887331Z","iopub.execute_input":"2024-11-18T02:48:00.887738Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import accuracy_score, log_loss\nfrom sklearn.model_selection import StratifiedKFold\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\n\n# Define the cross-validation setup\nkf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\nfold_accuracies = []\nfold_log_losses = []\n\n# Initialize lists to store distributions for plotting\ntrain_distributions = []\nval_distributions = []\n\n# Perform cross-validation\nfor train_index, val_index in kf.split(soft_voting_features, soft_voting_labels):\n    X_train, X_val = soft_voting_features[train_index], soft_voting_features[val_index]\n    y_train, y_val = soft_voting_labels[train_index], soft_voting_labels[val_index]\n    \n    # Train the meta-model on the training fold\n    meta_model = LogisticRegression(max_iter=1000, C=0.1, multi_class='multinomial', penalty='l2')\n    meta_model.fit(X_train, y_train)\n    \n    # Predict on the validation fold\n    val_preds = meta_model.predict(X_val)\n    val_probs = meta_model.predict_proba(X_val)\n    \n    # Calculate accuracy and log loss for the fold\n    fold_accuracy = accuracy_score(y_val, val_preds)\n    fold_log_loss = log_loss(y_val, val_probs)\n    \n    fold_accuracies.append(fold_accuracy)\n    fold_log_losses.append(fold_log_loss)\n    \n    # Get the class distribution for the training and validation sets\n    train_dist = pd.Series(y_train).value_counts(normalize=True)\n    val_dist = pd.Series(y_val).value_counts(normalize=True)\n    \n    # Append the distributions to the lists (convert to dictionary for easy plotting)\n    train_distributions.append(train_dist.to_dict())\n    val_distributions.append(val_dist.to_dict())\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T05:07:57.890938Z","iopub.execute_input":"2024-11-17T05:07:57.891321Z","iopub.status.idle":"2024-11-17T05:07:58.592203Z","shell.execute_reply.started":"2024-11-17T05:07:57.891284Z","shell.execute_reply":"2024-11-17T05:07:58.591144Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Plotting the distribution, accuracy, and log loss for each fold\nnum_folds = len(train_distributions)\nplt.figure(figsize=(15, 3 * num_folds))\n\nfor fold in range(num_folds):\n    train_dist = train_distributions[fold]\n    val_dist = val_distributions[fold]\n    \n    # Convert to DataFrame for plotting\n    df_train = pd.DataFrame(list(train_dist.items()), columns=['Class', 'Proportion'])\n    df_val = pd.DataFrame(list(val_dist.items()), columns=['Class', 'Proportion'])\n    \n    # Plot training distribution\n    plt.subplot(num_folds, 4, 4 * fold + 1)\n    plt.bar(df_train['Class'], df_train['Proportion'], color='blue', alpha=0.6, label='Train')\n    plt.ylim(0, 1)\n    plt.title(f'Fold {fold + 1} - Train Distribution')\n    plt.xlabel('Class')\n    plt.ylabel('Proportion')\n    plt.legend()\n    \n    # Plot validation distribution\n    plt.subplot(num_folds, 4, 4 * fold + 2)\n    plt.bar(df_val['Class'], df_val['Proportion'], color='red', alpha=0.6, label='Validation')\n    plt.ylim(0, 1)\n    plt.title(f'Fold {fold + 1} - Validation Distribution')\n    plt.xlabel('Class')\n    plt.ylabel('Proportion')\n    plt.legend()\n    \n    # # Plot fold accuracy\n    # plt.subplot(num_folds, 4, 4 * fold + 3)\n    # plt.bar(['Accuracy'], [fold_accuracies[fold]], color='green')\n    # plt.ylim(0, 1)\n    # plt.title(f'Fold {fold + 1} - Accuracy')\n    # plt.ylabel('Accuracy')\n    \n    # # Plot fold log loss\n    # plt.subplot(num_folds, 4, 4 * fold + 4)\n    # plt.bar(['Log Loss'], [fold_log_losses[fold]], color='purple')\n    # plt.title(f'Fold {fold + 1} - Log Loss')\n    # plt.ylabel('Log Loss')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T05:07:58.593519Z","iopub.execute_input":"2024-11-17T05:07:58.593933Z","iopub.status.idle":"2024-11-17T05:08:00.795597Z","shell.execute_reply.started":"2024-11-17T05:07:58.593880Z","shell.execute_reply":"2024-11-17T05:08:00.794297Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(12, 5))\n\n# Accuracy plot\nplt.subplot(1, 2, 1)\nplt.plot(range(1, len(fold_accuracies) + 1), fold_accuracies, marker='o', color='b', label='Accuracy')\nplt.xlabel('Fold')\nplt.ylabel('Accuracy')\nplt.title('Cross-Validation Accuracy by Fold')\nplt.legend()\n\n# Log loss plot\nplt.subplot(1, 2, 2)\nplt.plot(range(1, len(fold_log_losses) + 1), fold_log_losses, marker='o', color='r', label='Log Loss')\nplt.xlabel('Fold')\nplt.ylabel('Log Loss')\nplt.title('Cross-Validation Log Loss by Fold')\nplt.legend()\n\nplt.tight_layout()\nplt.show() ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T05:08:00.797193Z","iopub.execute_input":"2024-11-17T05:08:00.798020Z","iopub.status.idle":"2024-11-17T05:08:01.431321Z","shell.execute_reply.started":"2024-11-17T05:08:00.797976Z","shell.execute_reply":"2024-11-17T05:08:01.430298Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n\n# Predict on the full training set for the confusion matrix\nmeta_model_predictions = meta_model.predict(soft_voting_features)\n\n# Calculate confusion matrix\ncm = confusion_matrix(soft_voting_labels, meta_model_predictions)\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm)\n\n# Plot the confusion matrix with annotations\nfig, ax = plt.subplots(figsize=(8, 8))\ndisp.plot(cmap='Blues', ax=ax)\nplt.title(\"Confusion Matrix for Meta-Model on Training Data\")\n\n# Calculate the true positive predictions for class 3\ntrue_class_3_correct_predictions = cm[3, 3]\n\n# Add the true positive count for class 3 as a subtext below the plot\nplt.gcf().text(0.5, -0.0001, f\"True positive predictions for class 3: {true_class_3_correct_predictions}\", \n               ha='center', va='center', fontsize=12)\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T05:46:22.445239Z","iopub.execute_input":"2024-11-17T05:46:22.445673Z","iopub.status.idle":"2024-11-17T05:46:22.902677Z","shell.execute_reply.started":"2024-11-17T05:46:22.445631Z","shell.execute_reply":"2024-11-17T05:46:22.901539Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Calculate the number of true positives for class 3\ntrue_class_3_correct_predictions = cm[3, 3]\nprint(\"True positive predictions for class 3:\", true_class_3_correct_predictions)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T05:44:18.791382Z","iopub.execute_input":"2024-11-17T05:44:18.792193Z","iopub.status.idle":"2024-11-17T05:44:18.797154Z","shell.execute_reply.started":"2024-11-17T05:44:18.792150Z","shell.execute_reply":"2024-11-17T05:44:18.796213Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Store meta model for each fold after training","metadata":{}},{"cell_type":"code","source":"meta_models = []\nfor train_index, val_index in kf.split(soft_voting_features, soft_voting_labels):\n    X_train, X_val = soft_voting_features[train_index], soft_voting_features[val_index]\n    y_train, y_val = soft_voting_labels[train_index], soft_voting_labels[val_index]\n\n    meta_model = LogisticRegression(max_iter=1000, C=0.1, multi_class='multinomial', penalty='l2')\n    meta_model.fit(X_train, y_train)\n    meta_models.append(meta_model)  # Store each fold’s trained meta-model\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T02:50:29.575449Z","iopub.execute_input":"2024-11-17T02:50:29.576224Z","iopub.status.idle":"2024-11-17T02:50:30.192510Z","shell.execute_reply.started":"2024-11-17T02:50:29.576182Z","shell.execute_reply":"2024-11-17T02:50:30.191676Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"average prediction on test set from each model","metadata":{}},{"cell_type":"code","source":"# Initialize lists to store predictions and image names\npredictions = []\nimage_names = []\n\n# Define image path and image size\nimage_dir = '/kaggle/input/cassava-leaf-disease-classification/test_images'\nimg_size = (224, 224)\n\n# Process each image in the test set\nfor filename in os.listdir(image_dir):\n    if filename.endswith(\".jpg\"):\n        img_path = os.path.join(image_dir, filename)\n        img = load_img(img_path, target_size=img_size)\n        img_array = img_to_array(img) / 255.0  # Normalize\n        img_array = np.expand_dims(img_array, axis=0)  # Add batch dimension\n\n        # Get probabilities from each model\n        cropnet_probs = cropnet_model.predict(img_array)['output_0']\n        densenet_probs = densenet_model.predict(img_array)['output_0']\n        efficientnet_probs = efficientnet_model.predict(img_array)['output_0']\n\n        # Calculate weighted soft voting probabilities\n        soft_voting_probs = (\n            cropnet_weight * cropnet_probs + \n            densenet_weight * densenet_probs + \n            efficientnet_weight * efficientnet_probs\n        ).flatten()  # Flatten to 1D array\n\n        # Ensemble predictions from each meta-model\n        fold_preds = [meta_model.predict([soft_voting_probs])[0] for meta_model in meta_models]\n        final_pred = max(set(fold_preds), key=fold_preds.count)  # Majority vote\n\n        # Store the prediction and image name\n        predictions.append(final_pred)\n        image_names.append(filename)\n\n# Create DataFrame for submission\nsubmission_df = pd.DataFrame({\n    'image_id': image_names,\n    'label': predictions\n})\n\n# Save to CSV\nsubmission_df.to_csv('/kaggle/working/submission.csv', index=False)\nprint(\"Submission file created: submission.csv\")\n\n# Display the first few rows to verify\nprint(submission_df.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T02:50:49.525067Z","iopub.execute_input":"2024-11-17T02:50:49.525923Z","iopub.status.idle":"2024-11-17T02:51:07.836828Z","shell.execute_reply.started":"2024-11-17T02:50:49.525852Z","shell.execute_reply":"2024-11-17T02:51:07.835797Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# import os\n# import numpy as np\n# import pandas as pd\n# from tensorflow.keras.preprocessing.image import load_img, img_to_array\n# from tensorflow.keras.layers import Input, TFSMLayer\n# from tensorflow.keras.models import Model\n# from sklearn.linear_model import LogisticRegression\n\n# # Load models with TFSMLayer\n# # cropnet_layer = TFSMLayer('/kaggle/input/cropnet/tensorflow2/default/1/kaggle/working/model_feature_extraction_tf', call_endpoint='serving_default')\n# # densenet_layer = TFSMLayer('/kaggle/input/densenet/tensorflow2/default/1/kaggle/working/kaggle/working/densenet_model_tf', call_endpoint='serving_default')\n# # efficientnet_layer = TFSMLayer('/kaggle/input/efficientnet/tensorflow2/default/1/kaggle/working/kaggle/working/efficientnet_model_tf', call_endpoint='serving_default')\n\n# # Define input layer\n# input_layer = Input(shape=(224, 224, 3))\n\n# # Get outputs from each model\n# cropnet_output = cropnet_layer(input_layer)\n# densenet_output = densenet_layer(input_layer)\n# efficientnet_output = efficientnet_layer(input_layer)\n\n# # Wrap each model separately\n# cropnet_model = Model(inputs=input_layer, outputs=cropnet_output)\n# densenet_model = Model(inputs=input_layer, outputs=densenet_output)\n# efficientnet_model = Model(inputs=input_layer, outputs=efficientnet_output)\n\n# # Initialize lists to store predictions and image names\n# predictions = []\n# image_names = []\n\n# # Define image path and image size\n# image_dir = '/kaggle/input/cassava-leaf-disease-classification/test_images'\n# img_size = (224, 224)\n\n# # Process each image in the test set\n# for filename in os.listdir(image_dir):\n#     if filename.endswith(\".jpg\"):\n#         img_path = os.path.join(image_dir, filename)\n#         img = load_img(img_path, target_size=img_size)\n#         img_array = img_to_array(img) / 255.0  # Normalize\n#         img_array = np.expand_dims(img_array, axis=0)  # Add batch dimension\n        \n#         # Get probabilities from each model\n#         cropnet_probs = cropnet_model.predict(img_array)['output_0']\n#         densenet_probs = densenet_model.predict(img_array)['output_0']\n#         efficientnet_probs = efficientnet_model.predict(img_array)['output_0']\n        \n#         # Calculate weighted soft voting probabilities\n#         soft_voting_probs = (\n#             cropnet_weight * cropnet_probs + \n#             densenet_weight * densenet_probs + \n#             efficientnet_weight * efficientnet_probs\n#         ).flatten()  # Flatten to 1D array\n        \n#         # Predict using the Logistic Regression meta-model\n#         pred = meta_model.predict([soft_voting_probs])[0]\n        \n#         # Store the prediction and image name\n#         predictions.append(pred)\n#         image_names.append(filename)\n\n# # Create DataFrame for submission\n# submission_df = pd.DataFrame({\n#     'image_id': image_names,\n#     'label': predictions\n# })\n\n# # Save to CSV\n# submission_df.to_csv('/kaggle/working/submission.csv', index=False)\n# print(\"Submission file created: submission.csv\")\n\n# # Display the first few rows to verify\n# print(submission_df.head())","metadata":{"execution":{"iopub.status.busy":"2024-11-17T02:43:17.974227Z","iopub.status.idle":"2024-11-17T02:43:17.974554Z","shell.execute_reply.started":"2024-11-17T02:43:17.974384Z","shell.execute_reply":"2024-11-17T02:43:17.974401Z"},"papermill":{"duration":39.833724,"end_time":"2024-11-10T15:13:00.443122","exception":false,"start_time":"2024-11-10T15:12:20.609398","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.25868,"end_time":"2024-11-10T15:13:00.968745","exception":false,"start_time":"2024-11-10T15:13:00.710065","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null}]}