{"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":"Assignment 2 : It’s difficult to fathom just how vast and diverse our natural world is. There are over 5,000 species of mammals, 10,000 species of birds, 30,000 species of\nfish – and astonishingly, over 400,000 different types of flowers.\nIn this competition, you’re challenged to build a machine learning model that\nidentifies the type of flowers in a dataset of images (for simplicity, we’re sticking to\njust over 100 types). Dataset link: https://www.kaggle.com/c/tpu-getting-started/data","metadata":{}},{"cell_type":"code","source":"#Importing Dependencies\n\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport numpy as np \nimport re\nimport math","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:43.957840Z","iopub.execute_input":"2023-02-22T10:56:43.958370Z","iopub.status.idle":"2023-02-22T10:56:53.512620Z","shell.execute_reply.started":"2023-02-22T10:56:43.958267Z","shell.execute_reply":"2023-02-22T10:56:53.511134Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf \nfrom kaggle_datasets import KaggleDatasets \nimport numpy as np \nimport warnings\nwarnings.filterwarnings('ignore')\n\nprint(\"Tensorflow version:\", tf.__version__)","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:53.515399Z","iopub.execute_input":"2023-02-22T10:56:53.516661Z","iopub.status.idle":"2023-02-22T10:56:53.526894Z","shell.execute_reply.started":"2023-02-22T10:56:53.516607Z","shell.execute_reply":"2023-02-22T10:56:53.525392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Detect TPU, return appropriate distribution strategy\n\ntry:\n    tpu = tf.distribute.cluster_resolver.TPUClusterResolver()  \n    print('Running on TPU ', tpu.master())\nexcept ValueError:\n    tpu = None\n\nif tpu:\n    tf.config.experimental_connect_to_cluster(tpu)\n    tf.tpu.experimental.initialize_tpu_system(tpu)\n    strategy = tf.distribute.experimental.TPUStrategy(tpu)\nelse:\n    strategy = tf.distribute.get_strategy() \n\nprint(\"REPLICAS: \", strategy.num_replicas_in_sync)","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:53.528699Z","iopub.execute_input":"2023-02-22T10:56:53.529951Z","iopub.status.idle":"2023-02-22T10:56:53.559810Z","shell.execute_reply.started":"2023-02-22T10:56:53.529913Z","shell.execute_reply":"2023-02-22T10:56:53.558644Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"GCS_DS_PATH = KaggleDatasets().get_gcs_path() ","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:53.562125Z","iopub.execute_input":"2023-02-22T10:56:53.562761Z","iopub.status.idle":"2023-02-22T10:56:55.221894Z","shell.execute_reply.started":"2023-02-22T10:56:53.562714Z","shell.execute_reply":"2023-02-22T10:56:55.220643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# For IMAGE_SIZE=[192, 192], a GPU will run out of memory, hence use TPU \nIMAGE_SIZE = [192, 192] \nEPOCHS = 5 \nBATCH_SIZE = 16 * strategy.num_replicas_in_sync \n\nNUM_TRAINING_IMAGES = 12753 \nNUM_TEST_IMAGES = 7382 \nSTEPS_PER_EPOCH = NUM_TRAINING_IMAGES // BATCH_SIZE \nAUTO = tf.data.experimental.AUTOTUNE ","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:55.223875Z","iopub.execute_input":"2023-02-22T10:56:55.224376Z","iopub.status.idle":"2023-02-22T10:56:55.230954Z","shell.execute_reply.started":"2023-02-22T10:56:55.224322Z","shell.execute_reply":"2023-02-22T10:56:55.229972Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Dataset Helper Function**","metadata":{}},{"cell_type":"code","source":"def decode_image(image_data): \n    image = tf.image.decode_jpeg(image_data, channels=3) \n    # Converting image to floats in the range [0, 1]\n    image = tf.cast(image, tf.float32) / 255.0 \n    # explicit size needed for TPU. Reshaping the data so that all the images are of same shape\n    image = tf.reshape(image, [*IMAGE_SIZE, 3])\n    return image ","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:55.232404Z","iopub.execute_input":"2023-02-22T10:56:55.233840Z","iopub.status.idle":"2023-02-22T10:56:55.244613Z","shell.execute_reply.started":"2023-02-22T10:56:55.233774Z","shell.execute_reply":"2023-02-22T10:56:55.243528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_labeled_tfrecord(example): \n    LABELED_TFREC_FORMAT = {\n        # tf.io.FixedLenFeature ==> Configuration for parsing a fixed-length input feature.\n        \"image\": tf.io.FixedLenFeature([], tf.string), # shape [] ==> single element, tf.string ==> bytestring\n        \"class\": tf.io.FixedLenFeature([], tf.int64),\n    }\n    example = tf.io.parse_single_example(example, LABELED_TFREC_FORMAT) \n    image = decode_image(example['image']) \n    label = tf.cast(example['class'], tf.int32) \n    return image, label # returns a dataset of (image, label) pairs\n\ndef read_unlabeled_tfrecord(example): \n    UNLABELED_TFREC_FORMAT = {\n        \"image\": tf.io.FixedLenFeature([], tf.string), \n        \"id\": tf.io.FixedLenFeature([], tf.string),\n        # class is missing, \n        # this competitions's challenge is to predict flower classes for the test dataset\n    }\n    example = tf.io.parse_single_example(example, UNLABELED_TFREC_FORMAT) \n    image = decode_image(example['image']) \n    idnum = example['id'] \n    return image, idnum # returns a dataset of image(s)","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:55.246227Z","iopub.execute_input":"2023-02-22T10:56:55.246894Z","iopub.status.idle":"2023-02-22T10:56:55.258861Z","shell.execute_reply.started":"2023-02-22T10:56:55.246854Z","shell.execute_reply":"2023-02-22T10:56:55.257871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dataset(filenames, labeled=True, ordered=False): \n    # Read from TFRecords. \n    # For optimal performance, reading from multiple files at once and disregarding data order. \n    # Order does not matter since we will be shuffling the data anyway.\n    \n    ignore_order = tf.data.Options()\n    if not ordered: \n        ignore_order.experimental_deterministic = False # disable order, increase speed \n    \n    dataset = tf.data.TFRecordDataset(filenames, num_parallel_reads=AUTO) \n    # num_parallel_reads=AUTO ==> Number of files to read in parallel\n    # automatically interleaves reads from multiple files\n    \n    dataset = dataset.with_options(ignore_order) # uses data as soon as it streams in, rather than in its original order\n    dataset = dataset.map(read_labeled_tfrecord if labeled else read_unlabeled_tfrecord, num_parallel_calls=AUTO) \n    # num_parallel_calls=AUTO ==> This loads multiple datasets in parallel, reducing the time waiting for the files to be opened.\n    \n    return dataset\n    # returns a dataset of \n    # (image, label) pairs if labeled=True \n    # OR \n    # (image, id) pairs if labeled=False","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:55.260782Z","iopub.execute_input":"2023-02-22T10:56:55.261651Z","iopub.status.idle":"2023-02-22T10:56:55.279211Z","shell.execute_reply.started":"2023-02-22T10:56:55.261598Z","shell.execute_reply":"2023-02-22T10:56:55.277623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from kaggle_datasets import KaggleDatasets\n# google cloud store path\nPATH = KaggleDatasets().get_gcs_path('tpu-getting-started')\nprint(PATH)","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:55.282791Z","iopub.execute_input":"2023-02-22T10:56:55.284144Z","iopub.status.idle":"2023-02-22T10:56:56.039294Z","shell.execute_reply.started":"2023-02-22T10:56:55.284103Z","shell.execute_reply":"2023-02-22T10:56:56.037696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# paths \nTRAINING_IMAGES = tf.io.gfile.glob(f'{PATH}/tfrecords-jpeg-512x512/train/*.tfrec')\nVALID_IMAGES = tf.io.gfile.glob(f'{PATH}/tfrecords-jpeg-512x512/val/*.tfrec')\nTEST_IMAGES = tf.io.gfile.glob(f'{PATH}/tfrecords-jpeg-512x512/test/*.tfrec')","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:56.045195Z","iopub.execute_input":"2023-02-22T10:56:56.045583Z","iopub.status.idle":"2023-02-22T10:56:58.027451Z","shell.execute_reply.started":"2023-02-22T10:56:56.045537Z","shell.execute_reply":"2023-02-22T10:56:58.026269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"CLASSES = ['pink primrose',    'hard-leaved pocket orchid', 'canterbury bells', 'sweet pea',     'wild geranium',     'tiger lily',           'moon orchid',              'bird of paradise', 'monkshood',        'globe thistle',         # 00 - 09\n           'snapdragon',       \"colt's foot\",               'king protea',      'spear thistle', 'yellow iris',       'globe-flower',         'purple coneflower',        'peruvian lily',    'balloon flower',   'giant white arum lily', # 10 - 19\n           'fire lily',        'pincushion flower',         'fritillary',       'red ginger',    'grape hyacinth',    'corn poppy',           'prince of wales feathers', 'stemless gentian', 'artichoke',        'sweet william',         # 20 - 29\n           'carnation',        'garden phlox',              'love in the mist', 'cosmos',        'alpine sea holly',  'ruby-lipped cattleya', 'cape flower',              'great masterwort', 'siam tulip',       'lenten rose',           # 30 - 39\n           'barberton daisy',  'daffodil',                  'sword lily',       'poinsettia',    'bolero deep blue',  'wallflower',           'marigold',                 'buttercup',        'daisy',            'common dandelion',      # 40 - 49\n           'petunia',          'wild pansy',                'primula',          'sunflower',     'lilac hibiscus',    'bishop of llandaff',   'gaura',                    'geranium',         'orange dahlia',    'pink-yellow dahlia',    # 50 - 59\n           'cautleya spicata', 'japanese anemone',          'black-eyed susan', 'silverbush',    'californian poppy', 'osteospermum',         'spring crocus',            'iris',             'windflower',       'tree poppy',            # 60 - 69\n           'gazania',          'azalea',                    'water lily',       'rose',          'thorn apple',       'morning glory',        'passion flower',           'lotus',            'toad lily',        'anthurium',             # 70 - 79\n           'frangipani',       'clematis',                  'hibiscus',         'columbine',     'desert-rose',       'tree mallow',          'magnolia',                 'cyclamen ',        'watercress',       'canna lily',            # 80 - 89\n           'hippeastrum ',     'bee balm',                  'pink quill',       'foxglove',      'bougainvillea',     'camellia',             'mallow',                   'mexican petunia',  'bromelia',         'blanket flower',        # 90 - 99\n           'trumpet creeper',  'blackberry lily',           'common tulip',     'wild rose']                                                                                                                                               # 100 - 102","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.029867Z","iopub.execute_input":"2023-02-22T10:56:58.030391Z","iopub.status.idle":"2023-02-22T10:56:58.042689Z","shell.execute_reply.started":"2023-02-22T10:56:58.030345Z","shell.execute_reply":"2023-02-22T10:56:58.041087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Helper variables\nAUTO = tf.data.experimental.AUTOTUNE\nIMAGE_SHAPE = [512,512]\nBATCH_SIZE = 16 * strategy.num_replicas_in_sync\nEPOCHS = 5","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.044271Z","iopub.execute_input":"2023-02-22T10:56:58.044785Z","iopub.status.idle":"2023-02-22T10:56:58.061080Z","shell.execute_reply.started":"2023-02-22T10:56:58.044736Z","shell.execute_reply":"2023-02-22T10:56:58.059762Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def decode_image(img):\n    '''Load Image From The Dataset'''\n    image = tf.io.decode_jpeg(img,channels=3)\n    image = tf.cast(image,tf.float32)/255.0\n    image = tf.reshape(image,[*IMAGE_SHAPE,3])\n    return image","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.062968Z","iopub.execute_input":"2023-02-22T10:56:58.063389Z","iopub.status.idle":"2023-02-22T10:56:58.079498Z","shell.execute_reply.started":"2023-02-22T10:56:58.063355Z","shell.execute_reply":"2023-02-22T10:56:58.078175Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_labeled_data(example):\n    '''Read Labeled tfrecord'''\n    labeled_struct = {\n        'image':tf.io.FixedLenFeature([],tf.string),\n        'class': tf.io.FixedLenFeature([],tf.int64)\n    }\n    parsed = tf.io.parse_single_example(example,labeled_struct)\n    image = decode_image(parsed['image'])\n    label = tf.cast(parsed['class'],tf.int32)\n    return image,label","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.081299Z","iopub.execute_input":"2023-02-22T10:56:58.081704Z","iopub.status.idle":"2023-02-22T10:56:58.093070Z","shell.execute_reply.started":"2023-02-22T10:56:58.081670Z","shell.execute_reply":"2023-02-22T10:56:58.091668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_unlabeled_data(example):\n    '''Read unlabeled tfrecord'''\n    unlabeled_struct = {\n        'image':tf.io.FixedLenFeature([],tf.string),\n        'id':tf.io.FixedLenFeature([],tf.string)\n    }\n    parsed = tf.io.parse_single_example(example,unlabeled_struct)\n    image = decode_image(parsed['image'])\n    idnum = parsed['id']\n    return image,idnum","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.094841Z","iopub.execute_input":"2023-02-22T10:56:58.095186Z","iopub.status.idle":"2023-02-22T10:56:58.106615Z","shell.execute_reply.started":"2023-02-22T10:56:58.095156Z","shell.execute_reply":"2023-02-22T10:56:58.105547Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dataset(filenames,is_labeled = True,inorder=False):\n    '''Load the tfrecord as Dataset.\n    is_label(bool) : is the data labeled or unlabeled\n    inorder(bool) : Should the data be inorder or loaded as soon as it arrives'''\n    options = tf.data.Options()\n    if not inorder:\n        options.experimental_deterministic = False\n    dataset = tf.data.TFRecordDataset(filenames,num_parallel_reads=AUTO)\n    dataset = dataset.with_options(options)\n    dataset = dataset.map(read_labeled_data if is_labeled else read_unlabeled_data)\n    return dataset","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.108137Z","iopub.execute_input":"2023-02-22T10:56:58.109138Z","iopub.status.idle":"2023-02-22T10:56:58.120992Z","shell.execute_reply.started":"2023-02-22T10:56:58.109103Z","shell.execute_reply":"2023-02-22T10:56:58.119885Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def data_aug(image,label):\n    '''Image Augummentation'''\n    image = tf.image.random_flip_left_right(image)\n    return image,label","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.122180Z","iopub.execute_input":"2023-02-22T10:56:58.123633Z","iopub.status.idle":"2023-02-22T10:56:58.140218Z","shell.execute_reply.started":"2023-02-22T10:56:58.123564Z","shell.execute_reply":"2023-02-22T10:56:58.139119Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_training_data():\n    '''Load the training dataset'''\n    dataset = load_dataset(TRAINING_IMAGES,is_labeled=True)\n    dataset = dataset.map(data_aug,num_parallel_calls=AUTO)\n    dataset = dataset.repeat()\n    dataset = dataset.shuffle(49)\n    dataset = dataset.batch(BATCH_SIZE)\n    dataset = dataset.prefetch(AUTO)\n    return dataset","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.142214Z","iopub.execute_input":"2023-02-22T10:56:58.143413Z","iopub.status.idle":"2023-02-22T10:56:58.152948Z","shell.execute_reply.started":"2023-02-22T10:56:58.143359Z","shell.execute_reply":"2023-02-22T10:56:58.151698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_valid_data():\n    '''Load the validation dataset'''\n    dataset = load_dataset(VALID_IMAGES,is_labeled=True,inorder=True)\n    dataset = dataset.batch(BATCH_SIZE)\n    dataset = dataset.cache()\n    dataset = dataset.prefetch(AUTO)\n    return dataset","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.154650Z","iopub.execute_input":"2023-02-22T10:56:58.155846Z","iopub.status.idle":"2023-02-22T10:56:58.168099Z","shell.execute_reply.started":"2023-02-22T10:56:58.155793Z","shell.execute_reply":"2023-02-22T10:56:58.166832Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_test_data(ordered=False):\n    '''Load the test dataset'''\n    dataset = load_dataset(TEST_IMAGES,is_labeled=False,inorder=ordered)\n    dataset = dataset.batch(BATCH_SIZE)\n    dataset = dataset.prefetch(AUTO)\n    return dataset","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.170418Z","iopub.execute_input":"2023-02-22T10:56:58.171729Z","iopub.status.idle":"2023-02-22T10:56:58.182703Z","shell.execute_reply.started":"2023-02-22T10:56:58.171680Z","shell.execute_reply":"2023-02-22T10:56:58.181053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def count_files(filenames):\n    '''Count number of files in the dataset'''\n    n = [int(re.compile(r\"-([0-9]*)\\.\").search(file).group(1)) for file in filenames]\n    return np.sum(n)","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.184121Z","iopub.execute_input":"2023-02-22T10:56:58.184709Z","iopub.status.idle":"2023-02-22T10:56:58.196301Z","shell.execute_reply.started":"2023-02-22T10:56:58.184675Z","shell.execute_reply":"2023-02-22T10:56:58.195231Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import re\nNUM_TRAIN_IMG = count_files(TRAINING_IMAGES)\nNUM_VALID_IMG = count_files(VALID_IMAGES)\nNUM_TEST_IMG = count_files(TEST_IMAGES)\nprint(f'Number of training images : {NUM_TRAIN_IMG} \\nNumber of validation images : {NUM_VALID_IMG} \\nNumber of test images : {NUM_TEST_IMG}')","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.197737Z","iopub.execute_input":"2023-02-22T10:56:58.198329Z","iopub.status.idle":"2023-02-22T10:56:58.214459Z","shell.execute_reply.started":"2023-02-22T10:56:58.198296Z","shell.execute_reply":"2023-02-22T10:56:58.213247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# get the data\nds_train = get_training_data()\nds_valid = get_valid_data()\nds_test = get_test_data()","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.215913Z","iopub.execute_input":"2023-02-22T10:56:58.216917Z","iopub.status.idle":"2023-02-22T10:56:58.637694Z","shell.execute_reply.started":"2023-02-22T10:56:58.216869Z","shell.execute_reply":"2023-02-22T10:56:58.636356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**EDA**","metadata":{}},{"cell_type":"code","source":"def batch_to_numpy(data):\n    '''Converts batch of data to numpy '''\n    image , label = data\n    image = image.numpy()\n    label = label.numpy()\n    if label.dtype == object:\n        label = [None for _ in enumerate(label)]\n    return image , label","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.639669Z","iopub.execute_input":"2023-02-22T10:56:58.640034Z","iopub.status.idle":"2023-02-22T10:56:58.647950Z","shell.execute_reply.started":"2023-02-22T10:56:58.640002Z","shell.execute_reply":"2023-02-22T10:56:58.646485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def display_batch_images(databatch):\n    '''Plots Some Train , Test , Validation data'''\n    # load data as numpy \n    img,label = batch_to_numpy(databatch)\n    \n    rows = int(math.sqrt(len(img)))\n    cols = len(img)//rows\n    # size and spacing\n    FIGSIZE = 13.0\n    SPACING = 0.1\n    subplot=(rows,cols,1)\n    if rows < cols:\n        plt.figure(figsize=(FIGSIZE,FIGSIZE/cols*rows))\n    else:\n        plt.figure(figsize=(FIGSIZE/rows*cols,FIGSIZE))\n        \n    for i , (image, label) in enumerate(zip(img[:rows*cols],label[:rows*cols])):\n        plt.subplot(rows,cols,i+1)\n        plt.axis('off')\n        plt.imshow(image)\n        if label:\n            plt.title(CLASSES[label])\n        plt.tight_layout()\n        plt.subplots_adjust(wspace=SPACING, hspace=SPACING)\n    plt.show()\n        ","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.649733Z","iopub.execute_input":"2023-02-22T10:56:58.650109Z","iopub.status.idle":"2023-02-22T10:56:58.660904Z","shell.execute_reply.started":"2023-02-22T10:56:58.650077Z","shell.execute_reply":"2023-02-22T10:56:58.659705Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display_batch_images(next(iter(ds_valid.unbatch().batch(25))))","metadata":{"execution":{"iopub.status.busy":"2023-02-22T10:56:58.662759Z","iopub.execute_input":"2023-02-22T10:56:58.663160Z","iopub.status.idle":"2023-02-22T10:57:06.412675Z","shell.execute_reply.started":"2023-02-22T10:56:58.663128Z","shell.execute_reply":"2023-02-22T10:57:06.410663Z"},"trusted":true},"execution_count":null,"outputs":[]}]}