{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.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":14774,"databundleVersionId":875431,"sourceType":"competition"},{"sourceId":9900,"sourceType":"datasetVersion","datasetId":6209}],"dockerImageVersionId":31192,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Frameworks and Libraries:\nPython tensorflow(keras)","metadata":{}},{"cell_type":"code","source":"import os\nos.environ[\"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION\"] = \"python\"\n\nimport cv2\nimport random\nimport warnings\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nfrom sklearn.metrics import confusion_matrix, cohen_kappa_score\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras import optimizers, applications\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau\nfrom tensorflow.keras.layers import Dense, Dropout, GlobalAveragePooling2D, Input\n\ndef seed_everything(seed=0):\n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    tf.random.set_seed(seed)\n\nseed_everything()\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":true,"_kg_hide-output":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:39:13.125170Z","iopub.execute_input":"2025-12-24T17:39:13.125444Z","iopub.status.idle":"2025-12-24T17:39:29.620092Z","shell.execute_reply.started":"2025-12-24T17:39:13.125422Z","shell.execute_reply":"2025-12-24T17:39:29.619506Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Import and Loading Dataset - Aptos2019\nفایل اطلاعات مربوط به آموزش مدل و تست مدل را وارد می‌کنیم.\n","metadata":{"_kg_hide-output":true}},{"cell_type":"code","source":"train = pd.read_csv('../input/aptos2019-blindness-detection/train.csv')\ntest = pd.read_csv('../input/aptos2019-blindness-detection/test.csv')","metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_kg_hide-input":false,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:39:29.621709Z","iopub.execute_input":"2025-12-24T17:39:29.622388Z","iopub.status.idle":"2025-12-24T17:39:29.645824Z","shell.execute_reply.started":"2025-12-24T17:39:29.622366Z","shell.execute_reply":"2025-12-24T17:39:29.645326Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Check Data\n\n## Data overview\nبرای آموزش ۳۶۶۲ تصویر داریم\nبرای تست ۱۹۲۸ تصویر داریم(در انتها با این تصاویر تست را انجام می‌دهیم تا ببینیم روی دیتای متفاوت با دیتای تست چه خروجی‌ای میگیریم)","metadata":{}},{"cell_type":"code","source":"print('Number of Train Samples: ', train.shape[0])\nprint('Number of Test Samples: ', test.shape[0])\ndisplay(train.head())","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:39:29.646677Z","iopub.execute_input":"2025-12-24T17:39:29.646958Z","iopub.status.idle":"2025-12-24T17:39:29.826552Z","shell.execute_reply.started":"2025-12-24T17:39:29.646917Z","shell.execute_reply":"2025-12-24T17:39:29.825986Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Label class distribution\n\nمطابق نمودار مشاهده می‌کنید که دیتاست ما بالانس نیست. کلاس ۰ تقریبا دو برابر کلاس ۲ است و کلاس‌های دیگر تقریبا نصف کلاس ۲ هستند.\n\n","metadata":{}},{"cell_type":"code","source":"f, ax = plt.subplots(figsize=(14, 8.7))\nax = sns.countplot(x=\"diagnosis\", data=train, palette=\"GnBu_d\")\nsns.despine()\nplt.show()","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:39:29.827829Z","iopub.execute_input":"2025-12-24T17:39:29.828087Z","iopub.status.idle":"2025-12-24T17:39:30.026927Z","shell.execute_reply.started":"2025-12-24T17:39:29.828070Z","shell.execute_reply":"2025-12-24T17:39:30.026229Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"##### توضیحات تصاویر و نمونه‌ها\n- 0 - No DR - بدون رتینوپاتی دیابتی\n- 1 - Mild - خفیف\n- 2 - Moderate - متوسط\n- 3 - Severe - شدید\n- 4 - Proliferative DR - پرولیفراتیو - نیاز به لیزردرمانی یا درمان‌های تهاجمی","metadata":{}},{"cell_type":"markdown","source":"### Image Preview\nدر این بخش چند نمونه از عکس‌هایی که داریم را بررسی می‌کنیم\nتصاویر اندازه‌های مختلفی دارند، ممکن است نیاز به تغییر اندازه داشته باشند","metadata":{}},{"cell_type":"code","source":"sns.set_style(\"white\")\ncount = 1\nplt.figure(figsize=[20, 20])\nfor img_name in train['id_code'][:15]:\n    img = cv2.imread(\"../input/aptos2019-blindness-detection/train_images/%s.png\" % img_name)[...,[2, 1, 0]]\n    plt.subplot(5, 5, count)\n    plt.imshow(img)\n    plt.title(\"Image %s\" % count)\n    count += 1\n    \nplt.show()","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:39:30.027768Z","iopub.execute_input":"2025-12-24T17:39:30.028045Z","iopub.status.idle":"2025-12-24T17:39:40.821028Z","shell.execute_reply.started":"2025-12-24T17:39:30.028021Z","shell.execute_reply":"2025-12-24T17:39:40.819994Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# پارامترهای مدل","metadata":{}},{"cell_type":"code","source":"# Model parameters\nBATCH_SIZE = 8\nEPOCHS = 20\nWARMUP_EPOCHS = 2\nLEARNING_RATE = 1e-4\nWARMUP_LEARNING_RATE = 1e-3\nHEIGHT = 512\nWIDTH = 512\nCANAL = 3\nN_CLASSES = train['diagnosis'].nunique()\nES_PATIENCE = 5\nRLROP_PATIENCE = 3\nDECAY_DROP = 0.5","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:39:40.822035Z","iopub.execute_input":"2025-12-24T17:39:40.822295Z","iopub.status.idle":"2025-12-24T17:39:40.828624Z","shell.execute_reply.started":"2025-12-24T17:39:40.822270Z","shell.execute_reply":"2025-12-24T17:39:40.828077Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## پیش پردازش داده","metadata":{}},{"cell_type":"code","source":"# Preprocecss data\ntrain[\"id_code\"] = train[\"id_code\"].apply(lambda x: x + \".png\")\ntest[\"id_code\"] = test[\"id_code\"].apply(lambda x: x + \".png\")\ntrain['diagnosis'] = train['diagnosis'].astype('str')\ntrain.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:39:40.829371Z","iopub.execute_input":"2025-12-24T17:39:40.829628Z","iopub.status.idle":"2025-12-24T17:39:40.851978Z","shell.execute_reply.started":"2025-12-24T17:39:40.829607Z","shell.execute_reply":"2025-12-24T17:39:40.851487Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Data generator\nتولید تعدادی داده برای بالانس کردن دیتا","metadata":{}},{"cell_type":"code","source":"train_datagen=ImageDataGenerator(rescale=1./255, \n                                 validation_split=0.2,\n                                 horizontal_flip=True)\n\ntrain_generator=train_datagen.flow_from_dataframe(\n    dataframe=train,\n    directory=\"../input/aptos2019-blindness-detection/train_images/\",\n    x_col=\"id_code\",\n    y_col=\"diagnosis\",\n    batch_size=BATCH_SIZE,\n    class_mode=\"categorical\",\n    target_size=(HEIGHT, WIDTH),\n    subset='training')\n\nvalid_generator=train_datagen.flow_from_dataframe(\n    dataframe=train,\n    directory=\"../input/aptos2019-blindness-detection/train_images/\",\n    x_col=\"id_code\",\n    y_col=\"diagnosis\",\n    batch_size=BATCH_SIZE,\n    class_mode=\"categorical\",    \n    target_size=(HEIGHT, WIDTH),\n    subset='validation')\n\ntest_datagen = ImageDataGenerator(rescale=1./255)\n\ntest_generator = test_datagen.flow_from_dataframe(  \n        dataframe=test,\n        directory = \"../input/aptos2019-blindness-detection/test_images/\",\n        x_col=\"id_code\",\n        target_size=(HEIGHT, WIDTH),\n        batch_size=1,\n        shuffle=False,\n        class_mode=None)","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:39:40.852595Z","iopub.execute_input":"2025-12-24T17:39:40.852802Z","iopub.status.idle":"2025-12-24T17:39:52.418213Z","shell.execute_reply.started":"2025-12-24T17:39:40.852778Z","shell.execute_reply":"2025-12-24T17:39:52.417594Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"def create_model(input_shape, n_out):\n    base_model = tf.keras.applications.ResNet50(\n        weights=\"imagenet\",\n        include_top=False,\n        input_shape=(input_shape[0], input_shape[1], 3)\n    )\n\n    x = GlobalAveragePooling2D()(base_model.output)\n    x = Dropout(0.5)(x)\n    x = Dense(2048, activation='relu')(x)\n    x = Dropout(0.5)(x)\n    outputs = Dense(n_out, activation='softmax')(x)\n\n    model = Model(inputs=base_model.input, outputs=outputs)\n    return model\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:39:52.418864Z","iopub.execute_input":"2025-12-24T17:39:52.419097Z","iopub.status.idle":"2025-12-24T17:39:52.423817Z","shell.execute_reply.started":"2025-12-24T17:39:52.419070Z","shell.execute_reply":"2025-12-24T17:39:52.423301Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = create_model(input_shape=(HEIGHT, WIDTH, 3), n_out=N_CLASSES)\n\nfor layer in model.layers:\n    layer.trainable = False\n\nfor layer in model.layers[-5:]:\n    layer.trainable = True\n\noptimizer = tf.keras.optimizers.Adam(\n    learning_rate=WARMUP_LEARNING_RATE\n)\n\nmodel.compile(\n    optimizer=optimizer,\n    loss=\"categorical_crossentropy\",\n    metrics=[\"accuracy\"]\n)\n\nmodel.summary()\n","metadata":{"_kg_hide-output":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:39:52.425717Z","iopub.execute_input":"2025-12-24T17:39:52.426197Z","iopub.status.idle":"2025-12-24T17:39:56.202242Z","shell.execute_reply.started":"2025-12-24T17:39:52.426180Z","shell.execute_reply":"2025-12-24T17:39:56.201483Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Train top layers\nآخرین لایه مدل را مجددا آموزش می‌دهیم تا مخصوص تشخیص رتینوپاتی دیابتی باشد","metadata":{}},{"cell_type":"code","source":"history_warmup = model.fit(\n    train_generator,\n    validation_data=valid_generator,\n    epochs=WARMUP_EPOCHS,\n    verbose=1\n)\n","metadata":{"_kg_hide-output":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:39:56.203067Z","iopub.execute_input":"2025-12-24T17:39:56.203350Z","iopub.status.idle":"2025-12-24T17:54:53.844714Z","shell.execute_reply.started":"2025-12-24T17:39:56.203325Z","shell.execute_reply":"2025-12-24T17:54:53.843895Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Fine-tune the complete model\nمدل‌ها بهینه می‌کنیم که برای تشخیص رتینوپاتی دیابتی باشد. علت اصلی این است که مدل‌های آماده عمومی هستند و برای بهبود کارکرد و کم کردن بار پردازشی آنها را روی دیتای خودمان که از اپتوس ۲۰۱۹ استفاده شده آموزش بدهیم.\n","metadata":{}},{"cell_type":"code","source":"for layer in model.layers:\n    layer.trainable = True\n\nes = EarlyStopping(\n    monitor='val_loss',\n    mode='min',\n    patience=ES_PATIENCE,\n    restore_best_weights=True,\n    verbose=1\n)\n\nrlrop = ReduceLROnPlateau(\n    monitor='val_loss',\n    mode='min',\n    patience=RLROP_PATIENCE,\n    factor=DECAY_DROP,\n    min_lr=1e-6,\n    verbose=1\n)\n\ncallback_list = [es, rlrop]\n\noptimizer = tf.keras.optimizers.Adam(\n    learning_rate=LEARNING_RATE\n)\n\nmodel.compile(\n    optimizer=optimizer,\n    loss=\"categorical_crossentropy\",\n    metrics=[\"accuracy\"]\n)\n\n\nmodel.summary()\n\n","metadata":{"_kg_hide-output":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:54:53.846314Z","iopub.execute_input":"2025-12-24T17:54:53.846537Z","iopub.status.idle":"2025-12-24T17:54:53.999752Z","shell.execute_reply.started":"2025-12-24T17:54:53.846520Z","shell.execute_reply":"2025-12-24T17:54:53.999218Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"مدل را بهینه می‌کنیم","metadata":{}},{"cell_type":"code","source":"history_finetunning = model.fit(\n    train_generator,\n    validation_data=valid_generator,\n    epochs=EPOCHS,\n    callbacks=callback_list,\n    verbose=1\n).history\n","metadata":{"_kg_hide-output":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T17:54:54.000454Z","iopub.execute_input":"2025-12-24T17:54:54.000690Z","iopub.status.idle":"2025-12-24T19:00:54.687868Z","shell.execute_reply.started":"2025-12-24T17:54:54.000668Z","shell.execute_reply":"2025-12-24T19:00:54.687235Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model loss graph ","metadata":{}},{"cell_type":"code","source":"history_warmup_dict = history_warmup.history\nhistory_finetunning_dict = history_finetunning\n\nhistory = {\n    'loss': history_warmup_dict['loss'] + history_finetunning_dict['loss'],\n    'val_loss': history_warmup_dict['val_loss'] + history_finetunning_dict['val_loss'],\n    'accuracy': history_warmup_dict.get('accuracy', history_warmup_dict.get('acc', [])) + \n                history_finetunning_dict.get('accuracy', history_finetunning_dict.get('acc', [])),\n    'val_accuracy': history_warmup_dict.get('val_accuracy', history_warmup_dict.get('val_acc', [])) + \n                    history_finetunning_dict.get('val_accuracy', history_finetunning_dict.get('val_acc', []))\n}\n\nsns.set_style(\"whitegrid\")\nfig, (ax1, ax2) = plt.subplots(2, 1, sharex='col', figsize=(20, 14))\n\nax1.plot(history['loss'], label='Train loss')\nax1.plot(history['val_loss'], label='Validation loss')\nax1.legend(loc='best')\nax1.set_title('Loss')\n\nax2.plot(history['accuracy'], label='Train Accuracy')\nax2.plot(history['val_accuracy'], label='Validation accuracy')\nax2.legend(loc='best')\nax2.set_title('Accuracy')\n\nplt.xlabel('Epochs')\nsns.despine()\nplt.show()\n\nhistory.keys()\n\nhistory['loss']\nhistory['val_loss']\nhistory['accuracy']\nhistory['val_accuracy']\n\nhistory['loss'][-1], history['val_loss'][-1], history['accuracy'][-1], history['val_accuracy'][-1]\n","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T19:00:54.688865Z","iopub.execute_input":"2025-12-24T19:00:54.689140Z","iopub.status.idle":"2025-12-24T19:00:55.120663Z","shell.execute_reply.started":"2025-12-24T19:00:54.689116Z","shell.execute_reply":"2025-12-24T19:00:55.119931Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model Evaluation\nارزیابی مدل و در تشخیص تصاویر","metadata":{}},{"cell_type":"code","source":"complete_datagen = ImageDataGenerator(rescale=1./255)\ncomplete_generator = complete_datagen.flow_from_dataframe(  \n        dataframe=train,\n        directory=\"../input/aptos2019-blindness-detection/train_images/\",\n        x_col=\"id_code\",\n        target_size=(HEIGHT, WIDTH),\n        batch_size=1,\n        shuffle=False,\n        class_mode=None)\n\nSTEP_SIZE_COMPLETE = complete_generator.n // complete_generator.batch_size\n\ntrain_preds = model.predict(complete_generator, steps=STEP_SIZE_COMPLETE, verbose=1)\ntrain_preds = [np.argmax(pred) for pred in train_preds]\n","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T19:00:55.121502Z","iopub.execute_input":"2025-12-24T19:00:55.121929Z","iopub.status.idle":"2025-12-24T19:06:55.894978Z","shell.execute_reply.started":"2025-12-24T19:00:55.121902Z","shell.execute_reply":"2025-12-24T19:06:55.894353Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Confusion Matrix\nماتریس درهم ریختگی","metadata":{}},{"cell_type":"code","source":"labels = ['0 - No DR', '1 - Mild', '2 - Moderate', '3 - Severe', '4 - Proliferative DR']\ncnf_matrix = confusion_matrix(train['diagnosis'].astype('int'), train_preds)\ncnf_matrix_norm = cnf_matrix.astype('float') / cnf_matrix.sum(axis=1)[:, np.newaxis]\ndf_cm = pd.DataFrame(cnf_matrix_norm, index=labels, columns=labels)\nplt.figure(figsize=(16, 7))\nsns.heatmap(df_cm, annot=True, fmt='.2f', cmap=\"Blues\")\nplt.show()","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T19:33:43.837659Z","iopub.execute_input":"2025-12-24T19:33:43.838305Z","iopub.status.idle":"2025-12-24T19:33:44.086745Z","shell.execute_reply.started":"2025-12-24T19:33:43.838279Z","shell.execute_reply":"2025-12-24T19:33:44.086170Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Quadratic Weighted Kappa\nنمودار کاپا","metadata":{}},{"cell_type":"code","source":"print(\"Train Cohen Kappa score: %.3f\" % cohen_kappa_score(train_preds, train['diagnosis'].astype('int'), weights='quadratic'))","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T19:06:56.154224Z","iopub.execute_input":"2025-12-24T19:06:56.154499Z","iopub.status.idle":"2025-12-24T19:06:56.162307Z","shell.execute_reply.started":"2025-12-24T19:06:56.154475Z","shell.execute_reply":"2025-12-24T19:06:56.161725Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Apply model to test set and output predictions\nاجرای مدل روی تصاویر تست","metadata":{}},{"cell_type":"code","source":"test_generator.reset()\nSTEP_SIZE_TEST = test_generator.n // test_generator.batch_size\n\npreds = model.predict(test_generator, steps=STEP_SIZE_TEST, verbose=1)\npredictions = [np.argmax(pred) for pred in preds]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T19:06:56.163069Z","iopub.execute_input":"2025-12-24T19:06:56.163311Z","iopub.status.idle":"2025-12-24T19:08:34.504687Z","shell.execute_reply.started":"2025-12-24T19:06:56.163290Z","shell.execute_reply":"2025-12-24T19:08:34.504070Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"filenames = test_generator.filenames\nresults = pd.DataFrame({'id_code':filenames, 'diagnosis':predictions})\nresults['id_code'] = results['id_code'].map(lambda x: str(x)[:-4])\nresults.to_csv('submission.csv',index=False)\nresults.head(10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T19:08:34.505468Z","iopub.execute_input":"2025-12-24T19:08:34.505709Z","iopub.status.idle":"2025-12-24T19:08:34.524682Z","shell.execute_reply.started":"2025-12-24T19:08:34.505690Z","shell.execute_reply":"2025-12-24T19:08:34.523848Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Predictions class distribution\nتوزیع کلاس‌ها روی نمودار","metadata":{}},{"cell_type":"code","source":"f, ax = plt.subplots(figsize=(14, 8.7))\nax = sns.countplot(x=\"diagnosis\", data=results, palette=\"GnBu_d\")\nsns.despine()\nplt.show()","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T19:08:34.525413Z","iopub.execute_input":"2025-12-24T19:08:34.526038Z","iopub.status.idle":"2025-12-24T19:08:34.679731Z","shell.execute_reply.started":"2025-12-24T19:08:34.526020Z","shell.execute_reply":"2025-12-24T19:08:34.679150Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Result for Thesis","metadata":{}},{"cell_type":"code","source":"history.keys()\n\nhistory['loss']\nhistory['val_loss']\nhistory['accuracy']\nhistory['val_accuracy']\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-24T19:09:28.885197Z","iopub.execute_input":"2025-12-24T19:09:28.885483Z","iopub.status.idle":"2025-12-24T19:09:28.890611Z","shell.execute_reply.started":"2025-12-24T19:09:28.885461Z","shell.execute_reply":"2025-12-24T19:09:28.889992Z"}},"outputs":[],"execution_count":null}]}