{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":4104,"databundleVersionId":46661,"sourceType":"competition"},{"sourceId":7251,"sourceType":"datasetVersion","datasetId":2798},{"sourceId":7866129,"sourceType":"datasetVersion","datasetId":4614938},{"sourceId":7869237,"sourceType":"datasetVersion","datasetId":4617269}],"dockerImageVersionId":30674,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# copy the weights and configurations for the pre-trained models \n!mkdir ~/.keras\n!mkdir ~/.keras/models7\n!cp ../input/keras-pretrained-models/*notop* ~/.keras/models/\n!cp ../input/keras-pretrained-models/imagenet_class_index.json ~/.keras/models/","metadata":{"execution":{"iopub.status.busy":"2024-11-10T10:54:20.827405Z","iopub.execute_input":"2024-11-10T10:54:20.827833Z","iopub.status.idle":"2024-11-10T10:54:26.315355Z","shell.execute_reply.started":"2024-11-10T10:54:20.827793Z","shell.execute_reply":"2024-11-10T10:54:26.314238Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nimport numpy as np\nimport pandas as pd\nimport os\nimport tensorflow as tf\nfrom tensorflow.keras import layers, models\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array\nfrom glob import glob\nfrom sklearn.model_selection import train_test_split\n\n# Define the directory where the images are stored\nimage_dir = '/kaggle/input/diabetic-retinopathy-train-unzipped/train/'\n\n# List the image files\nfile_lbl = \"/kaggle/input/diabetic-retinopathy-detection/trainLabels.csv.zip\"\nretina_df = pd.read_csv(file_lbl, sep=',')\n\n# Extract PatientId and create image paths\nretina_df['PatientId'] = retina_df['image'].map(lambda x: x.split('_')[0])\nretina_df['path'] = retina_df['image'].map(lambda x: os.path.join(image_dir, '{}.jpeg'.format(x)))\nretina_df['exists'] = retina_df['path'].map(os.path.exists)\nprint(f\"{retina_df['exists'].sum()} images found out of {retina_df.shape[0]} total\")\nretina_df['eye'] = retina_df['image'].map(lambda x: 1 if x.split('_')[-1] == 'left' else 0)\n\n# Split the dataset for federated learning (simulate clients)\nclients_data = np.array_split(retina_df, 5)  # Create 5 clients for federated learning\n\n# Define function to create a model\ndef create_model():\n    print('Creating model...')\n    model = models.Sequential([\n        layers.Input(shape=(224, 224, 3)),\n        layers.Conv2D(32, (3, 3), activation='relu'),\n        layers.MaxPooling2D(pool_size=(2, 2)),\n        layers.Conv2D(64, (3, 3), activation='relu'),\n        layers.MaxPooling2D(pool_size=(2, 2)),\n        layers.Conv2D(128, (3, 3), activation='relu'),\n        layers.MaxPooling2D(pool_size=(2, 2)),\n        layers.Flatten(),\n        layers.Dense(64, activation='relu'),\n        layers.Dense(5, activation='softmax')  # 5 classes for diabetic retinopathy levels\n    ])\n    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n    print('Model created.')\n    return model\n\n# Federated learning process\ndef federated_learning(clients_data, epochs=1):\n    global_weights = create_model().get_weights()  # Initialize global model weights\n    for round in range(epochs):\n        client_weights = []\n        for client_df in clients_data:\n            # Prepare data for this client\n            X = []\n            y = []\n            for _, row in client_df.iterrows():\n                img_path = row['path']\n                if os.path.exists(img_path):\n                    try:\n                        img = load_img(img_path, target_size=(224, 224))  # Resize images to (224, 224)\n                        img_array = img_to_array(img) / 255.0  # Normalize image\n                        X.append(img_array)\n                        y.append(row['level'])  # Assuming 'level' is already numeric\n                    except Exception as e:\n                        print(f\"Error loading image {img_path}: {e}\")\n                else:\n                    print(f\"Missing image: {img_path}, skipping this image.\")\n            if X:  # Only train if there are images to process\n                X = np.array(X)\n                y = tf.keras.utils.to_categorical(y, num_classes=5)\n\n                # Create and train model for this client\n                client_model = create_model()\n                client_model.set_weights(global_weights)  # Initialize with global weights\n                client_model.fit(X, y, epochs=1, batch_size=16, verbose=0)  # Train on client's data\n                client_weights.append(client_model.get_weights())\n\n        # Average the weights from each client to update the global model\n        new_weights = []\n        for weights_list in zip(*client_weights):\n            new_weights.append(np.mean(weights_list, axis=0))\n        global_weights = new_weights  # Update global weights\n\n    return global_weights\n\n# Run federated learning\nglobal_weights = federated_learning(clients_data, epochs=3)  # Reduce epochs for quicker training\nglobal_model = create_model()\nglobal_model.set_weights(global_weights)\n\n# Prepare a test set (you may want to create this separately)\n# Here we just take a portion of the original DataFrame for demonstration\ntest_df = retina_df.sample(frac=0.2, random_state=42)\nX_test = []\ny_test = []\nfor _, row in test_df.iterrows():\n    img_path = row['path']\n    if os.path.exists(img_path):\n        img = load_img(img_path, target_size=(224, 224))\n        img_array = img_to_array(img) / 255.0  # Normalize image\n        X_test.append(img_array)\n        y_test.append(row['level'])\nX_test = np.array(X_test)\ny_test = tf.keras.utils.to_categorical(y_test, num_classes=5)\n\n# Evaluate the global model on the test set\ntest_loss, test_accuracy = global_model.evaluate(X_test, y_test, verbose=0)\nprint(f'Test loss: {test_loss}, Test accuracy: {test_accuracy}')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-10T11:08:09.358540Z","iopub.execute_input":"2024-11-10T11:08:09.358961Z","iopub.status.idle":"2024-11-10T13:18:51.362476Z","shell.execute_reply.started":"2024-11-10T11:08:09.358929Z","shell.execute_reply":"2024-11-10T13:18:51.361368Z"}},"outputs":[],"execution_count":null}]}