{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-02-10T17:40:54.607413Z","iopub.execute_input":"2023-02-10T17:40:54.607821Z","iopub.status.idle":"2023-02-10T17:40:54.617591Z","shell.execute_reply.started":"2023-02-10T17:40:54.607790Z","shell.execute_reply":"2023-02-10T17:40:54.616577Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nfrom keras.preprocessing.image import load_img, image_dataset_from_directory, ImageDataGenerator\n","metadata":{"execution":{"iopub.status.busy":"2023-02-10T17:40:55.314110Z","iopub.execute_input":"2023-02-10T17:40:55.315349Z","iopub.status.idle":"2023-02-10T17:40:55.321779Z","shell.execute_reply.started":"2023-02-10T17:40:55.315273Z","shell.execute_reply":"2023-02-10T17:40:55.320425Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\n","metadata":{"execution":{"iopub.status.busy":"2023-02-10T17:44:28.213745Z","iopub.execute_input":"2023-02-10T17:44:28.214190Z","iopub.status.idle":"2023-02-10T17:44:28.220565Z","shell.execute_reply.started":"2023-02-10T17:44:28.214153Z","shell.execute_reply":"2023-02-10T17:44:28.219075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Look at data","metadata":{}},{"cell_type":"markdown","source":"From the description,\n- label 1->dog, 0->cat;\n- 25k images (12.5k each class)\n\nRunning ls after unzip \n``` !ls train\ncat.0.jpg      cat.3248.jpg  cat.7749.jpg   dog.12247.jpg  dog.5499.jpg\n```\n\n- Assume all filenames are in this format. Training data has all correct labels\n\n\n","metadata":{}},{"cell_type":"code","source":"!unzip -q \"/kaggle/input/dogs-vs-cats/test1.zip\"\n!unzip -q \"/kaggle/input/dogs-vs-cats/train.zip\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls","metadata":{"execution":{"iopub.status.busy":"2023-02-10T17:41:16.295470Z","iopub.execute_input":"2023-02-10T17:41:16.296269Z","iopub.status.idle":"2023-02-10T17:41:17.398995Z","shell.execute_reply.started":"2023-02-10T17:41:16.296223Z","shell.execute_reply":"2023-02-10T17:41:17.397548Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Constants\nTRAIN_DIR = '/kaggle/working/train'\nTEST_DIR = '/kaggle/working/test1'","metadata":{"execution":{"iopub.status.busy":"2023-02-10T17:41:18.937220Z","iopub.execute_input":"2023-02-10T17:41:18.937980Z","iopub.status.idle":"2023-02-10T17:41:18.944647Z","shell.execute_reply.started":"2023-02-10T17:41:18.937923Z","shell.execute_reply":"2023-02-10T17:41:18.943549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from collections import defaultdict\nfiles = []\nlabels = []\nfor item in os.scandir(\"train/\"):\n    if not item.is_file():\n        print('Something wrong here?')\n    filename = str(item.name)\n    if 'cat' in filename:\n        files += [filename]\n        labels += ['0']\n    else:\n        files += [filename]\n        labels += ['1']","metadata":{"execution":{"iopub.status.busy":"2023-02-10T17:41:20.643185Z","iopub.execute_input":"2023-02-10T17:41:20.644049Z","iopub.status.idle":"2023-02-10T17:41:20.692944Z","shell.execute_reply.started":"2023-02-10T17:41:20.643984Z","shell.execute_reply":"2023-02-10T17:41:20.691603Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create dataframe\ndf = pd.DataFrame.from_dict({'file': files, 'label':labels})\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2023-02-10T17:41:21.983682Z","iopub.execute_input":"2023-02-10T17:41:21.984137Z","iopub.status.idle":"2023-02-10T17:41:22.008127Z","shell.execute_reply.started":"2023-02-10T17:41:21.984101Z","shell.execute_reply":"2023-02-10T17:41:22.006512Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['label'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-02-10T17:41:24.569341Z","iopub.execute_input":"2023-02-10T17:41:24.569763Z","iopub.status.idle":"2023-02-10T17:41:24.583567Z","shell.execute_reply.started":"2023-02-10T17:41:24.569731Z","shell.execute_reply":"2023-02-10T17:41:24.582098Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Sizes\n\nfor i in [1,523,32,223,1109,54]:\n    print(load_img(\"train/\"+files[i]).size)\n","metadata":{"execution":{"iopub.status.busy":"2023-02-10T17:41:25.772686Z","iopub.execute_input":"2023-02-10T17:41:25.773698Z","iopub.status.idle":"2023-02-10T17:41:25.784170Z","shell.execute_reply.started":"2023-02-10T17:41:25.773649Z","shell.execute_reply":"2023-02-10T17:41:25.782404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Note: All the image are different in sizes and aspect ratios. For simplicity, I will pick 128x128 to be image size**","metadata":{}},{"cell_type":"code","source":"plt.imshow(load_img(\"train/\"+files[2203]))\n","metadata":{"execution":{"iopub.status.busy":"2023-02-10T17:41:27.614759Z","iopub.execute_input":"2023-02-10T17:41:27.615170Z","iopub.status.idle":"2023-02-10T17:41:27.883076Z","shell.execute_reply.started":"2023-02-10T17:41:27.615135Z","shell.execute_reply":"2023-02-10T17:41:27.882247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(load_img(\"train/\"+files[203]))","metadata":{"execution":{"iopub.status.busy":"2023-02-10T17:41:30.079794Z","iopub.execute_input":"2023-02-10T17:41:30.080734Z","iopub.status.idle":"2023-02-10T17:41:30.350656Z","shell.execute_reply.started":"2023-02-10T17:41:30.080691Z","shell.execute_reply":"2023-02-10T17:41:30.348999Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train-validation split (80-20)","metadata":{}},{"cell_type":"markdown","source":"Ref: https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator\n\nUsed for data augmentation, transformations/normalization.\n    - Why? Get more data or train faster.\n\nImageDataGenerator is used to perform these on batches.\n","metadata":{}},{"cell_type":"code","source":"BATCH_SIZE=64","metadata":{"execution":{"iopub.status.busy":"2023-02-10T17:41:36.265599Z","iopub.execute_input":"2023-02-10T17:41:36.266105Z","iopub.status.idle":"2023-02-10T17:41:36.273141Z","shell.execute_reply.started":"2023-02-10T17:41:36.266064Z","shell.execute_reply":"2023-02-10T17:41:36.271141Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Ref:\nflow_from_dataframe(\n    dataframe,\n    directory=None,\n    x_col='filename',\n    y_col='class',\n    weight_col=None,\n    target_size=(256, 256),\n    color_mode='rgb',\n    classes=None,\n    class_mode='categorical',\n    batch_size=32,\n    shuffle=True,\n    seed=None,\n    save_to_dir=None,\n    save_prefix='',\n    save_format='png',\n    subset=None,\n    interpolation='nearest',\n    validate_filenames=True,\n    **kwargs\n)","metadata":{}},{"cell_type":"code","source":"data_gen = ImageDataGenerator(rescale=1./255, validation_split=0.2)\ntrain_data_gen = data_gen.flow_from_dataframe(dataframe=df,\n                                              directory=TRAIN_DIR,\n                                              x_col='file',\n                                              y_col='label',\n                                              target_size=(128,128),\n                                              class_mode='binary',\n                                              shuffle=True,\n                                              seed=42,\n                                              subset='training')\n\nvalidation_data_gen = data_gen.flow_from_dataframe(dataframe=df,\n                                                   directory=TRAIN_DIR,\n                                                   target_size=(128,128),\n                                                   x_col='file',\n                                                   y_col='label',\n                                                  class_mode='binary',\n                                                  shuffle=True,\n                                                  seed=42,\n                                                  subset='validation')","metadata":{"execution":{"iopub.status.busy":"2023-02-10T18:37:50.418321Z","iopub.execute_input":"2023-02-10T18:37:50.418776Z","iopub.status.idle":"2023-02-10T18:37:50.910547Z","shell.execute_reply.started":"2023-02-10T18:37:50.418743Z","shell.execute_reply":"2023-02-10T18:37:50.909301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model Creation","metadata":{}},{"cell_type":"code","source":"BATCH_SIZE=64\nEPOCHS=10","metadata":{"execution":{"iopub.status.busy":"2023-02-10T18:37:55.004254Z","iopub.execute_input":"2023-02-10T18:37:55.004720Z","iopub.status.idle":"2023-02-10T18:37:55.011433Z","shell.execute_reply.started":"2023-02-10T18:37:55.004683Z","shell.execute_reply":"2023-02-10T18:37:55.009898Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Simple NN from last time :)\n","metadata":{}},{"cell_type":"code","source":"fnn = keras.models.Sequential()\nfnn.add(layers.Input(shape=(128,128,3)))\nfnn.add(layers.Flatten())\nfnn.add(layers.Dense(16, activation='relu'))\nfnn.add(layers.Dense(8, activation='relu'))\nfnn.add(layers.Dense(4, activation='relu'))\nfnn.add(layers.Dense(1, activation='sigmoid'))\n\n\nfnn.summary()","metadata":{"execution":{"iopub.status.busy":"2023-02-10T18:37:56.973753Z","iopub.execute_input":"2023-02-10T18:37:56.974172Z","iopub.status.idle":"2023-02-10T18:37:57.038818Z","shell.execute_reply.started":"2023-02-10T18:37:56.974128Z","shell.execute_reply":"2023-02-10T18:37:57.037508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fnn.compile(optimizer='adam',loss=\"binary_crossentropy\",metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2023-02-10T18:37:58.951185Z","iopub.execute_input":"2023-02-10T18:37:58.951866Z","iopub.status.idle":"2023-02-10T18:37:58.963843Z","shell.execute_reply.started":"2023-02-10T18:37:58.951830Z","shell.execute_reply":"2023-02-10T18:37:58.962440Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = fnn.fit(x=train_data_gen,\n                  steps_per_epoch=20000 // BATCH_SIZE,\n                  epochs=10,shuffle=False,\n                  validation_data=validation_data_gen,\n                  validation_steps=5000 // BATCH_SIZE)","metadata":{"execution":{"iopub.status.busy":"2023-02-10T18:37:59.799299Z","iopub.execute_input":"2023-02-10T18:37:59.799722Z","iopub.status.idle":"2023-02-10T18:44:40.451864Z","shell.execute_reply.started":"2023-02-10T18:37:59.799686Z","shell.execute_reply":"2023-02-10T18:44:40.450688Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(history.history['accuracy'])\nplt.plot(history.history['val_accuracy'])\nplt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train_acc', 'val_acc', 'train_loss', 'val_loss'], loc='upper left')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-10T18:47:57.685981Z","iopub.execute_input":"2023-02-10T18:47:57.686382Z","iopub.status.idle":"2023-02-10T18:47:57.920250Z","shell.execute_reply.started":"2023-02-10T18:47:57.686349Z","shell.execute_reply":"2023-02-10T18:47:57.919105Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Evaluating only on one batch from train and validation. Remove number of steps for entire.\n\nscores_train = fnn.evaluate(train_data_gen, steps=1)\nscores_val = fnn.evaluate(validation_data_gen, steps=1)\n","metadata":{"execution":{"iopub.status.busy":"2023-02-10T18:47:57.922044Z","iopub.execute_input":"2023-02-10T18:47:57.922554Z","iopub.status.idle":"2023-02-10T18:47:58.661113Z","shell.execute_reply.started":"2023-02-10T18:47:57.922510Z","shell.execute_reply":"2023-02-10T18:47:58.659815Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"training accuracy : {:.2f}\".format(scores_train[1]*100))\nprint(\"validation accuracy : {:.2f}\".format(scores_val[1]*100))\n","metadata":{"execution":{"iopub.status.busy":"2023-02-10T18:47:58.663581Z","iopub.execute_input":"2023-02-10T18:47:58.663960Z","iopub.status.idle":"2023-02-10T18:47:58.670173Z","shell.execute_reply.started":"2023-02-10T18:47:58.663927Z","shell.execute_reply":"2023-02-10T18:47:58.668755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Convolutional NN","metadata":{}},{"cell_type":"code","source":"cnn = keras.models.Sequential()\n\ncnn.add(layers.Input(shape=(128,128,3)))\n\ncnn.add(layers.Conv2D(filters=8, kernel_size=3, strides=(1,1), activation='relu'))\ncnn.add(layers.MaxPool2D(2,2))\ncnn.add(layers.Dropout(0.1))\n\ncnn.add(layers.Conv2D(filters=16, kernel_size=3, strides=(1,1), activation='relu'))\ncnn.add(layers.MaxPool2D(2,2))\ncnn.add(layers.Dropout(0.25))\n\ncnn.add(layers.Conv2D(filters=32, kernel_size=3, strides=(1,1), activation='relu'))\ncnn.add(layers.BatchNormalization())\ncnn.add(layers.MaxPool2D(2,2))\ncnn.add(layers.Dropout(0.5))\n\ncnn.add(layers.Flatten())\ncnn.add(layers.Dense(16, activation='relu'))\ncnn.add(layers.Dense(1, activation='sigmoid'))\n\n\ncnn.summary()","metadata":{"execution":{"iopub.status.busy":"2023-02-10T19:17:33.074121Z","iopub.execute_input":"2023-02-10T19:17:33.075201Z","iopub.status.idle":"2023-02-10T19:17:33.221819Z","shell.execute_reply.started":"2023-02-10T19:17:33.075148Z","shell.execute_reply":"2023-02-10T19:17:33.220243Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn.compile(optimizer='adam',loss=\"binary_crossentropy\",metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2023-02-10T19:18:43.545593Z","iopub.execute_input":"2023-02-10T19:18:43.546056Z","iopub.status.idle":"2023-02-10T19:18:43.560546Z","shell.execute_reply.started":"2023-02-10T19:18:43.546008Z","shell.execute_reply":"2023-02-10T19:18:43.559081Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn_history = cnn.fit(x=train_data_gen,\n                  steps_per_epoch=20000 // BATCH_SIZE,\n                  epochs=10,shuffle=False,\n                  validation_data=validation_data_gen,\n                  validation_steps=5000 // BATCH_SIZE)","metadata":{"execution":{"iopub.status.busy":"2023-02-10T19:19:31.084778Z","iopub.execute_input":"2023-02-10T19:19:31.085318Z","iopub.status.idle":"2023-02-10T19:28:13.331659Z","shell.execute_reply.started":"2023-02-10T19:19:31.085277Z","shell.execute_reply":"2023-02-10T19:28:13.330349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(cnn_history.history['accuracy'])\nplt.plot(cnn_history.history['val_accuracy'])\nplt.plot(cnn_history.history['loss'])\nplt.plot(cnn_history.history['val_loss'])\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train_acc', 'val_acc', 'train_loss', 'val_loss'], loc='upper left')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-10T19:28:16.989525Z","iopub.execute_input":"2023-02-10T19:28:16.990087Z","iopub.status.idle":"2023-02-10T19:28:17.234382Z","shell.execute_reply.started":"2023-02-10T19:28:16.990040Z","shell.execute_reply":"2023-02-10T19:28:17.233411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Evaluating only on one batch from train and validation. Remove number of steps for entire.\n\ncnn_scores_train = cnn.evaluate(train_data_gen, steps=1)\ncnn_scores_val = cnn.evaluate(validation_data_gen, steps=1)\n\nprint(\"training accuracy : {:.2f}\".format(cnn_scores_train[1]*100))\nprint(\"validation accuracy : {:.2f}\".format(cnn_scores_val[1]*100))\n","metadata":{"execution":{"iopub.status.busy":"2023-02-10T19:28:25.178738Z","iopub.execute_input":"2023-02-10T19:28:25.179440Z","iopub.status.idle":"2023-02-10T19:28:25.988954Z","shell.execute_reply.started":"2023-02-10T19:28:25.179387Z","shell.execute_reply":"2023-02-10T19:28:25.987653Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Use some pretrained model","metadata":{}},{"cell_type":"code","source":"from keras.applications.inception_v3 import InceptionV3\nbase = InceptionV3()\nbase.trainable = False","metadata":{"execution":{"iopub.status.busy":"2023-02-10T19:49:16.694438Z","iopub.execute_input":"2023-02-10T19:49:16.694853Z","iopub.status.idle":"2023-02-10T19:49:19.165676Z","shell.execute_reply.started":"2023-02-10T19:49:16.694821Z","shell.execute_reply":"2023-02-10T19:49:19.164426Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = keras.models.Sequential([\n    base,\n    layers.Flatten(),\n    layers.Dense(16, activation='relu'),\n    layers.Dense(1, activation='sigmoid'),\n])\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-02-10T19:49:22.211314Z","iopub.execute_input":"2023-02-10T19:49:22.211897Z","iopub.status.idle":"2023-02-10T19:49:22.945585Z","shell.execute_reply.started":"2023-02-10T19:49:22.211855Z","shell.execute_reply":"2023-02-10T19:49:22.944177Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer='adam',loss=\"binary_crossentropy\",metrics=[\"accuracy\"])\n\nmodel_history = model.fit(x=train_data_gen,\n                  steps_per_epoch=20000 // BATCH_SIZE,\n                  epochs=10,shuffle=False,\n                  validation_data=validation_data_gen,\n                  validation_steps=5000 // BATCH_SIZE)","metadata":{"execution":{"iopub.status.busy":"2023-02-10T19:50:11.389646Z","iopub.execute_input":"2023-02-10T19:50:11.390084Z","iopub.status.idle":"2023-02-10T20:25:18.593398Z","shell.execute_reply.started":"2023-02-10T19:50:11.390042Z","shell.execute_reply":"2023-02-10T20:25:18.592092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Evaluating only on one batch from train and validation. Remove number of steps for entire.\n\nmodel_scores_train = cnn.evaluate(train_data_gen, steps=1)\nmodel_scores_val = cnn.evaluate(validation_data_gen, steps=1)\n\nprint(\"training accuracy : {:.2f}\".format(model_scores_train[1]*100))\nprint(\"validation accuracy : {:.2f}\".format(model_scores_val[1]*100))\n","metadata":{"execution":{"iopub.status.busy":"2023-02-10T20:25:18.598443Z","iopub.execute_input":"2023-02-10T20:25:18.598832Z","iopub.status.idle":"2023-02-10T20:25:19.359144Z","shell.execute_reply.started":"2023-02-10T20:25:18.598799Z","shell.execute_reply":"2023-02-10T20:25:19.357763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(model_history.history['accuracy'])\nplt.plot(model_history.history['val_accuracy'])\nplt.plot(model_history.history['loss'])\nplt.plot(model_history.history['val_loss'])\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train_acc', 'val_acc', 'train_loss', 'val_loss'], loc='upper left')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-10T20:25:19.361765Z","iopub.execute_input":"2023-02-10T20:25:19.362188Z","iopub.status.idle":"2023-02-10T20:25:19.556002Z","shell.execute_reply.started":"2023-02-10T20:25:19.362150Z","shell.execute_reply":"2023-02-10T20:25:19.554706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict and submit","metadata":{}},{"cell_type":"code","source":"test_data_gen = ImageDataGenerator(rescale=1./255)\ntest_data = test_data_gen.flow_from_directory(directory=\"/kaggle/working/test1\",target_size=(128,128))","metadata":{"execution":{"iopub.status.busy":"2023-02-10T21:09:26.714343Z","iopub.execute_input":"2023-02-10T21:09:26.714752Z","iopub.status.idle":"2023-02-10T21:09:26.912003Z","shell.execute_reply.started":"2023-02-10T21:09:26.714718Z","shell.execute_reply":"2023-02-10T21:09:26.910729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}