{"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":"markdown","source":"# About this notebook  \n\nThis notebook based on [Cassava / resnext50_32x4d starter [inference]](https://www.kaggle.com/yasufuminakama/cassava-resnext50-32x4d-starter-inference).\n\nDescribe customizations at [GitHub](https://github.com/IMOKURI/Cassava-Leaf-Disease-Classification) about this notebook.\n","metadata":{"papermill":{"duration":0.012373,"end_time":"2021-02-18T00:42:12.702732","exception":false,"start_time":"2021-02-18T00:42:12.690359","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"# Directory settings","metadata":{"papermill":{"duration":0.010994,"end_time":"2021-02-18T00:42:12.724725","exception":false,"start_time":"2021-02-18T00:42:12.713731","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# ====================================================\n# Directory settings\n# ====================================================\nimport os\n\nOUTPUT_DIR = \"./\"\nMODEL_DIR = \"../input/cassava-model/\"\nif not os.path.exists(OUTPUT_DIR):\n    os.makedirs(OUTPUT_DIR)\n\nTRAIN_PATH = \"../input/cassava-leaf-disease-classification/train_images\"\nTEST_PATH = \"../input/cassava-leaf-disease-classification/test_images\"","metadata":{"papermill":{"duration":0.021192,"end_time":"2021-02-18T00:42:12.756727","exception":false,"start_time":"2021-02-18T00:42:12.735535","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-11T14:44:15.238659Z","iopub.execute_input":"2023-04-11T14:44:15.239157Z","iopub.status.idle":"2023-04-11T14:44:15.279202Z","shell.execute_reply.started":"2023-04-11T14:44:15.23911Z","shell.execute_reply":"2023-04-11T14:44:15.277977Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# CFG","metadata":{"papermill":{"duration":0.010777,"end_time":"2021-02-18T00:42:12.778924","exception":false,"start_time":"2021-02-18T00:42:12.768147","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# ====================================================\n# CFG\n# ====================================================\nclass CFG:\n    debug = False\n    num_workers = 4\n    models = [\n        # \"tf_efficientnet_b3_ns\",\n        \"tf_efficientnet_b4_ns\",\n        \"vit_base_patch16_384\",\n        # \"deit_base_patch16_384\",\n        \"seresnext50_32x4d\",\n    ]\n    size = {\n        \"tf_efficientnet_b3_ns\": 512,\n        \"tf_efficientnet_b4_ns\": 512,\n        \"vit_base_patch16_384\": 384,\n        \"deit_base_patch16_384\": 384,\n        \"seresnext50_32x4d\": 512,\n    }\n    batch_size = 64\n    seed = 7097\n    target_size = 5\n    target_col = \"label\"\n    n_fold = 5\n    trn_fold = {  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n        \"tf_efficientnet_b3_ns\": {\n            \"best\": [0, 1, 2, 3, 4],\n            \"final\": [],\n        },\n        \"tf_efficientnet_b4_ns\": {\n            \"best\": [0, 1, 2, 3, 4],\n            \"final\": [],\n        },\n        \"vit_base_patch16_384\": {\"best\": [0, 1, 2, 3, 4], \"final\": []},\n        \"deit_base_patch16_384\": {\"best\": [0, 1, 2, 3, 4], \"final\": []},\n        \"seresnext50_32x4d\": {\"best\": [5, 6, 7, 8, 9], \"final\": []},\n    }\n    data_parallel = {\n        \"tf_efficientnet_b3_ns\": False,\n        \"tf_efficientnet_b4_ns\": True,  # True,\n        \"vit_base_patch16_384\": False,\n        \"deit_base_patch16_384\": False,\n        \"seresnext50_32x4d\": False,\n    }\n    transform = {\n        # \"tf_efficientnet_b3_ns\": None,\n        \"tf_efficientnet_b4_ns\": \"rotate\",\n        \"vit_base_patch16_384\": \"rotate\",\n        # \"deit_base_patch16_384\": None,\n        \"seresnext50_32x4d\": \"rotate\",\n    }\n    weight = {\n        # \"tf_efficientnet_b3_ns\": None,\n        \"tf_efficientnet_b4_ns\": 1,\n        \"vit_base_patch16_384\": 1,\n        # \"deit_base_patch16_384\": None,\n        \"seresnext50_32x4d\": 1,\n    }\n    tta = 10  # 1: no TTA, >1: TTA\n    no_tta_weight = tta - 1\n    train = False\n    inference = True","metadata":{"papermill":{"duration":0.027073,"end_time":"2021-02-18T00:42:12.817259","exception":false,"start_time":"2021-02-18T00:42:12.790186","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-11T14:44:15.347156Z","iopub.execute_input":"2023-04-11T14:44:15.347795Z","iopub.status.idle":"2023-04-11T14:44:15.361101Z","shell.execute_reply.started":"2023-04-11T14:44:15.347733Z","shell.execute_reply":"2023-04-11T14:44:15.359589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tta_weight_sum = CFG.no_tta_weight + (CFG.tta - 1)\nweight_sum = sum([CFG.weight[model] for model in CFG.models]) * tta_weight_sum","metadata":{"papermill":{"duration":0.01937,"end_time":"2021-02-18T00:42:12.848198","exception":false,"start_time":"2021-02-18T00:42:12.828828","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-11T14:44:15.363367Z","iopub.execute_input":"2023-04-11T14:44:15.363797Z","iopub.status.idle":"2023-04-11T14:44:15.384037Z","shell.execute_reply.started":"2023-04-11T14:44:15.363758Z","shell.execute_reply":"2023-04-11T14:44:15.382429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Library","metadata":{"papermill":{"duration":0.011265,"end_time":"2021-02-18T00:42:12.870573","exception":false,"start_time":"2021-02-18T00:42:12.859308","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# ====================================================\n# Library\n# ====================================================\nimport sys\n\nsys.path.append(\"../input/pytorch-image-models/pytorch-image-models-master\")\n\nimport math\nimport os\nimport random\nimport shutil\nimport time\nimport warnings\nfrom collections import Counter, defaultdict\nfrom contextlib import contextmanager\nfrom functools import partial\nfrom pathlib import Path\n\nimport cv2\nimport numpy as np\nimport pandas as pd\nimport scipy as sp\nimport timm\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torchvision.models as models\nfrom albumentations import (\n    CenterCrop,\n    CoarseDropout,\n    Compose,\n    Cutout,\n    HorizontalFlip,\n    HueSaturationValue,\n    IAAAdditiveGaussianNoise,\n    ImageOnlyTransform,\n    Normalize,\n    OneOf,\n    RandomBrightness,\n    RandomBrightnessContrast,\n    RandomContrast,\n    RandomCrop,\n    RandomResizedCrop,\n    Resize,\n    Rotate,\n    ShiftScaleRotate,\n    Transpose,\n    VerticalFlip,\n)\nfrom albumentations.pytorch import ToTensorV2\nfrom PIL import Image\nfrom sklearn import preprocessing\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import StratifiedKFold\nfrom torch.nn.parameter import Parameter\nfrom torch.optim import SGD, Adam\nfrom torch.optim.lr_scheduler import CosineAnnealingLR, CosineAnnealingWarmRestarts, ReduceLROnPlateau\nfrom torch.utils.data import DataLoader, Dataset\nfrom tqdm.auto import tqdm\n\nwarnings.filterwarnings(\"ignore\")\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")","metadata":{"papermill":{"duration":4.119505,"end_time":"2021-02-18T00:42:17.00187","exception":false,"start_time":"2021-02-18T00:42:12.882365","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-11T14:44:15.386432Z","iopub.execute_input":"2023-04-11T14:44:15.387393Z","iopub.status.idle":"2023-04-11T14:44:23.585219Z","shell.execute_reply.started":"2023-04-11T14:44:15.387341Z","shell.execute_reply":"2023-04-11T14:44:23.583186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Utils","metadata":{"papermill":{"duration":0.01159,"end_time":"2021-02-18T00:42:17.025349","exception":false,"start_time":"2021-02-18T00:42:17.013759","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# ====================================================\n# Utils\n# ====================================================\ndef get_score(y_true, y_pred):\n    return accuracy_score(y_true, y_pred)\n\n\n@contextmanager\ndef timer(name):\n    t0 = time.time()\n    LOGGER.info(f\"[{name}] start\")\n    yield\n    LOGGER.info(f\"[{name}] done in {time.time() - t0:.0f} s.\")\n\n\ndef init_logger(log_file=OUTPUT_DIR + \"inference.log\"):\n    from logging import INFO, FileHandler, Formatter, StreamHandler, getLogger\n\n    logger = getLogger(__name__)\n    logger.setLevel(INFO)\n    handler1 = StreamHandler()\n    handler1.setFormatter(Formatter(\"%(message)s\"))\n    handler2 = FileHandler(filename=log_file)\n    handler2.setFormatter(Formatter(\"%(message)s\"))\n    logger.addHandler(handler1)\n    logger.addHandler(handler2)\n    return logger\n\n\nLOGGER = init_logger()\n\n\ndef seed_torch(seed=42):\n    random.seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = True\n\n\nseed_torch(seed=CFG.seed)","metadata":{"papermill":{"duration":0.030001,"end_time":"2021-02-18T00:42:17.0671","exception":false,"start_time":"2021-02-18T00:42:17.037099","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-11T14:44:23.588025Z","iopub.execute_input":"2023-04-11T14:44:23.588696Z","iopub.status.idle":"2023-04-11T14:44:23.609219Z","shell.execute_reply.started":"2023-04-11T14:44:23.588638Z","shell.execute_reply":"2023-04-11T14:44:23.607391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Loading","metadata":{"papermill":{"duration":0.011592,"end_time":"2021-02-18T00:42:17.090708","exception":false,"start_time":"2021-02-18T00:42:17.079116","status":"completed"},"tags":[]}},{"cell_type":"code","source":"test = pd.read_csv(\"../input/cassava-leaf-disease-classification/sample_submission.csv\")\ntest.head()","metadata":{"papermill":{"duration":0.0397,"end_time":"2021-02-18T00:42:17.146105","exception":false,"start_time":"2021-02-18T00:42:17.106405","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-11T14:44:23.611175Z","iopub.execute_input":"2023-04-11T14:44:23.612131Z","iopub.status.idle":"2023-04-11T14:44:23.667682Z","shell.execute_reply.started":"2023-04-11T14:44:23.612059Z","shell.execute_reply":"2023-04-11T14:44:23.666189Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dataset","metadata":{"papermill":{"duration":0.012218,"end_time":"2021-02-18T00:42:17.17074","exception":false,"start_time":"2021-02-18T00:42:17.158522","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# ====================================================\n# Dataset\n# ====================================================\nclass TestDataset(Dataset):\n    def __init__(self, df, transform=None):\n        self.df = df\n        self.file_names = df[\"image_id\"].values\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        file_name = self.file_names[idx]\n        file_path = f\"{TEST_PATH}/{file_name}\"\n        image = cv2.imread(file_path)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        if self.transform:\n            augmented = self.transform(image=image)\n            image = augmented[\"image\"]\n        return image","metadata":{"papermill":{"duration":0.022845,"end_time":"2021-02-18T00:42:17.20603","exception":false,"start_time":"2021-02-18T00:42:17.183185","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-11T14:44:23.671354Z","iopub.execute_input":"2023-04-11T14:44:23.672605Z","iopub.status.idle":"2023-04-11T14:44:23.684419Z","shell.execute_reply.started":"2023-04-11T14:44:23.672534Z","shell.execute_reply":"2023-04-11T14:44:23.682543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Transforms","metadata":{"papermill":{"duration":0.011906,"end_time":"2021-02-18T00:42:17.230166","exception":false,"start_time":"2021-02-18T00:42:17.21826","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# ====================================================\n# Transforms\n# ====================================================\ndef get_transforms(*, data, size):\n\n    if data == \"train\":\n        return Compose(\n            [\n                # Resize(size, size),\n                RandomResizedCrop(size, size),\n                Transpose(p=0.5),\n                HorizontalFlip(p=0.5),\n                VerticalFlip(p=0.5),\n                ShiftScaleRotate(p=0.5),\n                HueSaturationValue(hue_shift_limit=0.2, sat_shift_limit=0.2, val_shift_limit=0.2, p=0.5),\n                RandomBrightnessContrast(brightness_limit=(-0.1, 0.1), contrast_limit=(-0.1, 0.1), p=0.5),\n                CoarseDropout(p=0.5),\n                Cutout(p=0.5),\n                Normalize(\n                    mean=[0.485, 0.456, 0.406],\n                    std=[0.229, 0.224, 0.225],\n                ),\n                ToTensorV2(),\n            ]\n        )\n\n    if data == \"valid\":\n        return Compose(\n            [\n                Resize(size, size),\n                CenterCrop(size, size),\n                Normalize(\n                    mean=[0.485, 0.456, 0.406],\n                    std=[0.229, 0.224, 0.225],\n                ),\n                ToTensorV2(),\n            ]\n        )\n\n    if data == \"simple\":\n        return Compose(\n            [\n                # Resize(size, size),\n                RandomResizedCrop(size, size),\n                # Transpose(p=0.5),\n                # HorizontalFlip(p=0.5),\n                # VerticalFlip(p=0.5),\n                # ShiftScaleRotate(p=0.5),\n                # HueSaturationValue(hue_shift_limit=0.2, sat_shift_limit=0.2, val_shift_limit=0.2, p=0.5),\n                # RandomBrightnessContrast(brightness_limit=(-0.1, 0.1), contrast_limit=(-0.1, 0.1), p=0.5),\n                # CoarseDropout(p=0.5),\n                # Cutout(p=0.5),\n                Normalize(\n                    mean=[0.485, 0.456, 0.406],\n                    std=[0.229, 0.224, 0.225],\n                ),\n                ToTensorV2(),\n            ]\n        )\n\n    if data == \"rotate\":\n        return Compose(\n            [\n                # Resize(size, size),\n                RandomResizedCrop(size, size),\n                Transpose(p=0.5),\n                HorizontalFlip(p=0.5),\n                VerticalFlip(p=0.5),\n                # ShiftScaleRotate(p=0.5),\n                # HueSaturationValue(hue_shift_limit=0.2, sat_shift_limit=0.2, val_shift_limit=0.2, p=0.5),\n                # RandomBrightnessContrast(brightness_limit=(-0.1, 0.1), contrast_limit=(-0.1, 0.1), p=0.5),\n                # CoarseDropout(p=0.5),\n                # Cutout(p=0.5),\n                Normalize(\n                    mean=[0.485, 0.456, 0.406],\n                    std=[0.229, 0.224, 0.225],\n                ),\n                ToTensorV2(),\n            ]\n        )","metadata":{"papermill":{"duration":0.029647,"end_time":"2021-02-18T00:42:17.271965","exception":false,"start_time":"2021-02-18T00:42:17.242318","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-11T14:44:23.686454Z","iopub.execute_input":"2023-04-11T14:44:23.687065Z","iopub.status.idle":"2023-04-11T14:44:23.705936Z","shell.execute_reply.started":"2023-04-11T14:44:23.687Z","shell.execute_reply":"2023-04-11T14:44:23.704452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# MODEL","metadata":{"papermill":{"duration":0.012134,"end_time":"2021-02-18T00:42:17.296313","exception":false,"start_time":"2021-02-18T00:42:17.284179","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# ====================================================\n# MODEL\n# ====================================================\nclass CassvaImgClassifier(nn.Module):\n    def __init__(self, model_name=\"resnext50_32x4d\", pretrained=False):\n        super().__init__()\n\n        if model_name == \"deit_base_patch16_384\":\n            # self.model = torch.hub.load(\"facebookresearch/deit:main\", model_name, pretrained=pretrained)\n            self.model = torch.hub.load(\"../input/fair-deit\", model_name, pretrained=pretrained, source=\"local\")\n            n_features = self.model.head.in_features\n            self.model.head = nn.Linear(n_features, CFG.target_size)\n\n        else:\n            self.model = timm.create_model(model_name, pretrained=pretrained)\n\n            if \"resnext50_32x4d\" in model_name:\n                n_features = self.model.fc.in_features\n                self.model.fc = nn.Linear(n_features, CFG.target_size)\n\n            elif model_name.startswith(\"tf_efficientnet\"):\n                n_features = self.model.classifier.in_features\n                self.model.classifier = nn.Linear(n_features, CFG.target_size)\n\n            elif model_name.startswith(\"vit_\"):\n                n_features = self.model.head.in_features\n                self.model.head = nn.Linear(n_features, CFG.target_size)\n\n    def forward(self, x):\n        x = self.model(x)\n        return x","metadata":{"papermill":{"duration":0.025484,"end_time":"2021-02-18T00:42:17.334115","exception":false,"start_time":"2021-02-18T00:42:17.308631","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-11T14:44:23.707891Z","iopub.execute_input":"2023-04-11T14:44:23.708438Z","iopub.status.idle":"2023-04-11T14:44:23.72757Z","shell.execute_reply.started":"2023-04-11T14:44:23.70837Z","shell.execute_reply":"2023-04-11T14:44:23.726386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Helper functions","metadata":{"papermill":{"duration":0.013931,"end_time":"2021-02-18T00:42:17.360411","exception":false,"start_time":"2021-02-18T00:42:17.34648","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# ====================================================\n# Helper functions\n# ====================================================\ndef inference(model, states, test_loader, device, data_parallel):\n    model.to(device)\n\n    # Use multi GPU\n    if device == torch.device(\"cuda\") and data_parallel:\n        model = torch.nn.DataParallel(model)  # make parallel\n        # torch.backends.cudnn.benchmark=True\n\n    tk0 = tqdm(enumerate(test_loader), total=len(test_loader))\n    probs = []\n    for i, (images) in tk0:\n        images = images.to(device)\n        avg_preds = []\n        for state in states:\n            model.load_state_dict(state[\"model\"])\n            model.eval()\n            with torch.no_grad():\n                y_preds = model(images)\n            avg_preds.append(y_preds.softmax(1).to(\"cpu\").numpy())\n        avg_preds = np.mean(avg_preds, axis=0)\n        probs.append(avg_preds)\n    probs = np.concatenate(probs)\n    return probs","metadata":{"papermill":{"duration":0.027675,"end_time":"2021-02-18T00:42:17.400631","exception":false,"start_time":"2021-02-18T00:42:17.372956","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-11T14:44:23.729027Z","iopub.execute_input":"2023-04-11T14:44:23.730638Z","iopub.status.idle":"2023-04-11T14:44:23.751037Z","shell.execute_reply.started":"2023-04-11T14:44:23.73056Z","shell.execute_reply":"2023-04-11T14:44:23.748786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# inference","metadata":{"papermill":{"duration":0.01344,"end_time":"2021-02-18T00:42:17.427241","exception":false,"start_time":"2021-02-18T00:42:17.413801","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# ====================================================\n# inference\n# ====================================================\npredictions = None\nfor model_name in CFG.models:\n    for i in range(CFG.tta):\n        model = CassvaImgClassifier(model_name, pretrained=False)\n        states = []\n        for saved_model in [\"best\", \"final\"]:\n            if CFG.trn_fold[model_name][saved_model] != []:\n                LOGGER.info(\n                    f\"========== Model: {model_name}, TTA: {i}, Saved: {saved_model}, Fold: {CFG.trn_fold[model_name][saved_model]} ==========\"\n                )\n                states += [\n                    torch.load(MODEL_DIR + f\"{model_name}_fold{fold}_{saved_model}.pth\")\n                    for fold in CFG.trn_fold[model_name][saved_model]\n                ]\n\n        if i == 0:  # no TTA\n            test_dataset = TestDataset(test, transform=get_transforms(data=\"valid\", size=CFG.size[model_name]))\n            tta_weight = CFG.no_tta_weight\n        else:\n            test_dataset = TestDataset(\n                test, transform=get_transforms(data=CFG.transform[model_name], size=CFG.size[model_name])\n            )\n            tta_weight = 1\n\n        test_loader = DataLoader(\n            test_dataset, batch_size=CFG.batch_size, shuffle=False, num_workers=CFG.num_workers, pin_memory=True\n        )\n\n        inf = inference(model, states, test_loader, device, CFG.data_parallel[model_name])\n        LOGGER.info(f\"Inference example: {inf[0]}\")\n\n        if predictions is None:\n            predictions = inf[np.newaxis] * CFG.weight[model_name] * tta_weight\n        else:\n            predictions = np.append(predictions, inf[np.newaxis] * CFG.weight[model_name] * tta_weight, axis=0)\n\nsub = np.sum(predictions, axis=0) / weight_sum\nLOGGER.info(f\"========== Overall ==========\")\nLOGGER.info(f\"Submission example: {sub[0]}\")\n\n\n# submission\ntest[\"label\"] = sub.argmax(1)\ntest[[\"image_id\", \"label\"]].to_csv(OUTPUT_DIR + \"submission.csv\", index=False)\ntest.head()","metadata":{"papermill":{"duration":111.996113,"end_time":"2021-02-18T00:44:09.437286","exception":false,"start_time":"2021-02-18T00:42:17.441173","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-11T14:44:23.753352Z","iopub.execute_input":"2023-04-11T14:44:23.754339Z","iopub.status.idle":"2023-04-11T14:44:24.655562Z","shell.execute_reply.started":"2023-04-11T14:44:23.754286Z","shell.execute_reply":"2023-04-11T14:44:24.653926Z"},"trusted":true},"execution_count":null,"outputs":[]}]}