{"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":"import sys\n!{sys.executable} -m pip install pillow numpy pandas torch matplotlib tqdm sklearn ipywidgets seaborn fastai torchsummary\n!pip install -U albumentations","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"scrolled":true,"execution":{"iopub.status.busy":"2022-05-30T13:39:06.566750Z","iopub.execute_input":"2022-05-30T13:39:06.567116Z","iopub.status.idle":"2022-05-30T13:39:36.885681Z","shell.execute_reply.started":"2022-05-30T13:39:06.567028Z","shell.execute_reply":"2022-05-30T13:39:36.884797Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !pip install -U torchvision","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"scrolled":true,"execution":{"iopub.status.busy":"2022-05-30T13:39:36.889905Z","iopub.execute_input":"2022-05-30T13:39:36.890145Z","iopub.status.idle":"2022-05-30T13:39:36.893751Z","shell.execute_reply.started":"2022-05-30T13:39:36.890117Z","shell.execute_reply":"2022-05-30T13:39:36.893105Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport os\nimport torchvision\nimport pandas as pd\nimport PIL\nimport torchsummary\n\nfrom fastai.vision import *\nfrom fastai.vision.all import *\n\n# os.environ['TORCH_HOME'] = '~/pytorch/torch_home'\nos.environ['CUDA_LAUNCH_BLOCKING'] = \"1\"\n# os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"\n# torch.backends.cudnn.enabled = False\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nprint(device)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-30T13:39:36.895108Z","iopub.execute_input":"2022-05-30T13:39:36.895677Z","iopub.status.idle":"2022-05-30T13:39:39.770428Z","shell.execute_reply.started":"2022-05-30T13:39:36.895638Z","shell.execute_reply":"2022-05-30T13:39:39.769562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"root = Path('../input/sorghum-id-fgvc-9')\n# root = Path('../input/sorghumfgvc9png512512/sorghum-fgvc9-png-512')","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:39:39.772755Z","iopub.execute_input":"2022-05-30T13:39:39.773027Z","iopub.status.idle":"2022-05-30T13:39:39.777253Z","shell.execute_reply.started":"2022-05-30T13:39:39.772989Z","shell.execute_reply":"2022-05-30T13:39:39.776145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('../input/sorghum-id-fgvc-9/train_cultivar_mapping.csv').dropna()\ntrain_df","metadata":{"papermill":{"duration":0.093468,"end_time":"2022-04-27T11:33:38.241842","exception":false,"start_time":"2022-04-27T11:33:38.148374","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-05-30T13:39:39.778753Z","iopub.execute_input":"2022-05-30T13:39:39.779013Z","iopub.status.idle":"2022-05-30T13:39:39.849666Z","shell.execute_reply.started":"2022-05-30T13:39:39.778977Z","shell.execute_reply":"2022-05-30T13:39:39.848830Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Outliers on train set","metadata":{"papermill":{"duration":0.048415,"end_time":"2022-04-27T11:33:51.98904","exception":false,"start_time":"2022-04-27T11:33:51.940625","status":"completed"},"tags":[]}},{"cell_type":"code","source":"outliers = ['29-33-477', '29-34-965', '29-36-468', '29-43-957', '29-45-460', '29-46-961', '29-48-469', '29-49-960', '29-51-465', '30-06-475', '30-07-971', '30-09-467', '30-59-251', '31-00-751', '31-02-238', '31-17-229', '31-18-730', '31-20-230', '31-21-751', '31-23-234', '31-24-729', '31-30-733', '31-32-233', '31-33-750', '31-35-254']\noutliers = list(map(lambda id: f'2017-06-11__13-{id}.png', outliers))","metadata":{"papermill":{"duration":0.059435,"end_time":"2022-04-27T11:33:52.097936","exception":false,"start_time":"2022-04-27T11:33:52.038501","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-05-30T13:39:39.851181Z","iopub.execute_input":"2022-05-30T13:39:39.851436Z","iopub.status.idle":"2022-05-30T13:39:39.857255Z","shell.execute_reply.started":"2022-05-30T13:39:39.851402Z","shell.execute_reply":"2022-05-30T13:39:39.856190Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"PIL.Image.open(root/f'train_images/{outliers[0]}').resize((128, 128))","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:39:39.858695Z","iopub.execute_input":"2022-05-30T13:39:39.859148Z","iopub.status.idle":"2022-05-30T13:39:39.937228Z","shell.execute_reply.started":"2022-05-30T13:39:39.859109Z","shell.execute_reply":"2022-05-30T13:39:39.936440Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Remove these outliers","metadata":{"execution":{"iopub.status.busy":"2022-05-07T16:02:31.01687Z","iopub.execute_input":"2022-05-07T16:02:31.01772Z","iopub.status.idle":"2022-05-07T16:02:31.02244Z","shell.execute_reply.started":"2022-05-07T16:02:31.017682Z","shell.execute_reply":"2022-05-07T16:02:31.021367Z"}}},{"cell_type":"code","source":"train_df.drop(train_df[train_df['image'].isin(outliers)].index, inplace=True)\ntrain_df = train_df.dropna().reset_index(drop=True)","metadata":{"papermill":{"duration":0.070499,"end_time":"2022-04-27T11:33:52.218112","exception":false,"start_time":"2022-04-27T11:33:52.147613","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-05-30T13:39:39.938478Z","iopub.execute_input":"2022-05-30T13:39:39.938902Z","iopub.status.idle":"2022-05-30T13:39:39.962418Z","shell.execute_reply.started":"2022-05-30T13:39:39.938865Z","shell.execute_reply":"2022-05-30T13:39:39.961743Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"actual_images = [img.name for img in (root/'train_images').ls() if img.name in train_df.image.to_list()]\ntrain_df = train_df[train_df.image.isin(actual_images)]\ntrain_df","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:39:39.963505Z","iopub.execute_input":"2022-05-30T13:39:39.963742Z","iopub.status.idle":"2022-05-30T13:39:50.523643Z","shell.execute_reply.started":"2022-05-30T13:39:39.963708Z","shell.execute_reply":"2022-05-30T13:39:50.522949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Outliers on Test set\n\nThere's nothing we can do. just know what there is.","metadata":{}},{"cell_type":"code","source":"PIL.Image.open(root/f'test/212116519.png').resize((128, 128))","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:39:50.526643Z","iopub.execute_input":"2022-05-30T13:39:50.526885Z","iopub.status.idle":"2022-05-30T13:39:50.572616Z","shell.execute_reply.started":"2022-05-30T13:39:50.526835Z","shell.execute_reply":"2022-05-30T13:39:50.571903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Transforms","metadata":{"papermill":{"duration":0.04938,"end_time":"2022-04-27T11:33:52.316581","exception":false,"start_time":"2022-04-27T11:33:52.267201","status":"completed"},"tags":[]}},{"cell_type":"code","source":"class AlbumentationsTransform(RandTransform):\n    \"A transform handler for multiple `Albumentation` transforms\"\n    split_idx, order = None, 2\n    def __init__(self, train_aug, valid_aug): store_attr()\n    \n    def before_call(self, b, split_idx):\n        self.idx = split_idx\n    \n    def encodes(self, img: PILImage):\n        if self.idx == 0:\n            aug_img = self.train_aug(image=np.array(img))['image']\n        else:\n            aug_img = self.valid_aug(image=np.array(img))['image']\n        return PILImage.create(aug_img)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-30T13:39:50.573769Z","iopub.execute_input":"2022-05-30T13:39:50.574129Z","iopub.status.idle":"2022-05-30T13:39:50.580995Z","shell.execute_reply.started":"2022-05-30T13:39:50.574065Z","shell.execute_reply":"2022-05-30T13:39:50.580212Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import albumentations as A\nimport torchvision.transforms as T\n\ndef get_train_aug(sz):\n    csz = max(8, sz // 50)\n    return A.Compose([\n#         A.CenterCrop(p=1.0, width=896, height=896),\n#         A.Resize(p=1.0, width=rsz, height=rsz),\n#         A.RandomCrop(p=1.0, width=sz, height=sz),\n        A.RandomResizedCrop(width=sz, height=sz, scale=(0.5, 1.0)),\n        A.Flip(),\n        A.RandomRotate90(),\n        A.ShiftScaleRotate(),\n        A.HueSaturationValue(),\n        A.OneOf([\n            A.RandomBrightnessContrast(p=0.5),\n            A.RandomGamma(p=0.5),\n        ], p=0.5),\n        A.OneOf([\n            A.GaussNoise(p=0.3),\n            A.ISONoise(p=0.3),\n        ], p=0.25),\n        A.OneOf([\n            A.GridDropout(ratio=0.33, p=0.1),\n            A.CoarseDropout(max_holes=48, min_holes=8, max_height=2*csz, max_width=2*csz, min_height=csz, min_width=csz, p=0.2)\n        ], p=0.5),\n    ])\n\ndef get_valid_aug(size):\n    return A.Compose([\n        A.Resize(p=1.0, width=size, height=size),\n    ])","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-30T13:39:50.582738Z","iopub.execute_input":"2022-05-30T13:39:50.583113Z","iopub.status.idle":"2022-05-30T13:39:51.688292Z","shell.execute_reply.started":"2022-05-30T13:39:50.583068Z","shell.execute_reply":"2022-05-30T13:39:51.687477Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from fastai.vision.all import *\nfrom fastai import *\n\nitem_tfms = AlbumentationsTransform(get_train_aug(896), get_valid_aug(896))\n\ndls = ImageDataLoaders.from_df(train_df, root/'train_images',\n                               valid_pct=0.3332,\n                               fn_col=0, label_col=1,\n                               num_workers=48, bs=4,\n                               item_tfms=item_tfms,\n                               batch_tfms=[Normalize.from_stats(*imagenet_stats)])","metadata":{"papermill":{"duration":5.44743,"end_time":"2022-04-27T11:33:57.909958","exception":false,"start_time":"2022-04-27T11:33:52.462528","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-05-30T13:39:51.689430Z","iopub.execute_input":"2022-05-30T13:39:51.689685Z","iopub.status.idle":"2022-05-30T13:39:55.746820Z","shell.execute_reply.started":"2022-05-30T13:39:51.689652Z","shell.execute_reply":"2022-05-30T13:39:55.746107Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dls.show_batch()","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:39:55.748430Z","iopub.execute_input":"2022-05-30T13:39:55.748950Z","iopub.status.idle":"2022-05-30T13:39:57.061385Z","shell.execute_reply.started":"2022-05-30T13:39:55.748913Z","shell.execute_reply":"2022-05-30T13:39:57.060703Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Select Model","metadata":{}},{"cell_type":"code","source":"model = torchvision.models.densenet201\n# model = torchvision.models.resnet34\n# model = torchvision.models.efficientnet_b4","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:39:57.062381Z","iopub.execute_input":"2022-05-30T13:39:57.062608Z","iopub.status.idle":"2022-05-30T13:39:57.068977Z","shell.execute_reply.started":"2022-05-30T13:39:57.062579Z","shell.execute_reply":"2022-05-30T13:39:57.068118Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch.nn as nn\nimport torch.nn.functional as F\n\nclass BCNN(nn.Module):\n    \n    def __init__(\n        self,\n        arch=models.resnet50,\n        cut=-2,\n        pretrained=True,\n        fine_tune=False,\n        dropout=0.25,\n        n_outputs=100,\n        feature_map_size=7,\n    ):\n        super().__init__()\n        \n        model = arch(pretrained=pretrained)\n        \n        self.feature_map_size = feature_map_size\n        self.out_features = list(model.children())[-1].in_features\n        self.n_outputs = n_outputs\n        \n        # freezing parameters\n        if not fine_tune:\n            for param in model.parameters():\n                param.requires_grad = False\n        else:\n            for param in resnet.parameters():\n                param.requires_grad = True\n\n        layers = list(model.children())[:cut]\n        self.features = nn.Sequential(*layers) #.cuda()\n        \n        self.fc = nn.Linear(self.out_features ** 2, self.n_outputs)\n        self.dropout = nn.Dropout(dropout)\n        \n        # Initialize the fc layers.\n        nn.init.xavier_normal_(self.fc.weight.data)\n        \n        if self.fc.bias is not None:\n            torch.nn.init.constant_(self.fc.bias.data, val=0)\n        \n    def forward(self, x):\n        ## X.shape = bs, 3, sz, sz\n        ## N = bs; batch size\n        N = x.size()[0]\n        \n        ## x.shape = bs, output channels of arch, sz', sz'\n        x = self.features(x)\n        x = F.relu(x, inplace=True)\n        \n        # Classical bilinear pooling\n        x = x.view(N, self.out_features, self.feature_map_size ** 2)\n        x = self.dropout(x)\n        \n        # Batch matrix multiplication\n        x = torch.bmm(x, torch.transpose(x, 1, 2)) / (self.feature_map_size ** 2) \n        x = x.view(N, self.out_features ** 2)\n        \n        # Normalization\n        x = torch.sqrt(x + 1e-5)\n        x = F.normalize(x)\n        \n        x = self.dropout(x)\n        x = self.fc(x)\n        \n        return x","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-30T13:39:57.070977Z","iopub.execute_input":"2022-05-30T13:39:57.071621Z","iopub.status.idle":"2022-05-30T13:39:57.086887Z","shell.execute_reply.started":"2022-05-30T13:39:57.071583Z","shell.execute_reply":"2022-05-30T13:39:57.086127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # if use this, update and learn with not \"vision_learner\" to \"Learner\"\n# model = BCNN(arch=models.densenet161, cut=-1, n_outputs=100, dropout=0.12).to(device)\n# model = BCNN(arch=models.resnet50, cut=-2, n_outputs=100).to(device)","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:39:57.088067Z","iopub.execute_input":"2022-05-30T13:39:57.088522Z","iopub.status.idle":"2022-05-30T13:39:57.099828Z","shell.execute_reply.started":"2022-05-30T13:39:57.088471Z","shell.execute_reply":"2022-05-30T13:39:57.099126Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load model (including weights if exists previous)","metadata":{}},{"cell_type":"code","source":"###### from fastai.metrics import error_rate, accuracy\n\nmodel_name = model.__name__ + '_V26'\nsave_dir = Path('.')\nsave_path = save_dir/model_name\nload_path = Path('../input/sorghum-cultivar-100-2') #/model_name\n\nlearn = vision_learner(dls, model, metrics=accuracy, path='.', model_dir='.', loss_func=LabelSmoothingCrossEntropy(0.2))\n\nprint('Model name:', model_name)\nprint('Model load from:', load_path/f'{model_name}.pth')\nprint('exists? ', (load_path/f'{model_name}.pth').exists())\nprint('Model save to:', save_path)\n\nif (load_path/f'{model_name}.pth').exists():\n    print('Successfully load model from:', load_path/f'{model_name}.pth')\n    learn.load(load_path/model_name)\n\nlearn.save(model_name)","metadata":{"papermill":{"duration":4.442021,"end_time":"2022-04-27T11:34:02.401187","exception":false,"start_time":"2022-04-27T11:33:57.959166","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-05-30T13:39:57.101435Z","iopub.execute_input":"2022-05-30T13:39:57.101753Z","iopub.status.idle":"2022-05-30T13:40:00.031689Z","shell.execute_reply.started":"2022-05-30T13:39:57.101718Z","shell.execute_reply":"2022-05-30T13:40:00.030953Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.summary()","metadata":{"_kg_hide-output":true,"scrolled":true,"execution":{"iopub.status.busy":"2022-05-30T13:40:00.032958Z","iopub.execute_input":"2022-05-30T13:40:00.033704Z","iopub.status.idle":"2022-05-30T13:40:17.380876Z","shell.execute_reply.started":"2022-05-30T13:40:00.033665Z","shell.execute_reply":"2022-05-30T13:40:17.379951Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Fine tune","metadata":{"papermill":{"duration":0.050005,"end_time":"2022-04-27T11:34:02.501191","exception":false,"start_time":"2022-04-27T11:34:02.451186","status":"completed"},"tags":[]}},{"cell_type":"code","source":"EPOCHS = 8\nprint(f'fine_tune(epoch={EPOCHS})')\nlearn.fine_tune(EPOCHS, cbs=[\n    ShowGraphCallback(),\n    TerminateOnNaNCallback(),\n    SaveModelCallback(monitor='accuracy', min_delta=0.01/100, fname=model_name), # +0.01% accuracy\n    EarlyStoppingCallback(patience=5),\n])","metadata":{"papermill":{"duration":2451.43755,"end_time":"2022-04-27T12:14:53.98922","exception":false,"start_time":"2022-04-27T11:34:02.55167","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-05-30T13:40:17.382343Z","iopub.execute_input":"2022-05-30T13:40:17.382612Z","iopub.status.idle":"2022-05-30T13:41:16.684066Z","shell.execute_reply.started":"2022-05-30T13:40:17.382577Z","shell.execute_reply":"2022-05-30T13:41:16.681152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Save model","metadata":{}},{"cell_type":"code","source":"learn.save(model_name)","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:41:16.686752Z","iopub.status.idle":"2022-05-30T13:41:16.687401Z","shell.execute_reply.started":"2022-05-30T13:41:16.687055Z","shell.execute_reply":"2022-05-30T13:41:16.687117Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict","metadata":{}},{"cell_type":"code","source":"learn.predict(root/'test/1000005362.png')","metadata":{"papermill":{"duration":0.532286,"end_time":"2022-04-27T12:14:54.790485","exception":false,"start_time":"2022-04-27T12:14:54.258199","status":"completed"},"tags":[],"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-05-30T13:41:16.689935Z","iopub.status.idle":"2022-05-30T13:41:16.690351Z","shell.execute_reply.started":"2022-05-30T13:41:16.690139Z","shell.execute_reply":"2022-05-30T13:41:16.690161Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.show_results(max_n=12)","metadata":{"execution":{"iopub.status.busy":"2022-05-30T13:41:16.697181Z","iopub.status.idle":"2022-05-30T13:41:16.697563Z","shell.execute_reply.started":"2022-05-30T13:41:16.697358Z","shell.execute_reply":"2022-05-30T13:41:16.697379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_images = get_image_files(root/'test')\ntest_dataloader = learn.dls.test_dl(test_images)\npreds, _ = learn.get_preds(dl=test_dataloader)\nclass_idxs = [pred.argmax(dim=0) for pred in preds]","metadata":{"papermill":{"duration":22.914932,"end_time":"2022-04-27T12:15:17.872288","exception":false,"start_time":"2022-04-27T12:14:54.957356","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-05-30T13:41:16.698750Z","iopub.status.idle":"2022-05-30T13:41:16.699147Z","shell.execute_reply.started":"2022-05-30T13:41:16.698926Z","shell.execute_reply":"2022-05-30T13:41:16.698947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results = [dls.vocab[i] for i in class_idxs]\nlen(test_images), len(results)","metadata":{"papermill":{"duration":3.166219,"end_time":"2022-04-27T12:23:04.305845","exception":false,"start_time":"2022-04-27T12:23:01.139626","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-05-30T13:41:16.700739Z","iopub.status.idle":"2022-05-30T13:41:16.701140Z","shell.execute_reply.started":"2022-05-30T13:41:16.700917Z","shell.execute_reply":"2022-05-30T13:41:16.700937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"image_names = list(map(lambda s: str(s).split('/')[-1], test_images))\nsubmissions = pd.DataFrame(list(zip(image_names, results)), columns=['filename', 'cultivar']).sort_values(by='filename')\nsubmissions.head()","metadata":{"papermill":{"duration":0.287792,"end_time":"2022-04-27T12:23:05.292019","exception":false,"start_time":"2022-04-27T12:23:05.004227","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-05-30T13:41:16.702470Z","iopub.status.idle":"2022-05-30T13:41:16.702867Z","shell.execute_reply.started":"2022-05-30T13:41:16.702658Z","shell.execute_reply":"2022-05-30T13:41:16.702679Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submissions.to_csv('submission.csv', index=False)","metadata":{"papermill":{"duration":0.121086,"end_time":"2022-04-27T12:23:05.736717","exception":false,"start_time":"2022-04-27T12:23:05.615631","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-05-30T13:41:16.709921Z","iopub.status.idle":"2022-05-30T13:41:16.710323Z","shell.execute_reply.started":"2022-05-30T13:41:16.710112Z","shell.execute_reply":"2022-05-30T13:41:16.710133Z"},"trusted":true},"execution_count":null,"outputs":[]}]}