{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","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":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport warnings \nimport cv2 as cv\nimport numpy as np \nimport pandas as pd\nimport seaborn as sns \nimport matplotlib.pyplot as plt\nfrom tensorflow import keras\nfrom tensorflow.keras import Sequential, layers\nfrom tensorflow.keras.losses import SparseCategoricalCrossentropy\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.applications import EfficientNetB0\nfrom sklearn.model_selection import train_test_split, StratifiedKFold\nfrom sklearn.metrics import accuracy_score, classification_report\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\nfrom sklearn.utils.class_weight import compute_class_weight\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport albumentations as A\nfrom tqdm import tqdm\n\nwarnings.filterwarnings(\"ignore\")\nsns.set_style(style=\"darkgrid\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-24T14:46:50.710959Z","iopub.execute_input":"2025-05-24T14:46:50.711338Z","iopub.status.idle":"2025-05-24T14:47:36.380493Z","shell.execute_reply.started":"2025-05-24T14:46:50.711297Z","shell.execute_reply":"2025-05-24T14:47:36.379485Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =============================================================================\n# 1. VERİ YÜKLEME VE KEŞF\n# =============================================================================\n\ndf = pd.read_csv(\"/kaggle/input/aptos2019-blindness-detection/train.csv\")\nprint(f\"Dataset shape: {df.shape}\")\nprint(f\"Class distribution:\\n{df['diagnosis'].value_counts().sort_index()}\")\n\n# Sınıf dengesizliği görselleştirme\ndata = df.replace({\"diagnosis\":{0:\"No DR\",1:\"Mild\",2:\"Moderate\",3:\"Severe\",4:\"Proliferative DR\"}})\ndiagnosis_count = data.diagnosis.value_counts()\n\nplt.figure(figsize=(10, 6))\nsns.countplot(data=data, x=\"diagnosis\", order=diagnosis_count.index, palette=\"viridis\")\nplt.xlabel(\"Diagnosis\", weight=\"bold\", size=15)\nplt.ylabel(\"Frequency\", weight=\"bold\", size=15)\nplt.title(\"Class Distribution in Dataset\", weight=\"bold\", size=16)\n\nfor i, v in enumerate(diagnosis_count.values):\n    text = f\"{v*100/len(data):0.2f}%\"\n    plt.text(s=text, x=i, y=v+50, ha=\"center\", weight=\"bold\", size=12)\nplt.xticks(rotation=45)\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-24T14:47:36.381689Z","iopub.execute_input":"2025-05-24T14:47:36.382418Z","iopub.status.idle":"2025-05-24T14:47:36.749214Z","shell.execute_reply.started":"2025-05-24T14:47:36.382383Z","shell.execute_reply":"2025-05-24T14:47:36.748301Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =============================================================================\n# 2. GELİŞTİRİLMİŞ VERİ ÖN İŞLEME VE ARTIRMA\n# =============================================================================\n\ndef preprocess_image(image_path, img_size=224):\n    \"\"\"Görüntü ön işleme fonksiyonu\"\"\"\n    img = cv.imread(image_path)\n    if img is None:\n        return None\n    \n    # Ben Graham preprocessing (retina görüntüleri için özel)\n    img = cv.cvtColor(img, cv.COLOR_BGR2RGB)\n    \n    # Circular crop (retina görüntüleri genelde dairesel)\n    h, w = img.shape[:2]\n    center = (w//2, h//2)\n    radius = min(center[0], center[1], w-center[0], h-center[1])\n    \n    # Gaussian blur to reduce noise\n    img = cv.GaussianBlur(img, (5, 5), 0)\n    \n    # CLAHE (Contrast Limited Adaptive Histogram Equalization)\n    lab = cv.cvtColor(img, cv.COLOR_RGB2LAB)\n    clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))\n    lab[:,:,0] = clahe.apply(lab[:,:,0])\n    img = cv.cvtColor(lab, cv.COLOR_LAB2RGB)\n    \n    # Resize\n    img = cv.resize(img, (img_size, img_size))\n    \n    # Normalization\n    img = img.astype(np.float32) / 255.0\n    \n    return img\n\n# Gelişmiş veri artırma pipeline\ndef get_augmentation_pipeline():\n    return A.Compose([\n        A.HorizontalFlip(p=0.5),\n        A.VerticalFlip(p=0.2),\n        A.RandomRotate90(p=0.5),\n        A.Rotate(limit=15, p=0.5),\n        A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.5),\n        A.HueSaturationValue(hue_shift_limit=10, sat_shift_limit=20, val_shift_limit=10, p=0.5),\n        A.GaussianBlur(blur_limit=3, p=0.3),\n        A.GridDistortion(num_steps=5, distort_limit=0.1, p=0.3),\n        A.ElasticTransform(alpha=1, sigma=50, alpha_affine=50, p=0.3),\n        A.CoarseDropout(num_holes_range=(5, 10), hole_height_range=(8, 20), \n                       hole_width_range=(8, 20), p=0.3),\n    ])\n\n# Veri yükleme ve artırma\nX = []\ny = []\nIMG_SIZE = 224\nIMG_DIR = \"/kaggle/input/aptos2019-blindness-detection/train_images\"\naugmentation = get_augmentation_pipeline()\n\n# Sınıf ağırlıkları hesapla\nclass_counts = df['diagnosis'].value_counts().sort_index()\ntotal_samples = len(df)\n\nprint(\"Loading and preprocessing images...\")\nfor target in range(5):\n    image_ids = df[df[\"diagnosis\"] == target][\"id_code\"]\n    print(f\"Processing class {target} ({len(image_ids)} images)\")\n    \n    for image_id in tqdm(image_ids, desc=f\"Class {target}\"):\n        path = os.path.join(IMG_DIR, f\"{image_id}.png\")\n        img = preprocess_image(path, IMG_SIZE)\n        \n        if img is None:\n            continue\n            \n        # Orijinal görüntü\n        X.append(img)\n        y.append(target)\n        \n        # Az örnekli sınıflar için daha fazla artırma\n        augment_count = 0\n        if target == 0:  # No DR - çok fazla örnek var, artırma\n            augment_count = 0\n        elif target == 1:  # Mild\n            augment_count = 1\n        elif target == 2:  # Moderate  \n            augment_count = 2\n        elif target == 3:  # Severe\n            augment_count = 4\n        elif target == 4:  # Proliferative DR\n            augment_count = 6\n            \n        # Veri artırma uygula\n        for _ in range(augment_count):\n            augmented = augmentation(image=img)\n            aug_img = augmented['image']\n            X.append(aug_img)\n            y.append(target)\n\nX = np.array(X)\ny = np.array(y)\n\nprint(f\"Total images after augmentation: {X.shape[0]}\")\nprint(\"Class distribution after augmentation:\", np.bincount(y))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-24T14:47:36.751004Z","iopub.execute_input":"2025-05-24T14:47:36.751229Z","iopub.status.idle":"2025-05-24T14:58:17.880135Z","shell.execute_reply.started":"2025-05-24T14:47:36.751210Z","shell.execute_reply":"2025-05-24T14:58:17.879181Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =============================================================================\n# 3. SINIFLARIN DENGELENMESİ İÇİN CLASS WEIGHTS\n# =============================================================================\n\nclass_weights = compute_class_weight(\n    class_weight='balanced',\n    classes=np.unique(y),\n    y=y\n)\nclass_weight_dict = dict(enumerate(class_weights))\nprint(\"Class weights:\", class_weight_dict)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-24T14:58:17.881437Z","iopub.execute_input":"2025-05-24T14:58:17.881671Z","iopub.status.idle":"2025-05-24T14:58:17.888119Z","shell.execute_reply.started":"2025-05-24T14:58:17.881650Z","shell.execute_reply":"2025-05-24T14:58:17.887460Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =============================================================================\n# 4. VERİ BÖLME\n# =============================================================================\n\n# Stratified split\nx_temp, x_test, y_temp, y_test = train_test_split(\n    X, y, test_size=0.15, random_state=42, stratify=y\n)\n\nx_train, x_val, y_train, y_val = train_test_split(\n    x_temp, y_temp, test_size=0.1765, random_state=42, stratify=y_temp\n)\n\ndel X, y  # Hafızayı boşalt\n\nprint(f\"Train: {x_train.shape}, Val: {x_val.shape}, Test: {x_test.shape}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-24T14:58:17.888954Z","iopub.execute_input":"2025-05-24T14:58:17.889154Z","iopub.status.idle":"2025-05-24T14:58:23.832479Z","shell.execute_reply.started":"2025-05-24T14:58:17.889136Z","shell.execute_reply":"2025-05-24T14:58:23.831694Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =============================================================================\n# 5. GELİŞTİRİLMİŞ MODEL MİMARİSİ (TRANSFER LEARNING)\n# =============================================================================\n\ndef create_advanced_model(input_shape=(224, 224, 3), num_classes=5, use_transfer_learning=False):\n    \"\"\"Gelişmiş model mimarisi\"\"\"\n    \n    if use_transfer_learning:\n        try:\n            # Önce ResNet50 dene\n            from tensorflow.keras.applications import ResNet50\n            base_model = ResNet50(\n                weights='imagenet',\n                include_top=False,\n                input_shape=input_shape\n            )\n            \n            # İlk katmanları dondur\n            base_model.trainable = False\n            \n            model = Sequential([\n                base_model,\n                layers.GlobalAveragePooling2D(),\n                layers.BatchNormalization(),\n                layers.Dropout(0.5),\n                layers.Dense(512, activation='relu'),\n                layers.BatchNormalization(),\n                layers.Dropout(0.3),\n                layers.Dense(256, activation='relu'),\n                layers.BatchNormalization(),\n                layers.Dropout(0.2),\n                layers.Dense(num_classes, activation='softmax')\n            ])\n            \n            print(\"Using ResNet50 Transfer Learning\")\n            \n        except Exception as e:\n            print(f\"Transfer learning failed: {e}\")\n            print(\"Falling back to custom CNN...\")\n            use_transfer_learning = False\n    \n    if not use_transfer_learning:\n        # Geliştirilmiş özel CNN mimarisi\n        model = Sequential([\n            layers.InputLayer(input_shape=input_shape),\n            \n            # Block 1\n            layers.Conv2D(32, (3, 3), padding=\"same\", activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.Conv2D(32, (3, 3), padding=\"same\", activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.MaxPooling2D((2, 2)),\n            layers.Dropout(0.25),\n            \n            # Block 2\n            layers.Conv2D(64, (3, 3), padding=\"same\", activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.Conv2D(64, (3, 3), padding=\"same\", activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.MaxPooling2D((2, 2)),\n            layers.Dropout(0.25),\n            \n            # Block 3\n            layers.Conv2D(128, (3, 3), padding=\"same\", activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.Conv2D(128, (3, 3), padding=\"same\", activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.MaxPooling2D((2, 2)),\n            layers.Dropout(0.25),\n            \n            # Block 4\n            layers.Conv2D(256, (3, 3), padding=\"same\", activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.Conv2D(256, (3, 3), padding=\"same\", activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.MaxPooling2D((2, 2)),\n            layers.Dropout(0.25),\n            \n            # Block 5\n            layers.Conv2D(512, (3, 3), padding=\"same\", activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.Conv2D(512, (3, 3), padding=\"same\", activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.GlobalAveragePooling2D(),\n            layers.Dropout(0.4),\n            \n            # Dense layers\n            layers.Dense(1024, activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.Dropout(0.5),\n            layers.Dense(512, activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.Dropout(0.3),\n            layers.Dense(256, activation=\"relu\"),\n            layers.BatchNormalization(),\n            layers.Dropout(0.2),\n            layers.Dense(num_classes, activation=\"softmax\")\n        ])\n        \n        print(\"Using Custom CNN Architecture\")\n    \n    return model\n\n# Model oluştur (Transfer learning yerine özel CNN)\nmodel = create_advanced_model(use_transfer_learning=False)\n\n# Optimizer\noptimizer = Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999)\n\n# Compile\nmodel.compile(\n    optimizer=optimizer,\n    loss=SparseCategoricalCrossentropy(),  # Label smoothing kaldırıldı\n    metrics=[\"accuracy\"]  # top_2_accuracy da kaldırıldı uyumluluk için\n)\n\nmodel.summary()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-24T15:09:04.067424Z","iopub.execute_input":"2025-05-24T15:09:04.067779Z","iopub.status.idle":"2025-05-24T15:09:04.316942Z","shell.execute_reply.started":"2025-05-24T15:09:04.067750Z","shell.execute_reply":"2025-05-24T15:09:04.316263Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =============================================================================\n# 6. GELİŞTİRİLMİŞ CALLBACK'LER\n# =============================================================================\n\ncallbacks = [\n    EarlyStopping(\n        monitor='val_accuracy',\n        mode=\"max\",\n        verbose=1,\n        patience=10,\n        restore_best_weights=True\n    ),\n    ReduceLROnPlateau(\n        monitor='val_loss',\n        factor=0.5,\n        patience=5,\n        min_lr=1e-7,\n        verbose=1\n    )\n]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-24T15:09:07.820455Z","iopub.execute_input":"2025-05-24T15:09:07.820805Z","iopub.status.idle":"2025-05-24T15:09:07.825064Z","shell.execute_reply.started":"2025-05-24T15:09:07.820774Z","shell.execute_reply":"2025-05-24T15:09:07.824267Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =============================================================================\n# 7. MODEL EĞİTİMİ\n# =============================================================================\n\nprint(\"Starting model training...\")\nhistory = model.fit(\n    x_train, y_train,\n    epochs=50,\n    batch_size=32,  # Daha küçük batch size\n    validation_data=(x_val, y_val),\n    callbacks=callbacks,\n    class_weight=class_weight_dict,  # Sınıf ağırlıkları\n    verbose=1\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-24T15:09:10.159608Z","iopub.execute_input":"2025-05-24T15:09:10.159911Z","iopub.status.idle":"2025-05-24T15:25:12.600491Z","shell.execute_reply.started":"2025-05-24T15:09:10.159888Z","shell.execute_reply":"2025-05-24T15:25:12.599717Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =============================================================================\n# 8. SONUÇLARIN GÖRSELLEŞTİRİLMESİ\n# =============================================================================\n\nplt.figure(figsize=(15, 5))\n\nplt.subplot(1, 3, 1)\nplt.title(\"Accuracy\", fontsize=14, weight='bold')\nplt.plot(history.history[\"accuracy\"], label=\"Train Accuracy\", linewidth=2)\nplt.plot(history.history[\"val_accuracy\"], label=\"Validation Accuracy\", linewidth=2)\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Accuracy\")\nplt.legend()\nplt.grid(True, alpha=0.3)\n\nplt.subplot(1, 3, 2)\nplt.title(\"Loss\", fontsize=14, weight='bold')\nplt.plot(history.history[\"loss\"], label=\"Train Loss\", linewidth=2)\nplt.plot(history.history[\"val_loss\"], label=\"Validation Loss\", linewidth=2)\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Loss\")\nplt.legend()\nplt.grid(True, alpha=0.3)\n\nplt.subplot(1, 3, 3)\nplt.title(\"Learning Rate\", fontsize=14, weight='bold')\nif 'lr' in history.history:\n    plt.plot(history.history[\"lr\"], linewidth=2, color='red')\n    plt.xlabel(\"Epochs\")\n    plt.ylabel(\"Learning Rate\")\n    plt.grid(True, alpha=0.3)\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-24T15:25:12.618189Z","iopub.execute_input":"2025-05-24T15:25:12.618492Z","iopub.status.idle":"2025-05-24T15:25:13.376715Z","shell.execute_reply.started":"2025-05-24T15:25:12.618467Z","shell.execute_reply":"2025-05-24T15:25:13.375778Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =============================================================================\n# 9. MODEL DEĞERLENDİRMESİ\n# =============================================================================\n\nprint(\"Evaluating model on test set...\")\ny_predicted = model.predict(x_test, verbose=1)\ny_predicted_classes = np.argmax(y_predicted, axis=1)\n\n# Accuracy\ntest_accuracy = accuracy_score(y_test, y_predicted_classes)\nprint(f\"\\n{'='*50}\")\nprint(f\"TEST ACCURACY: {test_accuracy*100:.2f}%\")\nprint(f\"{'='*50}\")\n\n# Classification Report\nprint(\"\\nClassification Report:\")\nclass_names = [\"No DR\", \"Mild\", \"Moderate\", \"Severe\", \"Proliferative DR\"]\nprint(classification_report(y_test, y_predicted_classes, target_names=class_names))\n\n# Confusion Matrix\ncm = confusion_matrix(y_test, y_predicted_classes)\nplt.figure(figsize=(10, 8))\ncmd = ConfusionMatrixDisplay(\n    confusion_matrix=cm, \n    display_labels=class_names\n)\ncmd.plot(cmap=plt.cm.Blues, values_format='d', xticks_rotation=\"vertical\")\nplt.title(\"Confusion Matrix\", fontsize=16, weight='bold')\nplt.tight_layout()\nplt.show()\n\n# Per-class accuracy\nprint(\"\\nPer-class Accuracy:\")\nfor i, class_name in enumerate(class_names):\n    class_mask = (y_test == i)\n    if np.sum(class_mask) > 0:\n        class_acc = accuracy_score(y_test[class_mask], y_predicted_classes[class_mask])\n        print(f\"{class_name}: {class_acc*100:.2f}%\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-24T15:25:56.806595Z","iopub.execute_input":"2025-05-24T15:25:56.806914Z","iopub.status.idle":"2025-05-24T15:26:01.694427Z","shell.execute_reply.started":"2025-05-24T15:25:56.806889Z","shell.execute_reply":"2025-05-24T15:26:01.693566Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =============================================================================\n# 10. ÖRNEK TAHMİNLER\n# =============================================================================\n\ndecode = {0: \"No DR\", 1: \"Mild\", 2: \"Moderate\", 3: \"Severe\", 4: \"Proliferative DR\"}\n\nplt.figure(figsize=(20, 10))\nrandom_indices = np.random.randint(0, len(df), size=12)\n\nfor i, idx in enumerate(random_indices, 1):\n    plt.subplot(3, 4, i)\n    \n    image_id = df.loc[idx, \"id_code\"]\n    true_label = df.loc[idx, \"diagnosis\"]\n    \n    img_path = os.path.join(IMG_DIR, f\"{image_id}.png\")\n    img = preprocess_image(img_path)\n    \n    if img is None:\n        plt.text(0.5, 0.5, \"Image Not Found\", ha=\"center\", va=\"center\", color=\"red\")\n        plt.axis(\"off\")\n        continue\n    \n    # Tahmin\n    input_img = np.expand_dims(img, axis=0)\n    prediction = model.predict(input_img, verbose=0)\n    pred_label = np.argmax(prediction)\n    confidence = np.max(prediction) * 100\n    \n    # Görsel\n    plt.imshow(img)\n    plt.axis(\"off\")\n    \n    # Etiketler\n    true_text = f\"True: {decode[true_label]}\"\n    pred_text = f\"Pred: {decode[pred_label]} ({confidence:.1f}%)\"\n    \n    # Doğru/yanlış tahmini renklendirme\n    color = \"green\" if true_label == pred_label else \"red\"\n    \n    plt.text(5, 15, true_text, color=\"white\", fontsize=10, weight=\"bold\", \n             bbox=dict(boxstyle=\"round,pad=0.3\", facecolor=\"blue\", alpha=0.8))\n    plt.text(5, 210, pred_text, color=\"white\", fontsize=10, weight=\"bold\",\n             bbox=dict(boxstyle=\"round,pad=0.3\", facecolor=color, alpha=0.8))\n\nplt.suptitle(\"Sample Predictions\", fontsize=16, weight='bold')\nplt.tight_layout()\nplt.show()\n\nprint(\"\\n\" + \"=\"*70)\nprint(\"MODEL TRAINING COMPLETED!\")\nprint(\"=\"*70)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-24T15:26:28.957709Z","iopub.execute_input":"2025-05-24T15:26:28.958069Z","iopub.status.idle":"2025-05-24T15:26:35.517816Z","shell.execute_reply.started":"2025-05-24T15:26:28.958030Z","shell.execute_reply":"2025-05-24T15:26:35.516496Z"}},"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":"","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":"","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":"","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":"","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":"","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":"","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":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}