{"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":"import os\n\nOUTPUT_DIR = './'\nMODEL_DIR = '../input/cassava-resnext50-32x4d-weights/'\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":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-11-25T16:49:29.079281Z","iopub.execute_input":"2021-11-25T16:49:29.079705Z","iopub.status.idle":"2021-11-25T16:49:29.090319Z","shell.execute_reply.started":"2021-11-25T16:49:29.079668Z","shell.execute_reply":"2021-11-25T16:49:29.089307Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport numpy as np\nimport glob\nimport cv2\nimport json\nimport pandas as pd\nfrom tqdm import tqdm_notebook as tqdm\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras import models, layers\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.losses import categorical_crossentropy","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:49:29.098661Z","iopub.execute_input":"2021-11-25T16:49:29.099011Z","iopub.status.idle":"2021-11-25T16:49:33.468976Z","shell.execute_reply.started":"2021-11-25T16:49:29.098976Z","shell.execute_reply":"2021-11-25T16:49:33.468196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir('../input/cassava-leaf-disease-classification')","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:49:33.471625Z","iopub.execute_input":"2021-11-25T16:49:33.472171Z","iopub.status.idle":"2021-11-25T16:49:33.483776Z","shell.execute_reply.started":"2021-11-25T16:49:33.472093Z","shell.execute_reply":"2021-11-25T16:49:33.482982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir('../input/cassava-leaf-disease-classification/test_images/')","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:49:33.486506Z","iopub.execute_input":"2021-11-25T16:49:33.486751Z","iopub.status.idle":"2021-11-25T16:49:33.499421Z","shell.execute_reply.started":"2021-11-25T16:49:33.486726Z","shell.execute_reply":"2021-11-25T16:49:33.498641Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def preprocess(img):\n    h,w = 224,224\n    img = cv2.resize(img, (h,w))\n    img = img.reshape(1,h,w,3)/255.\n    return img","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:49:33.500904Z","iopub.execute_input":"2021-11-25T16:49:33.501528Z","iopub.status.idle":"2021-11-25T16:49:33.507279Z","shell.execute_reply.started":"2021-11-25T16:49:33.501489Z","shell.execute_reply":"2021-11-25T16:49:33.506515Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\n# test_df = pd.read_csv('../input/cassava-leaf-disease-classification/')\nfile = open('../input/cassava-leaf-disease-classification/label_num_to_disease_map.json', \"r\")\nwith open('../input/cassava-leaf-disease-classification/label_num_to_disease_map.json', \"r\") as f:\n    label_names = json.loads(f.read())\n    print(label_names)","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:49:33.510665Z","iopub.execute_input":"2021-11-25T16:49:33.511021Z","iopub.status.idle":"2021-11-25T16:49:33.551331Z","shell.execute_reply.started":"2021-11-25T16:49:33.510984Z","shell.execute_reply":"2021-11-25T16:49:33.550589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:49:33.553045Z","iopub.execute_input":"2021-11-25T16:49:33.553674Z","iopub.status.idle":"2021-11-25T16:49:33.571453Z","shell.execute_reply.started":"2021-11-25T16:49:33.553630Z","shell.execute_reply":"2021-11-25T16:49:33.570291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.label = train_df.label.astype(\"str\")","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:49:33.573025Z","iopub.execute_input":"2021-11-25T16:49:33.573440Z","iopub.status.idle":"2021-11-25T16:49:33.603179Z","shell.execute_reply.started":"2021-11-25T16:49:33.573401Z","shell.execute_reply":"2021-11-25T16:49:33.602048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"names_lst = os.listdir(TRAIN_PATH)\nlabels = train_df['label']\nfor n in range(10):\n    test_im = cv2.imread(os.path.join(TRAIN_PATH,(names_lst[n])))\n    label_code = train_df['label'][n]\n    print(label_names[str(label_code)])\n    plt.imshow(cv2.cvtColor(test_im, cv2.COLOR_BGR2RGB))\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:49:33.605187Z","iopub.execute_input":"2021-11-25T16:49:33.605962Z","iopub.status.idle":"2021-11-25T16:49:36.726629Z","shell.execute_reply.started":"2021-11-25T16:49:33.605833Z","shell.execute_reply":"2021-11-25T16:49:36.725704Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = ImageDataGenerator(rotation_range=270, rescale=1./255, height_shift_range=0.4, width_shift_range=0.2, zoom_range=0.3, horizontal_flip=True, vertical_flip=True, validation_split=0.2)\ntest_generator = ImageDataGenerator(rotation_range=270, height_shift_range=0.1, width_shift_range=0.2, horizontal_flip=True, validation_split=0.2)","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:49:36.731028Z","iopub.execute_input":"2021-11-25T16:49:36.731392Z","iopub.status.idle":"2021-11-25T16:49:36.742549Z","shell.execute_reply.started":"2021-11-25T16:49:36.731355Z","shell.execute_reply":"2021-11-25T16:49:36.741611Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMG_SIZE = 224\ntrain_gen = ImageDataGenerator(\n                                    #featurewise_center=False,                                    \n                                    #samplewise_center=False,\n                                    #featurewise_std_normalization=False,\n                                    #samplewise_std_normalization=False, \n                                    #zca_whitening=False,\n                                    #zca_epsilon=1e-06,\n                                    rotation_range=270,\n                                    width_shift_range=0.2,\n                                    height_shift_range=0.2,\n                                    brightness_range=[0.1,0.9],\n                                    shear_range=25,\n                                    zoom_range=0.3,\n                                    channel_shift_range=0.2,\n                                    #fill_mode=\"nearest\",\n                                    #cval=0.0,\n                                    horizontal_flip=True,\n                                    vertical_flip=True,\n                                    #rescale=None,\n                                    #preprocessing_function=None,\n                                    #data_format=None,\n                                    validation_split=0.2,\n                                    #dtype=None,\n) \\\n        .flow_from_dataframe(\n                            train_df,\n                            directory = TRAIN_PATH,\n                            x_col = \"image_id\",\n                            y_col = \"label\",\n                            #weight_col = None,\n                            target_size = (IMG_SIZE, IMG_SIZE),\n                            #color_mode = \"rgb\",\n                            #classes = None,\n                            class_mode = \"categorical\",\n                            batch_size = 32,\n                            shuffle = True,\n                            #seed = 34,\n                            #save_to_dir = None,\n                            #save_prefix = \"\",\n                            #save_format = \"png\",\n                            subset = \"training\",\n                            #interpolation = \"nearest\",\n                            #validate_filenames = True\n)\n\n\n\n\nvalid_gen = ImageDataGenerator(\n                                    validation_split = 0.2\n) \\\n        .flow_from_dataframe(\n                            train_df,\n                            directory = TRAIN_PATH,\n                            x_col = \"image_id\",\n                            y_col = \"label\",\n                            target_size = (IMG_SIZE, IMG_SIZE),\n                            class_mode = \"categorical\",\n                            batch_size = 32,\n                            shuffle = True,\n                            #seed = 34,\n                            subset = \"validation\")","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:49:36.746186Z","iopub.execute_input":"2021-11-25T16:49:36.746716Z","iopub.status.idle":"2021-11-25T16:50:18.121412Z","shell.execute_reply.started":"2021-11-25T16:49:36.746677Z","shell.execute_reply":"2021-11-25T16:50:18.120489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_data = train_generator.flow_from_dataframe(train_df,TRAIN_PATH, x_col='image_id', y_col='label', target_size=(224,224), class_mode='categorical', batch_size=16,shuffle=True,subset='training')\nx_data_val = test_generator.flow_from_dataframe(train_df,TRAIN_PATH, x_col='image_id', y_col='label', target_size=(224,224), class_mode='categorical', batch_size=16, shuffle=True,subset='validation')\n","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:50:18.122716Z","iopub.execute_input":"2021-11-25T16:50:18.123065Z","iopub.status.idle":"2021-11-25T16:50:25.069688Z","shell.execute_reply.started":"2021-11-25T16:50:18.123026Z","shell.execute_reply":"2021-11-25T16:50:25.068735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.shape","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:50:25.071048Z","iopub.execute_input":"2021-11-25T16:50:25.071435Z","iopub.status.idle":"2021-11-25T16:50:25.078711Z","shell.execute_reply.started":"2021-11-25T16:50:25.071396Z","shell.execute_reply":"2021-11-25T16:50:25.077861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.layers import Layer, Conv2D,Dropout, Flatten,MaxPooling2D, MaxPool2D,UpSampling2D, Activation, add, multiply, Lambda, Dense, GlobalAveragePooling2D\nfrom tensorflow.keras.models import Model, Sequential\nimport tensorflow.keras.backend as K\nfrom tensorflow.keras.layers import Input\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:50:25.079983Z","iopub.execute_input":"2021-11-25T16:50:25.080518Z","iopub.status.idle":"2021-11-25T16:50:25.088136Z","shell.execute_reply.started":"2021-11-25T16:50:25.080481Z","shell.execute_reply":"2021-11-25T16:50:25.086980Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.applications import EfficientNetB0","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:51:40.748110Z","iopub.execute_input":"2021-11-25T16:51:40.748483Z","iopub.status.idle":"2021-11-25T16:51:40.752919Z","shell.execute_reply.started":"2021-11-25T16:51:40.748451Z","shell.execute_reply":"2021-11-25T16:51:40.751902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def AttnBlock2D(x, g, inter_channel, data_format='channels_first'):\n\n    theta_x = Conv2D(inter_channel, [1, 1], strides=[1, 1], data_format=data_format)(x)\n\n    phi_g = Conv2D(inter_channel, [1, 1], strides=[1, 1], data_format=data_format)(g)\n\n    f = Activation('relu')(add([theta_x, phi_g]))\n\n    psi_f = Conv2D(1, [1, 1], strides=[1, 1], data_format=data_format)(f)\n\n    rate = Activation('sigmoid')(psi_f)\n\n    att_x = multiply([x, rate])\n\n    return att_x\n\n\ndef attention_up_and_concate(down_layer, layer, data_format='channels_first'):\n    \n    if data_format == 'channels_first':\n        in_channel = down_layer.get_shape().as_list()[1]\n    else:\n        in_channel = down_layer.get_shape().as_list()[3]\n    \n    up = UpSampling2D(size=(2, 2), data_format=data_format)(down_layer)\n    layer = AttnBlock2D(x=layer, g=up, inter_channel=in_channel // 4, data_format=data_format)\n\n    if data_format == 'channels_first':\n        my_concat = Lambda(lambda x: K.concatenate([x[0], x[1]], axis=1))\n    else:\n        my_concat = Lambda(lambda x: K.concatenate([x[0], x[3]], axis=3))\n    \n    concate = my_concat([up, layer])\n    return concate\n\n","metadata":{"execution":{"iopub.status.busy":"2021-11-24T17:09:29.752587Z","iopub.execute_input":"2021-11-24T17:09:29.75321Z","iopub.status.idle":"2021-11-24T17:09:29.770478Z","shell.execute_reply.started":"2021-11-24T17:09:29.753168Z","shell.execute_reply":"2021-11-24T17:09:29.769777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Attention U-Net \ndef att_unet(img_w, img_h, n_label, data_format='channels_first'):\n    inputs = Input((3, img_w, img_h))\n    x = inputs\n    depth = 4\n    features = 32\n    skips = []\n    for i in range(depth):\n\n        # ENCODER\n        x = Conv2D(features, (3, 3), activation='relu', padding='same', data_format=data_format)(x)\n        x = Dropout(0.2)(x)\n        x = Conv2D(features, (3, 3), activation='relu', padding='same', data_format=data_format)(x)\n        skips.append(x)\n        x = MaxPooling2D((2, 2), data_format='channels_first')(x)\n#         x = GlobalAveragePooling2D()(x)\n        features = features * 2\n\n    # BOTTLENECK\n    x = Conv2D(features, (3, 3), activation='relu', padding='same', data_format=data_format)(x)\n    x = Dropout(0.2)(x)\n    x = Conv2D(features, (3, 3), activation='relu', padding='same', data_format=data_format)(x)\n\n    # DECODER\n    for i in reversed(range(depth)):\n        features = features // 2\n        x = attention_up_and_concate(x, skips[i], data_format=data_format)\n        x = Conv2D(features, (3, 3), activation='relu', padding='same', data_format=data_format)(x)\n        x = Dropout(0.2)(x)\n        x = Conv2D(features, (3, 3), activation='relu', padding='same', data_format=data_format)(x)\n    \n    conv6 = Conv2D(5, (1, 1), padding='same', data_format=data_format)(x)\n    conv7 = GlobalAveragePooling2D()(conv6)           #Activation('softmax')(conv6)\n    out = Dense(5, activation='softmax')(conv7)\n    \n    model = Model(inputs=inputs, outputs=out)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2021-11-24T17:09:29.772226Z","iopub.execute_input":"2021-11-24T17:09:29.772827Z","iopub.status.idle":"2021-11-24T17:09:29.789319Z","shell.execute_reply.started":"2021-11-24T17:09:29.77279Z","shell.execute_reply":"2021-11-24T17:09:29.788536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def onionModel(height, width, depth, classes):\n    model = Sequential()\n    input_shape = (height, width, depth)\n    chanDim = -1\n    #layer1\n    model.add(Conv2D(8, (5, 5), padding=\"same\",input_shape=input_shape, activation='relu'))\n    model.add(BatchNormalization(axis=chanDim))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    #layer2\n    model.add(Conv2D(16, (3, 3), padding=\"same\", activation='relu'))\n    model.add(BatchNormalization(axis=chanDim))\n    model.add(Conv2D(16, (3, 3), padding=\"same\"))\n    model.add(BatchNormalization(axis=chanDim))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.5))\n    #layer3\n    model.add(Conv2D(32, (3, 3), padding=\"same\", activation='relu'))\n    model.add(BatchNormalization(axis=chanDim))\n    model.add(Conv2D(32, (3, 3), padding=\"same\", activation='relu'))\n    model.add(BatchNormalization(axis=chanDim))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.5))\n    \n    model.add(Flatten())\n    model.add(Dense(128))\n    model.add(Activation(\"relu\"))\n    model.add(BatchNormalization())\n    model.add(Dropout(0.5))\n\n#     model.add(Flatten())\n#     model.add(Dense(128))\n#     model.add(Activation(\"relu\"))\n#     model.add(BatchNormalization())\n#     model.add(Dropout(0.5))\n\n    model.add(Dense(classes))\n    model.add(Activation(\"softmax\"))\n\n    return model\n\ndef createModel(num_classes):\n    model = Sequential()\n    model.add(Conv2D(32, (3, 3), padding='same', activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, 3)))\n    model.add(Conv2D(32, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n\n    model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))\n    model.add(Conv2D(64, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n\n    model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))\n    model.add(Conv2D(128, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n\n    model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))\n    model.add(Conv2D(256, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n\n    model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))\n    model.add(Conv2D(64, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n\n    model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))\n    model.add(Conv2D(256, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n\n#     model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))\n#     model.add(Conv2D(256, (3, 3), activation='relu'))\n#     model.add(MaxPooling2D(pool_size=(2, 2)))\n# #     model.add(Dropout(0.25))\n  \n    model.add(Flatten())\n    model.add(Dense(256, activation='relu'))\n    model.add(Dropout(0.5))\n    model.add(Dense(num_classes, activation='softmax'))\n  \n    return model","metadata":{"execution":{"iopub.status.busy":"2021-11-24T17:09:29.790656Z","iopub.execute_input":"2021-11-24T17:09:29.791186Z","iopub.status.idle":"2021-11-24T17:09:29.821773Z","shell.execute_reply.started":"2021-11-24T17:09:29.791146Z","shell.execute_reply":"2021-11-24T17:09:29.821067Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"effnet = EfficientNetB0(include_top=True, classes=5, weights=None, input_shape=(224,224,3))\neffnet.summary()","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:57:26.194082Z","iopub.execute_input":"2021-11-25T16:57:26.194470Z","iopub.status.idle":"2021-11-25T16:57:30.238721Z","shell.execute_reply.started":"2021-11-25T16:57:26.194438Z","shell.execute_reply":"2021-11-25T16:57:30.237980Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model = att_unet(224, 224, n_label=1)\n# model = createModel(5)\n# model.summary()\nmodel=effnet","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:58:12.612991Z","iopub.execute_input":"2021-11-25T16:58:12.613329Z","iopub.status.idle":"2021-11-25T16:58:12.617510Z","shell.execute_reply.started":"2021-11-25T16:58:12.613299Z","shell.execute_reply":"2021-11-25T16:58:12.616469Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"opt = Adam(lr=0.001)\nmodel.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['acc'])","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:58:13.649431Z","iopub.execute_input":"2021-11-25T16:58:13.649781Z","iopub.status.idle":"2021-11-25T16:58:13.677736Z","shell.execute_reply.started":"2021-11-25T16:58:13.649750Z","shell.execute_reply":"2021-11-25T16:58:13.676819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"LR_Reduce_callback = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=1, mode='auto')\nEarlyStop = EarlyStopping(monitor='val_loss',mode='min',verbose=1,patience=30)\nLR_Reduce_callback = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=15, verbose=1, mode='auto')\nmodel_ckpt1 = ModelCheckpoint('cassava_leaf_seg_model.h5', monitor='val_loss', save_weights_only=True,save_best_only=True, period=1)\n\nbs = 16\nmodel_ckpt2 = ModelCheckpoint('cassava_leaf_seg_model_weights.h5', monitor='val_loss', save_weights_only=False,save_best_only=True, period=1)","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:58:17.407455Z","iopub.execute_input":"2021-11-25T16:58:17.407765Z","iopub.status.idle":"2021-11-25T16:58:17.417215Z","shell.execute_reply.started":"2021-11-25T16:58:17.407735Z","shell.execute_reply":"2021-11-25T16:58:17.416251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit_generator(train_gen,steps_per_epoch=(train_df.shape[0]//bs), validation_data=valid_gen, \n                             epochs=100, callbacks = [model_ckpt1,model_ckpt2,EarlyStop,LR_Reduce_callback])","metadata":{"execution":{"iopub.status.busy":"2021-11-25T16:58:19.748600Z","iopub.execute_input":"2021-11-25T16:58:19.749072Z","iopub.status.idle":"2021-11-25T17:07:25.945869Z","shell.execute_reply.started":"2021-11-25T16:58:19.749027Z","shell.execute_reply":"2021-11-25T17:07:25.945088Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}