{"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":"# Import Libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.image as mpimg\nimport matplotlib.pyplot as plt\nimport os\nimport zipfile\nimport random\nimport tensorflow as tf\n\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, BatchNormalization, Dropout\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.optimizers import RMSprop\nfrom tensorflow.keras.preprocessing import image\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom shutil import copyfile","metadata":{"id":"dn-6c02VmqiN","execution":{"iopub.status.busy":"2023-10-28T11:43:10.249992Z","iopub.execute_input":"2023-10-28T11:43:10.250377Z","iopub.status.idle":"2023-10-28T11:43:15.162289Z","shell.execute_reply.started":"2023-10-28T11:43:10.250295Z","shell.execute_reply":"2023-10-28T11:43:15.161549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Unzipping Training Images","metadata":{}},{"cell_type":"code","source":"local_zip = '../input/dogs-vs-cats/train.zip'\nzip_ref = zipfile.ZipFile(local_zip, 'r')\nzip_ref.extractall('/tmp/source')\nzip_ref.close()\nprint('No. of Training Images: ', len(os.listdir('/tmp/source/train')))","metadata":{"id":"3sd9dQWa23aj","outputId":"a28e23c2-61f3-408a-8b97-e136eeb2cfef","execution":{"iopub.status.busy":"2023-10-28T11:43:15.164184Z","iopub.execute_input":"2023-10-28T11:43:15.164462Z","iopub.status.idle":"2023-10-28T11:43:26.006006Z","shell.execute_reply.started":"2023-10-28T11:43:15.164434Z","shell.execute_reply":"2023-10-28T11:43:26.004977Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir('/tmp/source/train')[:10]","metadata":{"execution":{"iopub.status.busy":"2023-10-28T11:43:26.007449Z","iopub.execute_input":"2023-10-28T11:43:26.007846Z","iopub.status.idle":"2023-10-28T11:43:26.032827Z","shell.execute_reply.started":"2023-10-28T11:43:26.007805Z","shell.execute_reply":"2023-10-28T11:43:26.031723Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualizing Random Images","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(16,16))\n\nimages = os.listdir('/tmp/source/train')\nfor i in range(8):\n    img = random.choice([x for x in images])\n    fig = plt.subplot(4,4,i+1)\n    fig.axis('off')\n    img = mpimg.imread(os.path.join('/tmp/source/train', img)) \n    fig.imshow(img) ","metadata":{"execution":{"iopub.status.busy":"2023-10-28T11:43:26.034075Z","iopub.execute_input":"2023-10-28T11:43:26.034347Z","iopub.status.idle":"2023-10-28T11:43:27.565495Z","shell.execute_reply.started":"2023-10-28T11:43:26.034321Z","shell.execute_reply":"2023-10-28T11:43:27.564650Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Unzipping Testing Images","metadata":{}},{"cell_type":"code","source":"local_zip = '../input/dogs-vs-cats/test1.zip'\nzip_ref = zipfile.ZipFile(local_zip, 'r')\nzip_ref.extractall('/tmp/source')\nzip_ref.close()\nprint('No. of Testing Images: ',len(os.listdir('/tmp/source/test1')))","metadata":{"execution":{"iopub.status.busy":"2023-10-28T11:43:27.568180Z","iopub.execute_input":"2023-10-28T11:43:27.568445Z","iopub.status.idle":"2023-10-28T11:43:32.838093Z","shell.execute_reply.started":"2023-10-28T11:43:27.568419Z","shell.execute_reply":"2023-10-28T11:43:32.837133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir('/tmp/source/test1')[:10]","metadata":{"id":"gi3yD62a6X3S","outputId":"a853968c-0eda-44c5-a9ec-2c5734df40de","execution":{"iopub.status.busy":"2023-10-28T11:43:32.840784Z","iopub.execute_input":"2023-10-28T11:43:32.841063Z","iopub.status.idle":"2023-10-28T11:43:32.853170Z","shell.execute_reply.started":"2023-10-28T11:43:32.841036Z","shell.execute_reply":"2023-10-28T11:43:32.852358Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Directories\n\n * cats-v-dogs:\n    * training:\n        * cats\n        * dogs\n    * validation:\n        * cats\n        * dogs","metadata":{}},{"cell_type":"code","source":"try:\n    parent_dir = '/tmp/cats-v-dogs'\n    os.mkdir(parent_dir)\n\n    for dir in ['training', 'validation']:\n        path = os.path.join(parent_dir , dir)\n        os.mkdir(path)\n        for dir in ['cats', 'dogs']:\n            n_path = os.path.join(path , dir)\n            os.mkdir(n_path)\nexcept OSError:\n    print('error')","metadata":{"id":"F-QkLjxpmyK2","execution":{"iopub.status.busy":"2023-10-28T11:43:32.854502Z","iopub.execute_input":"2023-10-28T11:43:32.854795Z","iopub.status.idle":"2023-10-28T11:43:32.860638Z","shell.execute_reply.started":"2023-10-28T11:43:32.854768Z","shell.execute_reply":"2023-10-28T11:43:32.859805Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"src_dir = '/tmp/source/train'\n\ncats_train_dir = '/tmp/cats-v-dogs/training/cats/'\ncats_valid_dir = '/tmp/cats-v-dogs/validation/cats/'\n\ndogs_train_dir = '/tmp/cats-v-dogs/training/dogs/'\ndogs_valid_dir = '/tmp/cats-v-dogs/validation/dogs/'\n\n# List of cats names in all training images\ncats =[img for img in os.listdir(src_dir) if img[:3] == 'cat']\n\n# List of dogs names in all training images\ndogs =[img for img in os.listdir(src_dir) if img[:3] == 'dog']\n\n# Take 10% of training images for validation    \ncats_valid_sample = random.sample(cats, int(0.1*len(cats))) \ndogs_valid_sample = random.sample(dogs, int(0.1*len(dogs)))\n\nfor img in os.listdir(src_dir):\n    src_img = os.path.join(src_dir, img)\n    \n    if img[:3] == 'cat':\n        if img in cats_valid_sample:\n            dest_img = os.path.join(cats_valid_dir, img)\n        else:\n            dest_img = os.path.join(cats_train_dir, img)\n        \n    elif img[:3] == 'dog':\n        if img in dogs_valid_sample:\n            dest_img = os.path.join(dogs_valid_dir, img)\n        else:\n            dest_img = os.path.join(dogs_train_dir, img)\n\n    copyfile(src_img, dest_img)  ","metadata":{"execution":{"iopub.status.busy":"2023-10-28T11:43:32.861903Z","iopub.execute_input":"2023-10-28T11:43:32.862397Z","iopub.status.idle":"2023-10-28T11:43:37.265839Z","shell.execute_reply.started":"2023-10-28T11:43:32.862360Z","shell.execute_reply":"2023-10-28T11:43:37.265106Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('No. of ALL cats : ', len(cats))\nprint('No. of cats for training: ', len(os.listdir(cats_train_dir)))\nprint('No. of cats for validation: ', len(os.listdir(cats_valid_dir)))\n\nprint('\\nNo. of ALL dogs : ', len(dogs))\nprint('No. of dogs for training: ', len(os.listdir(dogs_train_dir)))\nprint('No. of dogs for validation: ', len(os.listdir(dogs_valid_dir)))","metadata":{"execution":{"iopub.status.busy":"2023-10-28T11:43:37.266955Z","iopub.execute_input":"2023-10-28T11:43:37.267226Z","iopub.status.idle":"2023-10-28T11:43:37.306301Z","shell.execute_reply.started":"2023-10-28T11:43:37.267200Z","shell.execute_reply":"2023-10-28T11:43:37.305624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualizing Random images of cats for training","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(16,16))\n\nimages = os.listdir(cats_train_dir)\nfor i in range(8):\n    img = random.choice([x for x in images])\n    fig = plt.subplot(4,4,i+1)\n    fig.axis('off')\n    img = mpimg.imread(os.path.join(cats_train_dir, img)) \n    fig.imshow(img) ","metadata":{"execution":{"iopub.status.busy":"2023-10-28T11:43:37.307744Z","iopub.execute_input":"2023-10-28T11:43:37.308125Z","iopub.status.idle":"2023-10-28T11:43:38.039075Z","shell.execute_reply.started":"2023-10-28T11:43:37.308089Z","shell.execute_reply":"2023-10-28T11:43:38.038317Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualizing Random images of dogs for validation","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(16,16))\n\nimages = os.listdir(dogs_valid_dir)\nfor i in range(8):\n    img = random.choice([x for x in images])\n    fig = plt.subplot(4,4,i+1)\n    fig.axis('off')\n    img = mpimg.imread(os.path.join(dogs_valid_dir, img)) \n    fig.imshow(img) ","metadata":{"execution":{"iopub.status.busy":"2023-10-28T11:43:38.040251Z","iopub.execute_input":"2023-10-28T11:43:38.040558Z","iopub.status.idle":"2023-10-28T11:43:38.719029Z","shell.execute_reply.started":"2023-10-28T11:43:38.040514Z","shell.execute_reply":"2023-10-28T11:43:38.718203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Images Augmentation","metadata":{}},{"cell_type":"code","source":"# All images will be rescaled by 1./255\n# All images will be resized to 150x150\n\ntrain_datagen = ImageDataGenerator(rescale=1/255,rotation_range=40, width_shift_range=0.2, height_shift_range=0.2,\n                                   shear_range=0.2,zoom_range=0.2,horizontal_flip=True, fill_mode='nearest')\nvalid_datagen = ImageDataGenerator(rescale=1/255)\n\n\ntrain_dir = '/tmp/cats-v-dogs/training/'\ntrain_generator = train_datagen.flow_from_directory(train_dir, target_size=(150, 150), batch_size=28, class_mode='binary')\n\nvalid_dir = '/tmp/cats-v-dogs/validation/'\nvalid_generator = valid_datagen.flow_from_directory(valid_dir,target_size=(150, 150), batch_size=28,class_mode='binary')","metadata":{"id":"mlNjoJ5D61N6","outputId":"3026271d-3f20-4432-e5a5-b352e30852ee","execution":{"iopub.status.busy":"2023-10-28T11:43:38.720208Z","iopub.execute_input":"2023-10-28T11:43:38.720490Z","iopub.status.idle":"2023-10-28T11:43:39.535501Z","shell.execute_reply.started":"2023-10-28T11:43:38.720463Z","shell.execute_reply":"2023-10-28T11:43:39.534748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Our CNN","metadata":{}},{"cell_type":"code","source":"early_stopping = EarlyStopping( min_delta=0.01, # minimium amount of change to count as an improvement\n                                patience=5, # how many epochs to wait before stopping\n                                restore_best_weights=True,\n                              )\n\nstrategy = tf.distribute.MirroredStrategy()\n\nwith strategy.scope():\n    model = Sequential([     Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),\n                             MaxPooling2D(2, 2),\n\n                             Conv2D(64, (3,3), activation='relu'),\n                             MaxPooling2D(2,2),\n\n                             Conv2D(64, (3,3), activation='relu'),\n                             MaxPooling2D(2,2),\n\n                             Flatten(),\n\n                             Dense(128, activation='relu'),\n                             Dense(1, activation='sigmoid')      \n                        ])\n\n    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n                        \nmodel.summary()","metadata":{"id":"-BQrav4anTmj","execution":{"iopub.status.busy":"2023-10-28T11:43:39.536750Z","iopub.execute_input":"2023-10-28T11:43:39.537019Z","iopub.status.idle":"2023-10-28T11:43:42.060686Z","shell.execute_reply.started":"2023-10-28T11:43:39.536993Z","shell.execute_reply":"2023-10-28T11:43:42.059894Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(train_generator, epochs=20, verbose=1,validation_data=valid_generator, callbacks = [early_stopping])","metadata":{"execution":{"iopub.status.busy":"2023-10-28T11:43:42.061760Z","iopub.execute_input":"2023-10-28T11:43:42.062037Z","iopub.status.idle":"2023-10-28T12:35:30.456887Z","shell.execute_reply.started":"2023-10-28T11:43:42.062009Z","shell.execute_reply":"2023-10-28T12:35:30.455919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(valid_generator.class_indices)","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:35:30.458743Z","iopub.execute_input":"2023-10-28T12:35:30.459057Z","iopub.status.idle":"2023-10-28T12:35:30.464271Z","shell.execute_reply.started":"2023-10-28T12:35:30.459027Z","shell.execute_reply":"2023-10-28T12:35:30.463508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_df = pd.DataFrame(history.history)\nhistory_df.loc[:,['loss','val_loss']].plot()\nhistory_df.loc[:,['accuracy','val_accuracy']].plot()","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:35:30.465509Z","iopub.execute_input":"2023-10-28T12:35:30.465804Z","iopub.status.idle":"2023-10-28T12:35:31.107312Z","shell.execute_reply.started":"2023-10-28T12:35:30.465778Z","shell.execute_reply":"2023-10-28T12:35:31.106395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(valid_generator)","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:35:31.108583Z","iopub.execute_input":"2023-10-28T12:35:31.108975Z","iopub.status.idle":"2023-10-28T12:35:37.477445Z","shell.execute_reply.started":"2023-10-28T12:35:31.108932Z","shell.execute_reply":"2023-10-28T12:35:37.476651Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predicting of Testing Images\n","metadata":{}},{"cell_type":"code","source":"test_dir = '/tmp/source/test1'\nos.listdir(test_dir)[:10]","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:35:37.478846Z","iopub.execute_input":"2023-10-28T12:35:37.479213Z","iopub.status.idle":"2023-10-28T12:35:37.492317Z","shell.execute_reply.started":"2023-10-28T12:35:37.479176Z","shell.execute_reply":"2023-10-28T12:35:37.491594Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def convert_one_img(img_folder, img):\n  # dimensions of image\n    img_width, img_height = 150, 150\n    img = os.path.join(img_folder, img)\n    img = image.load_img(img, target_size=(img_width, img_height))\n    img = image.img_to_array(img)\n    img = np.expand_dims(img, axis=0)\n    img /= 255\n\n    return img","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:35:37.493340Z","iopub.execute_input":"2023-10-28T12:35:37.493620Z","iopub.status.idle":"2023-10-28T12:35:37.498358Z","shell.execute_reply.started":"2023-10-28T12:35:37.493589Z","shell.execute_reply":"2023-10-28T12:35:37.497651Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def convert_imgs_to_tensors(img_folder):\n\n  # load all images into a list\n  images = []\n\n  for img in os.listdir(img_folder):\n    img = convert_one_img(img_folder, img)\n    images.append(img)\n\n  # stack up images list to pass for model\n  images = np.vstack(images)\n\n  return images","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:35:37.499491Z","iopub.execute_input":"2023-10-28T12:35:37.499830Z","iopub.status.idle":"2023-10-28T12:35:37.509826Z","shell.execute_reply.started":"2023-10-28T12:35:37.499803Z","shell.execute_reply":"2023-10-28T12:35:37.509122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img1= convert_one_img(test_dir, os.listdir(test_dir)[0])\nmodel.predict(img1)","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:35:37.510877Z","iopub.execute_input":"2023-10-28T12:35:37.511142Z","iopub.status.idle":"2023-10-28T12:35:38.763227Z","shell.execute_reply.started":"2023-10-28T12:35:37.511116Z","shell.execute_reply":"2023-10-28T12:35:38.762193Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Try Prediction on Training Data (Cats)","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(16,16))\n\nimages = os.listdir(cats_train_dir)[:20]\nfor i, img in enumerate(images):\n    fig = plt.subplot(5,5,i+1)\n    fig.axis('off')\n    img = mpimg.imread(os.path.join(cats_train_dir, img)) \n    fig.imshow(img)\n    pic = convert_one_img(cats_train_dir, os.listdir(cats_train_dir)[i])\n    label = 'Cat' if (model.predict(pic) < 0.5).astype('int') else 'Dog'\n    plt.title(label)","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:35:38.764606Z","iopub.execute_input":"2023-10-28T12:35:38.764984Z","iopub.status.idle":"2023-10-28T12:35:41.979921Z","shell.execute_reply.started":"2023-10-28T12:35:38.764945Z","shell.execute_reply":"2023-10-28T12:35:41.978878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Try Prediction on Validation Data (Dogs)","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(16,16))\n\nimages = os.listdir(dogs_valid_dir)[:18]\nfor i, img in enumerate(images):\n    fig = plt.subplot(5,5,i+1)\n    fig.axis('off')\n    img = mpimg.imread(os.path.join(dogs_valid_dir, img)) \n    fig.imshow(img)\n    pic = convert_one_img(dogs_valid_dir, os.listdir(dogs_valid_dir)[i])\n    label = 'Cat' if (model.predict(pic) < 0.5).astype('int') else 'Dog'\n    plt.title(label)","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:35:41.981270Z","iopub.execute_input":"2023-10-28T12:35:41.981634Z","iopub.status.idle":"2023-10-28T12:35:44.952031Z","shell.execute_reply.started":"2023-10-28T12:35:41.981600Z","shell.execute_reply":"2023-10-28T12:35:44.951190Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dir = '/tmp/source/test1'\ntest_images= convert_imgs_to_tensors(test_dir)","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:35:44.953182Z","iopub.execute_input":"2023-10-28T12:35:44.953453Z","iopub.status.idle":"2023-10-28T12:36:16.510735Z","shell.execute_reply.started":"2023-10-28T12:35:44.953427Z","shell.execute_reply":"2023-10-28T12:36:16.509868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Check Predictions on First 100 Images of Testing Data","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(20,20))\n\nimages = os.listdir(test_dir)[:100]\nfor i, img in enumerate(images):\n    fig = plt.subplot(10,10,i+1)\n    fig.axis('off')\n    img = mpimg.imread(os.path.join(test_dir, img)) \n    fig.imshow(img)\n    pic = convert_one_img(test_dir, os.listdir(test_dir)[i])\n    label = 'Cat' if (model.predict(pic) < 0.5).astype('int') else 'Dog'\n    plt.title(label)","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:36:16.512497Z","iopub.execute_input":"2023-10-28T12:36:16.512818Z","iopub.status.idle":"2023-10-28T12:36:31.529767Z","shell.execute_reply.started":"2023-10-28T12:36:16.512789Z","shell.execute_reply":"2023-10-28T12:36:31.528619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> Only 7/100 are wrong predictions from first 100 images of testing data","metadata":{}},{"cell_type":"code","source":"pred = (model.predict(test_images) > 0.5).astype('int')","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:36:31.531069Z","iopub.execute_input":"2023-10-28T12:36:31.531378Z","iopub.status.idle":"2023-10-28T12:36:39.824443Z","shell.execute_reply.started":"2023-10-28T12:36:31.531345Z","shell.execute_reply":"2023-10-28T12:36:39.823716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dir = '/tmp/source/test1'\ntest_data = os.listdir(test_dir)\ntest_df = pd.DataFrame({ \"id\" : test_data})\ntest_df","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:36:39.825752Z","iopub.execute_input":"2023-10-28T12:36:39.826019Z","iopub.status.idle":"2023-10-28T12:36:39.847940Z","shell.execute_reply.started":"2023-10-28T12:36:39.825994Z","shell.execute_reply":"2023-10-28T12:36:39.847204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df['id'] = test_df['id'].str.split('.').str[0]\ntest_df['label'] = pred\ntest_df.head(20)","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:36:39.848983Z","iopub.execute_input":"2023-10-28T12:36:39.849238Z","iopub.status.idle":"2023-10-28T12:36:40.071977Z","shell.execute_reply.started":"2023-10-28T12:36:39.849214Z","shell.execute_reply":"2023-10-28T12:36:40.071094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.to_csv('submission.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2023-10-28T12:36:40.073297Z","iopub.execute_input":"2023-10-28T12:36:40.073591Z","iopub.status.idle":"2023-10-28T12:36:40.334258Z","shell.execute_reply.started":"2023-10-28T12:36:40.073557Z","shell.execute_reply":"2023-10-28T12:36:40.333317Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}