{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"! pip install ../input/einops-030/einops-0.3.0-py2.py3-none-any.whl\n! pip install /kaggle/input/rsna-2022-whl/{pydicom-2.3.0-py3-none-any.whl,pylibjpeg-1.4.0-py3-none-any.whl,python_gdcm-3.0.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl}","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-01-22T04:48:08.113049Z","iopub.execute_input":"2023-01-22T04:48:08.113559Z","iopub.status.idle":"2023-01-22T04:49:15.148734Z","shell.execute_reply.started":"2023-01-22T04:48:08.113483Z","shell.execute_reply":"2023-01-22T04:49:15.147502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport sys\nimport cv2\nimport glob\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nimport wandb\nimport sys\nsys.path.append('../input/timm-pytorch-image-models/pytorch-image-models-master')\nimport timm \nimport torch\nimport torch.nn as nn\nfrom einops import rearrange\nfrom torch.utils.data import DataLoader, Dataset\n\nfrom sklearn.metrics import f1_score\nfrom sklearn.model_selection import StratifiedGroupKFold\n\nfrom accelerate.tracking import GeneralTracker\nfrom accelerate import Accelerator, notebook_launcher","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:28.614481Z","iopub.execute_input":"2023-01-22T05:12:28.615253Z","iopub.status.idle":"2023-01-22T05:12:28.624018Z","shell.execute_reply.started":"2023-01-22T05:12:28.615214Z","shell.execute_reply":"2023-01-22T05:12:28.622747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport cv2\nimport glob\nimport timm\nimport torch\nimport wandb\nimport pydicom\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport torch.nn as nn\nfrom tqdm import tqdm\nfrom pydicom import dcmread\nfrom einops import rearrange\nfrom torchvision import transforms\nfrom matplotlib import pyplot as plt\nfrom joblib import Parallel, delayed\n\nfrom kaggle_secrets import UserSecretsClient\nfrom torch.utils.data import Dataset, DataLoader\nfrom accelerate import Accelerator, notebook_launcher","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:29.951447Z","iopub.execute_input":"2023-01-22T05:12:29.952732Z","iopub.status.idle":"2023-01-22T05:12:29.961676Z","shell.execute_reply.started":"2023-01-22T05:12:29.952678Z","shell.execute_reply":"2023-01-22T05:12:29.960322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"weights_path='/kaggle/input/vit-single-fold'","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:30.210847Z","iopub.execute_input":"2023-01-22T05:12:30.211549Z","iopub.status.idle":"2023-01-22T05:12:30.216707Z","shell.execute_reply.started":"2023-01-22T05:12:30.211495Z","shell.execute_reply":"2023-01-22T05:12:30.215393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output_dir = \"/kaggle/tmp/output/\"\nos.makedirs(output_dir, exist_ok=True)","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:30.361777Z","iopub.execute_input":"2023-01-22T05:12:30.362953Z","iopub.status.idle":"2023-01-22T05:12:30.367831Z","shell.execute_reply.started":"2023-01-22T05:12:30.362907Z","shell.execute_reply":"2023-01-22T05:12:30.366983Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def process(f, size=224, save_folder=\"\", extension=\"png\"):\n    patient = f.split('/')[-2]    \n    image = f.split('/')[-1][:-4]\n\n    os.makedirs(f\"{save_folder}/{patient}/\", exist_ok=True)\n\n    dicom = pydicom.dcmread(f)\n    img = dicom.pixel_array\n\n    img = (img - img.min()) / (img.max() - img.min())\n\n    img = cv2.resize(img, (size, size))\n    cv2.imwrite(f\"{save_folder}/{patient}/{image}.{extension}\", (img * 255).astype(np.uint8))","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:31.158244Z","iopub.execute_input":"2023-01-22T05:12:31.158784Z","iopub.status.idle":"2023-01-22T05:12:31.166652Z","shell.execute_reply.started":"2023-01-22T05:12:31.158748Z","shell.execute_reply":"2023-01-22T05:12:31.165555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Config = {\n    'TRAIN_BS': 32,\n    'VALID_BS': 32,\n    'MODEL_NAME': 'vit_base_patch16_224',\n    'NUM_WORKERS': 8,\n    'PARENT_PATH': '/kaggle/input/rsna-mammography-images-as-pngs/images_as_pngs_512/train_images_processed_512/',\n    'FILE_PATH': '/kaggle/input/rsna-breast-cancer-detection/train.csv',\n    'LOSS': 'BCEWithLogitsLoss',\n    'EVAL_METRIC': 'F1',\n    'NB_EPOCHS': 3,\n    'SPLITS': 5,\n    'T_0': 20,\n    'η_min': 1e-4,\n    'fc_dropout': 0.2,\n    'betas': (0.9, 0.999),\n    'N_LABELS': 1,\n    'LR': 2e-4,\n    'competition': 'rsna_mammography',\n    '_wandb_kernel': 'tanaym',\n    'path_to_model':'/kaggle/input/vit-single-fold/fold_single_model.pth'\n}","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:31.368354Z","iopub.execute_input":"2023-01-22T05:12:31.369029Z","iopub.status.idle":"2023-01-22T05:12:31.376206Z","shell.execute_reply.started":"2023-01-22T05:12:31.368973Z","shell.execute_reply":"2023-01-22T05:12:31.375052Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CFG:\n    class data:\n        fold=0\n        batch_size=2\n        image_size=(224, 224)\n        path_to_test=\"../input/rsna-breast-cancer-detection/test.csv\"\n        path_to_images=\"../input/rsna-breast-cancer-detection/test_images\"\n        path_to_test_images=\"/kaggle/working/images/RSNA-png-256-test/\"\n        path_to_dcm_images = \"/kaggle/input/rsna-breast-cancer-detection/test_images/*/*.dcm\"\n        \n    class monitoring:\n        accelerator=Accelerator()\n        \n    class model:\n        TRAIN_BS= 32\n        VALID_BS= 32\n        MODEL_NAME= 'vit_base_patch16_224'\n        NUM_WORKERS= 8\n        FILE_PATH= '/kaggle/input/rsna-breast-cancer-detection/train.csv'\n        LOSS= 'BCEWithLogitsLoss'\n        EVAL_METRIC='F1'\n        NB_EPOCHS= 3\n        SPLITS= 5\n        T_0= 20\n        η_min= 1e-4\n        fc_dropout= 0.2\n        betas=(0.9, 0.999)\n        N_LABELS=1\n        LR= 2e-4\n        competition= 'rsna_mammography'\n        _wandb_kernel= 'satwik'\n        path_to_model='/kaggle/input/vit-single-fold/fold_single_model.pth'","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:31.591737Z","iopub.execute_input":"2023-01-22T05:12:31.592062Z","iopub.status.idle":"2023-01-22T05:12:31.599834Z","shell.execute_reply.started":"2023-01-22T05:12:31.592025Z","shell.execute_reply":"2023-01-22T05:12:31.598666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = pd.read_csv(CFG.data.path_to_test)\ntest_df['img_name'] = test_df['patient_id'].astype(str) + \"/\" + test_df['image_id'].astype(str) + \".png\"\n\nprint(f\"test.shape = {test_df.shape}\")\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:32.936281Z","iopub.execute_input":"2023-01-22T05:12:32.936876Z","iopub.status.idle":"2023-01-22T05:12:32.95863Z","shell.execute_reply.started":"2023-01-22T05:12:32.936839Z","shell.execute_reply":"2023-01-22T05:12:32.957662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def process(f, size=512, save_folder=\"\", extension=\"png\"):\n    patient = f.split('/')[-2]    \n    image = f.split('/')[-1][:-4]\n\n    os.makedirs(f\"{save_folder}/{patient}/\", exist_ok=True)\n\n    dicom = pydicom.dcmread(f)\n    img = dicom.pixel_array\n\n    img = (img - img.min()) / (img.max() - img.min())\n\n    img = cv2.resize(img, (size, size))\n    cv2.imwrite(f\"{save_folder}/{patient}/{image}.{extension}\", (img * 255).astype(np.uint8))","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:33.162698Z","iopub.execute_input":"2023-01-22T05:12:33.16358Z","iopub.status.idle":"2023-01-22T05:12:33.169888Z","shell.execute_reply.started":"2023-01-22T05:12:33.163546Z","shell.execute_reply":"2023-01-22T05:12:33.168847Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_images = glob.glob(CFG.data.path_to_dcm_images)\nos.makedirs(CFG.data.path_to_test_images, exist_ok=True)","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:33.450454Z","iopub.execute_input":"2023-01-22T05:12:33.451114Z","iopub.status.idle":"2023-01-22T05:12:33.458459Z","shell.execute_reply.started":"2023-01-22T05:12:33.451078Z","shell.execute_reply":"2023-01-22T05:12:33.45755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Parallel(n_jobs=4)(\n    delayed(process)(image, size=CFG.data.image_size[0], save_folder=CFG.data.path_to_test_images, extension=\"png\")\n    for image in tqdm(test_images)\n);","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:33.622293Z","iopub.execute_input":"2023-01-22T05:12:33.622634Z","iopub.status.idle":"2023-01-22T05:12:39.496143Z","shell.execute_reply.started":"2023-01-22T05:12:33.622578Z","shell.execute_reply":"2023-01-22T05:12:39.494748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class RSNAData(Dataset):\n    def __init__(self, df, img_folder, transform=None, is_test=False):\n        self.df = df\n        self.is_test = is_test\n        self.transform = transform\n        self.img_folder = img_folder\n        \n    def __getitem__(self, idx):\n        img_path = os.path.join(self.img_folder, self.df['img_name'][idx])\n        img = cv2.imread(img_path)\n        img = cv2.resize(img, (224, 224))\n        \n        if self.transform:\n            img = self.transform(image=img)['image']\n        img = torch.tensor(img, dtype=torch.float)\n        \n        # Rearrange the image dimensions so that channels are first in format\n        # This is because VIT Model requires Channels (c) to come first\n        \n        img = rearrange(img, 'h w c -> c h w')\n        \n        if not self.is_test:\n            target = self.df['cancer'][idx]\n            target = torch.tensor(target, dtype=torch.float)\n            return (img,target)\n        return (img)\n    \n    def __len__(self):\n        return len(self.df)","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:39.502514Z","iopub.execute_input":"2023-01-22T05:12:39.505122Z","iopub.status.idle":"2023-01-22T05:12:39.520563Z","shell.execute_reply.started":"2023-01-22T05:12:39.505068Z","shell.execute_reply":"2023-01-22T05:12:39.518952Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = pd.read_csv(CFG.data.path_to_test)\ntest_df['img_name'] = test_df['patient_id'].astype(str) + \"/\" + test_df['image_id'].astype(str) + \".png\"\n\nprint(f\"test.shape = {test_df.shape}\")\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:39.521999Z","iopub.execute_input":"2023-01-22T05:12:39.523203Z","iopub.status.idle":"2023-01-22T05:12:39.558731Z","shell.execute_reply.started":"2023-01-22T05:12:39.52316Z","shell.execute_reply":"2023-01-22T05:12:39.557554Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def process(f, size=224, save_folder=\"\", extension=\"png\"):\n    patient = f.split('/')[-2]    \n    image = f.split('/')[-1][:-4]\n\n    os.makedirs(f\"{save_folder}/{patient}/\", exist_ok=True)\n\n    dicom = pydicom.dcmread(f)\n    img = dicom.pixel_array\n\n    img = (img - img.min()) / (img.max() - img.min())\n\n    img = cv2.resize(img, (size, size))\n    cv2.imwrite(f\"{save_folder}/{patient}/{image}.{extension}\", (img * 255).astype(np.uint8))","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:39.56137Z","iopub.execute_input":"2023-01-22T05:12:39.562314Z","iopub.status.idle":"2023-01-22T05:12:39.570277Z","shell.execute_reply.started":"2023-01-22T05:12:39.562265Z","shell.execute_reply":"2023-01-22T05:12:39.56927Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_images = glob.glob(CFG.data.path_to_dcm_images)\nos.makedirs(CFG.data.path_to_test_images, exist_ok=True)","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:39.572189Z","iopub.execute_input":"2023-01-22T05:12:39.572981Z","iopub.status.idle":"2023-01-22T05:12:39.583095Z","shell.execute_reply.started":"2023-01-22T05:12:39.57294Z","shell.execute_reply":"2023-01-22T05:12:39.582048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Parallel(n_jobs=4)(\n    delayed(process)(image, size=CFG.data.image_size[0], save_folder=CFG.data.path_to_test_images, extension=\"png\")\n    for image in tqdm(test_images)\n);","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:39.585314Z","iopub.execute_input":"2023-01-22T05:12:39.586381Z","iopub.status.idle":"2023-01-22T05:12:41.765206Z","shell.execute_reply.started":"2023-01-22T05:12:39.586345Z","shell.execute_reply":"2023-01-22T05:12:41.764438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class RSNAData(Dataset):\n    def __init__(self, df, img_folder, transform=None, is_test=False):\n        self.df = df\n        self.is_test = is_test\n        self.transform = transform\n        self.img_folder = img_folder\n        \n    def __getitem__(self, idx):\n        img_path = os.path.join(self.img_folder, self.df['img_name'][idx])\n        img = cv2.imread(img_path)\n        img = cv2.resize(img, (224, 224))\n        \n        if self.transform:\n            img = self.transform(image=img)['image']\n        img = torch.tensor(img, dtype=torch.float)\n        \n        # Rearrange the image dimensions so that channels are first in format\n        # This is because VIT Model requires Channels (c) to come first\n        \n        img = rearrange(img, 'h w c -> c h w')\n        \n        if not self.is_test:\n            target = self.df['cancer'][idx]\n            target = torch.tensor(target, dtype=torch.float)\n            return (img,target)\n        return (img)\n    \n    def __len__(self):\n        return len(self.df)","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:58.467411Z","iopub.execute_input":"2023-01-22T05:12:58.467812Z","iopub.status.idle":"2023-01-22T05:12:58.476744Z","shell.execute_reply.started":"2023-01-22T05:12:58.467771Z","shell.execute_reply":"2023-01-22T05:12:58.475565Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.ToTensor()\n])","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:12:59.695109Z","iopub.execute_input":"2023-01-22T05:12:59.696922Z","iopub.status.idle":"2023-01-22T05:12:59.702314Z","shell.execute_reply.started":"2023-01-22T05:12:59.696869Z","shell.execute_reply":"2023-01-22T05:12:59.701085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset = RSNAData(df=test_df, img_folder=CFG.data.path_to_test_images, is_test=True)\ntest_loader = DataLoader(test_dataset, batch_size=CFG.data.batch_size, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:13:01.693772Z","iopub.execute_input":"2023-01-22T05:13:01.694164Z","iopub.status.idle":"2023-01-22T05:13:01.700457Z","shell.execute_reply.started":"2023-01-22T05:13:01.69413Z","shell.execute_reply":"2023-01-22T05:13:01.699257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir(weights_path)","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:13:03.124499Z","iopub.execute_input":"2023-01-22T05:13:03.12594Z","iopub.status.idle":"2023-01-22T05:13:03.13683Z","shell.execute_reply.started":"2023-01-22T05:13:03.125879Z","shell.execute_reply":"2023-01-22T05:13:03.135657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class VITModel(nn.Module):\n    def __init__(self, config, pretrained=False):\n        super(VITModel, self).__init__()\n        self.backbone = timm.create_model(config['MODEL_NAME'], pretrained=pretrained)\n        self.backbone.head = nn.Linear(self.backbone.head.in_features, config['N_LABELS'])\n    def forward(self, x):\n        return self.backbone(x)","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:13:03.984009Z","iopub.execute_input":"2023-01-22T05:13:03.985218Z","iopub.status.idle":"2023-01-22T05:13:03.992638Z","shell.execute_reply.started":"2023-01-22T05:13:03.985165Z","shell.execute_reply":"2023-01-22T05:13:03.991341Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import copy\nDEVICE = 'cuda' if torch.cuda.is_available() else 'cpu'\n\nwith CFG.monitoring.accelerator.main_process_first():\n    model = VITModel(Config)\n\nmodel= torch.load(\n        '/kaggle/input/vit-single-fold/fold_single_model.pth').cuda()","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:13:05.014591Z","iopub.execute_input":"2023-01-22T05:13:05.015019Z","iopub.status.idle":"2023-01-22T05:13:06.878449Z","shell.execute_reply.started":"2023-01-22T05:13:05.014985Z","shell.execute_reply":"2023-01-22T05:13:06.877461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"optimizer = torch.optim.Adam(params=model.parameters(), lr=CFG.model.LR)\ncriterion = nn.BCEWithLogitsLoss()","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:13:07.948501Z","iopub.execute_input":"2023-01-22T05:13:07.948975Z","iopub.status.idle":"2023-01-22T05:13:07.956809Z","shell.execute_reply.started":"2023-01-22T05:13:07.948929Z","shell.execute_reply":"2023-01-22T05:13:07.95542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model, optimizer, test_loader = CFG.monitoring.accelerator.prepare(\n    model, optimizer, test_loader\n)","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:13:08.940288Z","iopub.execute_input":"2023-01-22T05:13:08.940677Z","iopub.status.idle":"2023-01-22T05:13:08.950975Z","shell.execute_reply.started":"2023-01-22T05:13:08.940643Z","shell.execute_reply":"2023-01-22T05:13:08.949905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def inference(model, accelerator, test_loader):\n    \n    model.eval()\n    all_outputs = []\n    with torch.no_grad():\n\n        for idx, images in enumerate (tqdm(test_loader)):\n            images=images.cuda()\n            outputs = model(images).view(-1)\n            \n            outputs = accelerator.gather_for_metrics((outputs))\n            \n            all_outputs.extend(torch.sigmoid(outputs).cpu().detach().tolist())\n            \n    return all_outputs","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:13:10.032908Z","iopub.execute_input":"2023-01-22T05:13:10.033676Z","iopub.status.idle":"2023-01-22T05:13:10.04089Z","shell.execute_reply.started":"2023-01-22T05:13:10.033635Z","shell.execute_reply":"2023-01-22T05:13:10.039642Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = inference(model, CFG.monitoring.accelerator, test_loader)\npredictions","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:13:10.928785Z","iopub.execute_input":"2023-01-22T05:13:10.929889Z","iopub.status.idle":"2023-01-22T05:13:11.031476Z","shell.execute_reply.started":"2023-01-22T05:13:10.929848Z","shell.execute_reply":"2023-01-22T05:13:11.030331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! rm -r images","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:13:18.147254Z","iopub.execute_input":"2023-01-22T05:13:18.148419Z","iopub.status.idle":"2023-01-22T05:13:19.328727Z","shell.execute_reply.started":"2023-01-22T05:13:18.148372Z","shell.execute_reply":"2023-01-22T05:13:19.327303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame({\n    'prediction_id': test_df.prediction_id.values,\n    'cancer': predictions,\n}).groupby('prediction_id').max().reset_index()\n\nsubmission.to_csv('submission.csv', index=False)\nsubmission.head()","metadata":{"execution":{"iopub.status.busy":"2023-01-22T05:13:20.377781Z","iopub.execute_input":"2023-01-22T05:13:20.37817Z","iopub.status.idle":"2023-01-22T05:13:20.401917Z","shell.execute_reply.started":"2023-01-22T05:13:20.378134Z","shell.execute_reply":"2023-01-22T05:13:20.400948Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}