{"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":"#Install dependecies\n\nimport math, re, os\nimport tensorflow as tf\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nfrom  sklearn.model_selection import train_test_split\nfrom sklearn import metrics\nfrom keras.utils import load_img, img_to_array, array_to_img\nfrom keras.applications.imagenet_utils import decode_predictions as decode_prediction\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom tqdm import tqdm\nfrom tensorflow import keras\n\nprint(\"Tensorflow version \" + tf.__version__)\n\nimport random\nfrom glob import glob\nfrom keras.models import *\nfrom keras import layers\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.optimizers import Adam\nfrom keras.applications.inception_v3 import preprocess_input\n\nfrom keras.applications.inception_v3 import InceptionV3\nfrom IPython.display import display\nfrom PIL import Image","metadata":{"execution":{"iopub.status.busy":"2023-07-13T13:08:23.881389Z","iopub.execute_input":"2023-07-13T13:08:23.881808Z","iopub.status.idle":"2023-07-13T13:08:23.970872Z","shell.execute_reply.started":"2023-07-13T13:08:23.881774Z","shell.execute_reply":"2023-07-13T13:08:23.94338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"src_path_train = '/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC/train'\nmapping_path = '/kaggle/input/imagenet-object-localization-challenge/LOC_synset_mapping.txt' ","metadata":{"execution":{"iopub.status.busy":"2023-07-13T13:08:23.973686Z","iopub.execute_input":"2023-07-13T13:08:23.997111Z","iopub.status.idle":"2023-07-13T13:08:24.12532Z","shell.execute_reply.started":"2023-07-13T13:08:23.997054Z","shell.execute_reply":"2023-07-13T13:08:24.055487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Creation of mapping dictionaries to obtain the image classes\n\nclass_mapping_dict = {}\nclass_mapping_dict_number = {}\nmapping_class_to_number = {}\nmapping_number_to_class = {}\ni = 0\nfor line in open(mapping_path):\n    class_mapping_dict[line[:9].strip()] = line[9:].strip()\n    class_mapping_dict_number[i] = line[9:].strip()\n    mapping_class_to_number[line[:9].strip()] = i\n    mapping_number_to_class[i] = line[:9].strip()\n    i+=1","metadata":{"execution":{"iopub.status.busy":"2023-07-13T13:08:24.126888Z","iopub.execute_input":"2023-07-13T13:08:24.127326Z","iopub.status.idle":"2023-07-13T13:08:24.301207Z","shell.execute_reply.started":"2023-07-13T13:08:24.127281Z","shell.execute_reply":"2023-07-13T13:08:24.262771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_gen = ImageDataGenerator(\n    preprocessing_function = preprocess_input)\n\ntest_generator = image_gen.flow_from_directory(\n  src_path_train,\n  target_size=(299,299),\n  shuffle=False,\n  batch_size=128,\n  seed = 42,\n  class_mode=\"sparse\"\n)","metadata":{"execution":{"iopub.status.busy":"2023-07-13T13:08:24.302473Z","iopub.execute_input":"2023-07-13T13:08:24.302915Z","iopub.status.idle":"2023-07-13T13:34:58.516171Z","shell.execute_reply.started":"2023-07-13T13:08:24.302877Z","shell.execute_reply":"2023-07-13T13:34:58.515054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load InceptionV3 model\nmodel = tf.keras.applications.InceptionV3(weights='imagenet')","metadata":{"execution":{"iopub.status.busy":"2023-07-13T13:34:58.519562Z","iopub.execute_input":"2023-07-13T13:34:58.520077Z","iopub.status.idle":"2023-07-13T13:35:05.758662Z","shell.execute_reply.started":"2023-07-13T13:34:58.520042Z","shell.execute_reply":"2023-07-13T13:35:05.757558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#we make predictions to find the classes for which the model is least accurate\npredictions = model.predict(test_generator)\n\n# Get most likely class\ny_pred = np.argmax(predictions, axis=1)\ny_test = test_generator.classes","metadata":{"execution":{"iopub.status.busy":"2023-07-13T13:35:05.760197Z","iopub.execute_input":"2023-07-13T13:35:05.76059Z","iopub.status.idle":"2023-07-13T19:46:45.254542Z","shell.execute_reply.started":"2023-07-13T13:35:05.760556Z","shell.execute_reply":"2023-07-13T19:46:45.248757Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"precision_classes = metrics.precision_score(y_test, y_pred, average=None)\nfor i in range(len(precision_classes)):\n    if precision_classes[i]==min(precision_classes):\n        min_precision_class = precision_classes[i]\n        min_class_number = i\n        min_class_id = mapping_number_to_class[i]\n        min_class = class_mapping_dict_number[i]\n        print(f'La classe qui a la plus faible précision ({min_precision_class:.3f}) est la classe numéro {min_class_number}, {min_class_id}, {min_class}')","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:46:45.267971Z","iopub.execute_input":"2023-07-13T19:46:45.273038Z","iopub.status.idle":"2023-07-13T19:46:46.132654Z","shell.execute_reply.started":"2023-07-13T19:46:45.272942Z","shell.execute_reply":"2023-07-13T19:46:46.131167Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#this function output the prediction of the model for an image knowing its path and its size\n\ndef pred_img (img_array, target_size):\n    img_batch = np.expand_dims(img_array, axis=0)\n    img_preprocessed = preprocess_input(img_batch)\n    pred = model.predict(img_preprocessed)\n    return pred","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:46:46.134156Z","iopub.execute_input":"2023-07-13T19:46:46.134531Z","iopub.status.idle":"2023-07-13T19:46:46.141009Z","shell.execute_reply.started":"2023-07-13T19:46:46.134497Z","shell.execute_reply":"2023-07-13T19:46:46.139647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def path_to_array(path):\n    img = load_img(path, target_size=(299,299))\n    img_array = img_to_array(img)\n    return img_array","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:46:46.142494Z","iopub.execute_input":"2023-07-13T19:46:46.142935Z","iopub.status.idle":"2023-07-13T19:46:46.153532Z","shell.execute_reply.started":"2023-07-13T19:46:46.1429Z","shell.execute_reply":"2023-07-13T19:46:46.152297Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Min_class_id = ''\nMin_class_id +=min_class_id \nMin_class = ''\nMin_class +=min_class\nprint(src_path_train + '/' + Min_class_id)","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:46:46.155144Z","iopub.execute_input":"2023-07-13T19:46:46.155489Z","iopub.status.idle":"2023-07-13T19:46:46.165782Z","shell.execute_reply.started":"2023-07-13T19:46:46.155458Z","shell.execute_reply":"2023-07-13T19:46:46.164526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#We create a list which contains the path of all misclassified images by the model\n\nmisclassified_images  = []\n\nfor filename in os.listdir(src_path_train + '/' + Min_class_id):\n    path = src_path_train + '/' + Min_class_id + '/' + filename\n    pred = pred_img(img_array = path_to_array(path), target_size = (299,299))\n    pred = np.argmax(pred, axis=1)\n    if pred != min_class_number :\n        misclassified_images.append(path)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-07-13T19:46:46.167259Z","iopub.execute_input":"2023-07-13T19:46:46.167796Z","iopub.status.idle":"2023-07-13T19:49:08.362556Z","shell.execute_reply.started":"2023-07-13T19:46:46.167738Z","shell.execute_reply":"2023-07-13T19:49:08.361353Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(misclassified_images)","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:49:08.364191Z","iopub.execute_input":"2023-07-13T19:49:08.364667Z","iopub.status.idle":"2023-07-13T19:49:08.373664Z","shell.execute_reply.started":"2023-07-13T19:49:08.364624Z","shell.execute_reply":"2023-07-13T19:49:08.372472Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path_tape_player = '/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC/train/n04392985'\nprint(len([name for name in os.listdir(path_tape_player) if os.path.isfile(os.path.join(path_tape_player, name))]))","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:57:17.774227Z","iopub.execute_input":"2023-07-13T19:57:17.774682Z","iopub.status.idle":"2023-07-13T19:57:18.575983Z","shell.execute_reply.started":"2023-07-13T19:57:17.774644Z","shell.execute_reply":"2023-07-13T19:57:18.574664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from collections import Counter\nPred = []\nfor filename in os.listdir(src_path_train + '/' + Min_class_id):\n    path = src_path_train + '/' + Min_class_id + '/' + filename\n    pred = pred_img(img_array = path_to_array(path), target_size = (299,299))\n    pred = np.argmax(pred, axis=1)\n    Pred.append(pred[0])\nprint(len(Pred))\ncount_pred = Counter(Pred)\nprint(count_pred)","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:54:26.164943Z","iopub.execute_input":"2023-07-13T19:54:26.165379Z","iopub.status.idle":"2023-07-13T19:56:21.477937Z","shell.execute_reply.started":"2023-07-13T19:54:26.165348Z","shell.execute_reply":"2023-07-13T19:56:21.476629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Threshold for probabilities\n\nalpha = 0.00001\nthreshold = 1-alpha\nprint(threshold)","metadata":{"execution":{"iopub.status.busy":"2023-07-13T20:01:56.769339Z","iopub.execute_input":"2023-07-13T20:01:56.769774Z","iopub.status.idle":"2023-07-13T20:01:56.775822Z","shell.execute_reply.started":"2023-07-13T20:01:56.769738Z","shell.execute_reply":"2023-07-13T20:01:56.774054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def size_set(set_valued):\n    \n    new_set_valued = []\n    sum_proba = 0\n    i = 0\n    while sum_proba < threshold:\n        new_set_valued.append(set_valued[i])\n        sum_proba = sum_proba + set_valued[i][2]\n        i += 1\n    return new_set_valued","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:57:32.965557Z","iopub.execute_input":"2023-07-13T19:57:32.966876Z","iopub.status.idle":"2023-07-13T19:57:32.973304Z","shell.execute_reply.started":"2023-07-13T19:57:32.966834Z","shell.execute_reply":"2023-07-13T19:57:32.972022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#This function output the number of classes such that the sum of the probabilities associated to these classes >= 1-alpha for the set-valued of a given image\n\ndef number_classes(path):\n    \n    k = 0\n    pred = pred_img(img_array = path_to_array(path), target_size = (299,299))\n    sum_proba = 0\n    for i in range(len(pred[0])):\n        if sum_proba < threshold:\n            sum_proba += pred[0][i] \n            k+=1\n    return k, pred","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:57:35.303928Z","iopub.execute_input":"2023-07-13T19:57:35.304308Z","iopub.status.idle":"2023-07-13T19:57:35.310824Z","shell.execute_reply.started":"2023-07-13T19:57:35.304277Z","shell.execute_reply":"2023-07-13T19:57:35.309706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#this function create a set-valued for an image\n\ndef compute_set_valued_predictions(image_path):\n    \n    k, pred = number_classes(image_path)\n    set_valued_img = decode_prediction(pred, top=k)\n    set_valued_img = size_set(set_valued_img[0])\n    return set_valued_img","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:57:37.405949Z","iopub.execute_input":"2023-07-13T19:57:37.406727Z","iopub.status.idle":"2023-07-13T19:57:37.412204Z","shell.execute_reply.started":"2023-07-13T19:57:37.406691Z","shell.execute_reply":"2023-07-13T19:57:37.411112Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"set_v = compute_set_valued_predictions(misclassified_images[0])\nprint(len(set_v))","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:57:40.003801Z","iopub.execute_input":"2023-07-13T19:57:40.005913Z","iopub.status.idle":"2023-07-13T19:57:40.250658Z","shell.execute_reply.started":"2023-07-13T19:57:40.005869Z","shell.execute_reply":"2023-07-13T19:57:40.249644Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"precision = 0\nlist_size = []\nimage_nummber = len(misclassified_images)\n\nfor i in tqdm(range(image_nummber)):\n    set_valued = compute_set_valued_predictions(misclassified_images[i])\n    for _,class_name,_ in set_valued:\n        if class_name == Min_class :\n            precision += 1\n\npercent_precision = (precision/image_nummber)*100\nprint(f'tape player appartient au set-valued dans {percent_precision} des cas ')","metadata":{"execution":{"iopub.status.busy":"2023-07-13T20:26:38.533496Z","iopub.execute_input":"2023-07-13T20:26:38.534557Z","iopub.status.idle":"2023-07-13T20:27:28.346371Z","shell.execute_reply.started":"2023-07-13T20:26:38.53452Z","shell.execute_reply":"2023-07-13T20:27:28.345377Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"beta = 0","metadata":{"execution":{"iopub.status.busy":"2023-07-13T20:02:58.169305Z","iopub.execute_input":"2023-07-13T20:02:58.171045Z","iopub.status.idle":"2023-07-13T20:02:58.176326Z","shell.execute_reply.started":"2023-07-13T20:02:58.171Z","shell.execute_reply":"2023-07-13T20:02:58.17499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def enhance_probabilities(initial_set_valued, other_set_valued):\n\n    # Initialize enhanced set\n    enhanced_set = []\n\n    #for class_id, class_name, class_prob in initial_set_valued:\n        # Find the position of the class in the other set-valued\n        #other_class_position = next((idx for idx, (_, other_class_name, _) in enumerate(other_set_valued) if other_class_name == class_name), None)\n        \n        #if other_class_position is not None:\n            #Scale the probability based on the position in the other set-valued\n            #scaling_factor = 1.0 / (other_class_position + 1)\n            #enhanced_prob = class_prob * (1 + scaling_factor)\n            #enhanced_set.append((class_id, class_name, enhanced_prob))\n\n        #else:\n            #enhanced_set.append((class_id, class_name, class_prob * 0.2))\n            \n    for class_id, class_name, class_prob in initial_set_valued:\n        \n        if class_name in [class_name for _, class_name, _ in other_set_valued]:\n            \n            # Find the corresponding class_id in the other_set_valued\n            other_class_id = next((idx for idx, (_, other_class_name, _) in enumerate(other_set_valued) if other_class_name == class_name), None)\n\n            if other_class_id is not None:\n                # Compute the sum of probabilities\n                sum_prob = beta * class_prob + (1-beta)*other_set_valued[other_class_id][2]\n                enhanced_set.append((class_id, class_name, sum_prob))\n        else:\n            enhanced_set.append((class_id, class_name, class_prob))\n\n        \n    # Sort the enhanced set by probability in descending order\n    enhanced_set = sorted(enhanced_set, key=lambda x: x[2], reverse=True)\n    \n    #normalize the probability in order to be less than 1\n    sum_proba = sum(class_prob for _, _, class_prob in enhanced_set)\n    enhanced_set = [(class_id, class_name, class_prob/sum_proba) for class_id, class_name, class_prob in enhanced_set]\n        \n        \n    return enhanced_set","metadata":{"execution":{"iopub.status.busy":"2023-07-13T20:03:00.808798Z","iopub.execute_input":"2023-07-13T20:03:00.809532Z","iopub.status.idle":"2023-07-13T20:03:00.821311Z","shell.execute_reply.started":"2023-07-13T20:03:00.809497Z","shell.execute_reply":"2023-07-13T20:03:00.820209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def process (path_initial_image, path_misclassified_images):\n    \n    # Compute initial set-valued predictions for the initial image\n    set_valued_predictions = compute_set_valued_predictions(path_initial_image)\n    size = []\n    size.append(len(set_valued_predictions))\n    \n    for i in range(len(path_misclassified_images)):\n    \n        if len(set_valued_predictions) > 1 :\n            new_set = []\n            \n            if path_initial_image != path_misclassified_images[i] :\n                \n                # Compute set-valued predictions for an other misclassified image\n                set_valued = compute_set_valued_predictions(path_misclassified_images[i])\n            \n                #update the probabilities of each class on the initial set-valued depending on the position of these classes in the other set-valued\n                new_set = enhance_probabilities(set_valued_predictions, set_valued)\n                new_set = size_set(new_set)\n                \n                if len(new_set) != 0:\n                    set_valued_predictions = new_set\n                    size.append(len(set_valued_predictions))\n        \n                else:\n                    return set_valued_predictions, size\n            \n    # Return the final set-valued prediction\n    return set_valued_predictions, size            ","metadata":{"execution":{"iopub.status.busy":"2023-07-13T20:03:02.662567Z","iopub.execute_input":"2023-07-13T20:03:02.663764Z","iopub.status.idle":"2023-07-13T20:03:02.672658Z","shell.execute_reply.started":"2023-07-13T20:03:02.66372Z","shell.execute_reply":"2023-07-13T20:03:02.671329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"precision = 0\nnumber = 0\nlist_size = []\n#image_nummber = len(misclassified_images)\nimage_nummber = 5\n\nfor i in tqdm(range(image_nummber)):\n    set_valued, set_valued_sizes = process(misclassified_images[i], misclassified_images)\n    list_size.append(set_valued_sizes)\n    for _,class_name,_ in set_valued:\n        if class_name == Min_class :\n            precision += 1\n        if len(set_valued) == 1:\n            number+= 1\n\npercent_precision = (precision/image_nummber)*100\npercent_number = (number/image_nummber)*100\nprint(f'tape player appartient au set-valued final dans {percent_precision:.1f} des cas et le set-valued final est de longueur 1 dans {percent_number:.1f} des cas ')","metadata":{"execution":{"iopub.status.busy":"2023-07-13T20:05:08.28521Z","iopub.execute_input":"2023-07-13T20:05:08.286307Z","iopub.status.idle":"2023-07-13T20:14:44.996393Z","shell.execute_reply.started":"2023-07-13T20:05:08.286261Z","shell.execute_reply":"2023-07-13T20:14:44.995373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from collections import Counter\nlast = [list_size[i][len(list_size[i])-1] for i in range(len(list_size))]\nfreq = Counter(last)\nprint(freq)","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:51:15.17431Z","iopub.status.idle":"2023-07-13T19:51:15.175519Z","shell.execute_reply.started":"2023-07-13T19:51:15.17522Z","shell.execute_reply":"2023-07-13T19:51:15.175255Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Size_set_valued = []\nindex_image = []\nfor i in range(len(list_size)):\n    if list_size[i][-1] != 1:\n        Size_set_valued.append(list_size[i])\n        index_image.append(i)\nprint(Size_set_valued[0], index_image[0])","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:51:15.176698Z","iopub.status.idle":"2023-07-13T19:51:15.177665Z","shell.execute_reply.started":"2023-07-13T19:51:15.177406Z","shell.execute_reply":"2023-07-13T19:51:15.177429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from IPython.display import display, Image\ndisplay(Image(filename = misclassified_images[11]))","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:51:15.178972Z","iopub.status.idle":"2023-07-13T19:51:15.180105Z","shell.execute_reply.started":"2023-07-13T19:51:15.179848Z","shell.execute_reply":"2023-07-13T19:51:15.179874Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred = pred_img(img_array = path_to_array(misclassified_images[11]), target_size = (299,299))\npred = decode_prediction(pred, top=5)\nprint(pred[0])","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:51:15.1813Z","iopub.status.idle":"2023-07-13T19:51:15.182486Z","shell.execute_reply.started":"2023-07-13T19:51:15.182167Z","shell.execute_reply":"2023-07-13T19:51:15.18219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot the histogram minority classes\nplt.bar(list(freq.keys()), freq.values(), color='g')\nplt.xlabel('Final set-valued Size')\nplt.ylabel('Frequancy')\nplt.title('Sizes of finals set-valued')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:51:15.183697Z","iopub.status.idle":"2023-07-13T19:51:15.185091Z","shell.execute_reply.started":"2023-07-13T19:51:15.1848Z","shell.execute_reply":"2023-07-13T19:51:15.184826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(set_valued)","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:51:15.186273Z","iopub.status.idle":"2023-07-13T19:51:15.187348Z","shell.execute_reply.started":"2023-07-13T19:51:15.187092Z","shell.execute_reply":"2023-07-13T19:51:15.187117Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot all the sequences of set-valued sizes\nfor i in range(image_nummber):\n    plt.plot(range(len(list_size[i])), list_size[i])\n\nplt.xlabel('Iteration')\nplt.ylabel('Set-valued Size')\nplt.title('Sequence of Set-valued Sizes')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-13T19:51:15.188574Z","iopub.status.idle":"2023-07-13T19:51:15.189448Z","shell.execute_reply.started":"2023-07-13T19:51:15.189189Z","shell.execute_reply":"2023-07-13T19:51:15.189213Z"},"trusted":true},"execution_count":null,"outputs":[]}]}