{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":6243,"databundleVersionId":868544,"sourceType":"competition"}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport glob\nimport PIL\nfrom PIL import ImageFilter, ImageStat, Image, ImageDraw\nfrom multiprocessing import Pool, cpu_count\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport cv2\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.layers import Activation, BatchNormalization, Conv2D, Dense, Dropout, Flatten, MaxPooling2D\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.optimizers import Adam\nfrom keras.callbacks import EarlyStopping, ReduceLROnPlateau,ModelCheckpoint \nfrom sklearn.metrics import accuracy_score, confusion_matrix, classification_report","metadata":{"execution":{"iopub.status.busy":"2024-05-21T11:48:29.097885Z","iopub.execute_input":"2024-05-21T11:48:29.098177Z","iopub.status.idle":"2024-05-21T11:48:42.118991Z","shell.execute_reply.started":"2024-05-21T11:48:29.098151Z","shell.execute_reply":"2024-05-21T11:48:42.118199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = glob.glob('../input/intel-mobileodt-cervical-cancer-screening/train/**/*.jpg') + glob.glob('../input/intel-mobileodt-cervical-cancer-screening/additional_Type_1_v2/**/*.jpg')+glob.glob('../input/intel-mobileodt-cervical-cancer-screening/additional_Type_2_v2/**/*.jpg')+glob.glob('../input/intel-mobileodt-cervical-cancer-screening/additional_Type_3_v2/**/*.jpg')\ntrain = pd.DataFrame([[p.split('/')[3],p.split('/')[4],p] for p in train], columns = ['type','image','path'])\n","metadata":{"execution":{"iopub.status.busy":"2024-05-21T11:48:42.120422Z","iopub.execute_input":"2024-05-21T11:48:42.120938Z","iopub.status.idle":"2024-05-21T11:48:43.615016Z","shell.execute_reply.started":"2024-05-21T11:48:42.120911Z","shell.execute_reply":"2024-05-21T11:48:43.614244Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# /kaggle/input/intel-mobileodt-cervical-cancer-screening","metadata":{"execution":{"iopub.status.busy":"2024-05-21T11:48:43.616094Z","iopub.execute_input":"2024-05-21T11:48:43.616378Z","iopub.status.idle":"2024-05-21T11:48:43.6203Z","shell.execute_reply.started":"2024-05-21T11:48:43.616354Z","shell.execute_reply":"2024-05-21T11:48:43.619427Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = glob.glob('../input/intel-mobileodt-cervical-cancer-screening/test/*.jpg')\ntest = pd.DataFrame([[p.split('/')[3],p] for p in test], columns = ['image','path'])","metadata":{"execution":{"iopub.status.busy":"2024-05-21T11:48:43.622811Z","iopub.execute_input":"2024-05-21T11:48:43.623228Z","iopub.status.idle":"2024-05-21T11:48:43.653297Z","shell.execute_reply.started":"2024-05-21T11:48:43.623197Z","shell.execute_reply":"2024-05-21T11:48:43.652593Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def im_multi(path):\n    try:\n        im_stats_im_ = Image.open(path)\n        return [path, {'size': im_stats_im_.size}]\n    except:\n        print(path)\n        return [path, {'size': [0,0]}]\n\ndef im_stats(im_stats_df):\n    im_stats_d = {}\n    p = Pool(cpu_count())\n    ret = p.map(im_multi, im_stats_df['path'])\n    for i in range(len(ret)):\n        im_stats_d[ret[i][0]] =ret[i][1]#{'size': ret[i][1].shape[:2]} \n    im_stats_df['size'] = im_stats_df['path'].map(lambda x: ' '.join(str(s) for s in im_stats_d[x]['size']))\n    return im_stats_df\n\ndef get_im_cv2(path):\n    img = cv2.imread(path)\n    resized = cv2.resize(img, (150,150), cv2.INTER_LINEAR) \n    resized = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    return [path, resized]\n\ndef normalize_image_features(paths):\n    imf_d = {}\n    p = Pool(cpu_count())\n    ret = p.map(get_im_cv2, paths)\n    for i in range(len(ret)):\n        imf_d[ret[i][0]] = ret[i][1]\n    fdata = [imf_d[f] for f in paths]\n    fdata = np.array(fdata, dtype=np.uint8)\n#     fdata = fdata.transpose((0, 3, 1, 2))\n    fdata = fdata.transpose(0,2,3,1)\n    fdata = fdata.astype('float32')\n    fdata = fdata / 255\n    return fdata\n# def load_and_normalize_images(df):\n#       features = []\n#       for idx, row in df.iterrows():  # Iterate through DataFrame rows\n#             path = row['path']  # Assuming 'path' is the image path column\n#             img = cv2.imread(path)\n#             if img is None:\n#               print(f\"Error reading image: {path}\")\n#               continue  # Skip to next image on error\n\n#             resized_img = cv2.resize(img, (120, 120), cv2.INTER_LINEAR)  # Resize to 120x120\n#             normalized_img = resized_img.astype('float32') / 255  # Normalize to 0-1 range\n\n#             features.append(normalized_img)\n\n#       return np.array(features)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-21T11:48:43.654267Z","iopub.execute_input":"2024-05-21T11:48:43.654535Z","iopub.status.idle":"2024-05-21T11:48:43.665966Z","shell.execute_reply.started":"2024-05-21T11:48:43.654513Z","shell.execute_reply":"2024-05-21T11:48:43.66498Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_data = load_and_normalize_images(train)\n# np.save('train.npy', train_data, allow_pickle=True, fix_imports=True)","metadata":{"execution":{"iopub.status.busy":"2024-05-21T11:48:43.667066Z","iopub.execute_input":"2024-05-21T11:48:43.667396Z","iopub.status.idle":"2024-05-21T11:48:43.679473Z","shell.execute_reply.started":"2024-05-21T11:48:43.667366Z","shell.execute_reply":"2024-05-21T11:48:43.678626Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = im_stats(train)\ntrain = train[train['size'] != '0 0'].reset_index(drop=True) #remove bad images\ntrain_data = normalize_image_features(train['path'])\nnp.save('train.npy', train_data, allow_pickle=True, fix_imports=True)","metadata":{"execution":{"iopub.status.busy":"2024-05-21T11:48:43.680517Z","iopub.execute_input":"2024-05-21T11:48:43.680799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"le = LabelEncoder()\ntrain_target = le.fit_transform(train['type'].values)\nprint(le.classes_) #in case not 1 to 3 order\nnp.save('train_target.npy', train_target, allow_pickle=True, fix_imports=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = glob.glob('../input/test/*.jpg')\ntest = pd.DataFrame([[p.split('/')[3],p] for p in test], columns = ['image','path']) #[::20] #limit for Kaggle Demo\ntest_data = load_and_normalize_images(test)\nnp.save('test.npy', test_data, allow_pickle=True, fix_imports=True)\n\ntest_id = test.image.values\nnp.save('test_id.npy', test_id, allow_pickle=True, fix_imports=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.random.seed(17)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = np.load('train.npy')\ntrain_target = np.load('train_target.npy')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train,x_val,y_train,y_val = train_test_split(train_data,train_target,test_size=0.4, random_state=17)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(x_train), len(y_train))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(#rescale=1.0/255,\n                                  zoom_range=0.3,\n                                rotation_range = 0.3,\n                                   horizontal_flip=True,\n                                   vertical_flip=True,\n                                  width_shift_range=0.2,\n                                  height_shift_range=0.2)\nval_datagen = ImageDataGenerator()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# apply data augmentation to features\nBATCH_SIZE= 32\ntrain_gen = train_datagen.flow(x_train, y_train, batch_size= BATCH_SIZE)\nval_gen = val_datagen.flow(x_val, y_val, batch_size= BATCH_SIZE)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit_generator(datagen.flow(x_train,y_train, batch_size=15, shuffle=True), nb_epoch=1, samples_per_epoch=len(x_train), verbose=20, validation_data=(x_val_train, y_val_train))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from keras.applications.resnet50 import ResNet50\n\n# # Specify channel order as 'bgr'\n# resnet_model = ResNet50(weights='imagenet', include_top=False, input_shape=(64, 64, 3), channels_last=False)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resnet_model = Sequential()\npretrained_model = tf.keras.applications.ResNet50(\n    include_top = False,\n    input_shape = (64,64,3),\n    pooling = 'avg',\n    classes = 3,\n    weights='imagenet'\n)\nfor layer in pretrained_model.layers:\n    layer.trainable = False\n\nresnet_model.add(pretrained_model)\nresnet_model.add(Flatten())\nresnet_model.add(Dense(512,activation='relu'))\nresnet_model.add(Dense(3,activation='softmax'))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resnet_model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resnet_model.compile(optimizer=Adam(0.0001),loss='categorical_crossentropy',\n                    metrics=['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"reduceLR = ReduceLROnPlateau(monitor='val_loss',\n                             patience=10,\n                             verbose= 1,\n                             mode='min',\n                             factor=  0.2,\n                             min_lr = 1e-5)\n\nearly_stopping = EarlyStopping(monitor='val_accuracy',\n                               patience = 10,\n                               verbose=1,\n                               mode='max',\n                               restore_best_weights= True)\n# checkpoint = ModelCheckpoint('/kaggle/working/cervicalModel_weights.weights.h5', monitor='val_accuracy', verbose=1, save_best_only=False, mode='max', save_weights_only=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = resnet_model.fit(train_gen,\n                          validation_data=val_gen,\n                          epochs=10,\n                          callbacks= [reduceLR]\n                          )","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_df = pd.DataFrame(history.history)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resnet_model.load_weights('cervicalModel.weights.hdf5')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resnet_model.save('cancer_screen_model.h5')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model.evaluate(test_gen)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# base_dir = '../input/intel-mobileodt-cervical-cancer-screening'\n# train_dir = os.path.join(base_dir,'train','train')\n# train_files = {'Type_1': [], 'Type_2': [], 'Type_3': []}\n\n# train_subdirs = ['Type_1','Type_2','Type_3']\n# add_train_subdirs = ['additional_Type_1_v2/Type_1', \n#                  'additional_Type_2_v2/Type_2', 'additional_Type_3_v2/Type_3']\n\n# for subdir in train_subdirs:\n#   image_dir = os.path.join(train_dir, subdir) \n#   type_name = subdir \n#   train_files[type_name] += glob.glob(image_dir + '/*.jpg') \n# for subdir in add_train_subdirs:\n#   image_dir = os.path.join(base_dir,subdir) \n#   type_name = subdir.split(\"/\")[-1] \n#   train_files[type_name] += glob.glob(image_dir + '/*.jpg')\n\n# print(f\"Total Type 1 images for training: {len(train_files['Type_1'])}\\nTotal Type 2 images for training: {len(train_files['Type_2'])}\\nTotal Type 3 images for training: {len(train_files['Type_3'])}\" )","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# data = [{'Label':label,'ImagePath':path} for label,paths in train_files.items() for path in paths]\n# df = pd.DataFrame(data).reset_index(drop=True)\n# df.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# bad_files = []\n# for path in (df['filepath'].values):\n#     try:\n#         img = Image.open(path)\n#     except:\n#         index = df[df['filepath']==path].index.values[0]\n#         bad_files.append(index)\n# print(len(bad_files))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df.drop(bad_files, inplace=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# type_count = pd.DataFrame(df['label'].value_counts()).rename(columns= {'label': 'Num_Values'})\n# type_count","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.figure(figsize = (15, 6))\n# sns.barplot(x= type_count['Num_Values'], y= type_count.index.to_list())\n# plt.title('Cervical Cancer Type Distribution')\n# plt.grid(True)\n# plt.show()\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def is_image_valid(image_path, df):\n#     try:\n#         Image.open(image_path).verify()\n#         return True  \n#     except (IOError, OSError):\n#         return df.index[df['ImagePath'] == image_path].tolist()[0]\n#         print(f\"Corrupted image: {image_path}\")\n# def is_image_valid(image_path, df):\n#     try:\n#         img = cv2.imread(image_path)\n#         if img is not None:\n#             return True  # Keep the row index if valid\n#         else:\n#             raise Exception(\"Corrupted image\")  # Raise exception for corrupted images\n\n#     except (IOError, OSError, Exception) as e:\n#         # Handle various exceptions:\n#         print(f\"Error opening image {image_path}: {e}\")\n#         return df.index[df['ImagePath'] == image_path].tolist()[0] ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# THIS THE ONE\n# def verify_and_clean_images(df, image_column):\n#     valid_indices = []\n\n#     for idx, path in enumerate(df[image_column].values):\n#         try:\n#             with Image.open(path) as img:\n#                 img.verify()  # Verify that it is an image\n#                 img.close()   # Close the image file\n#             valid_indices.append(idx)\n#         except (IOError, SyntaxError, OSError) as e:\n#             print(f\"Corrupted image file: {path}, error: {e}\")\n\n#     # Create a new dataframe with only valid indices\n#     valid_df = df.iloc[valid_indices].reset_index(drop=True)\n#     return valid_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_valid = verify_and_clean_images(df, 'ImagePath')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_valid.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_valid = df[df['ImagePath'].apply(lambda path: is_image_valid(path, df.copy()) is True)]\n# df_valid.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from sklearn.preprocessing import LabelEncoder\n# label_encoder = LabelEncoder()\n# df_valid['Label'] = label_encoder.fit_transform(df_valid['Label'])\n# label_mapping = dict(zip(label_encoder.classes_, label_encoder.transform(label_encoder.classes_)))\n# print(label_mapping)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_valid['Label'].shape\n# df_valid['Label'].dtype","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_valid['ImagePath'][0]\n# df_valid['Label'].astype(str)\n# df_valid['Label'].dtypes","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_valid1 = verify_and_clean_images(df_valid, 'ImagePath')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_valid1.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_df, val_df = train_test_split(df_valid, test_size=0.2, stratify=df_valid['Label'], random_state=4)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# print(len(train_df), len(val_df))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# IMG_WIDTH = 180\n# IMG_HEIGHT = 180\n# BATCH_SIZE = 32","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_datagen = ImageDataGenerator(rescale=1.0/255,\n#                                   zoom_range=0.2,\n#                                 rotation_range = 40,\n#                                    horizontal_flip=True,\n#                                    vertical_flip=True,\n#                                   width_shift_range=0.2,\n#                                   height_shift_range=0.2)\n# train_generator = train_datagen.flow_from_dataframe(\n#     dataframe=train_df,\n#     x_col='ImagePath',\n#     y_col='Label',\n#     target_size=(IMG_WIDTH, IMG_HEIGHT),\n#     batch_size=BATCH_SIZE,\n#     class_mode='categorical',\n#     shuffle=True\n# )","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_generator","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# validation_datagen = ImageDataGenerator(rescale=1.0/255)\n# validation_generator = validation_datagen.flow_from_dataframe(dataframe= val_df,\n#                                                              target_size=(IMG_WIDTH, IMG_HEIGHT),\n#                                                               x_col='ImagePath',\n#                                                               y_col='Label',\n#                                                              batch_size=BATCH_SIZE,\n#                                                              class_mode='categorical',\n#                                                              shuffle=True)\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#The labels dictionary is made in order to retrive the class names against the label indices used for training the model\n\n# labels = {value: key for key, value in train_generator.class_indices.items()}\n\n# print(\"Label Mappings for classes present in the training and validation datasets\\n\")\n# for key, value in labels.items():\n#     print(f\"{key} : {value}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# label_count = df['Label'].value_counts()\n# plt.figure(figsize=(10,6))\n# label_count.plot(kind='bar')\n# plt.xticks(rotation=0)\n# plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# resnet_model = Sequential()\n# pretrained_model = tf.keras.applications.ResNet50(\n#     include_top = False,\n#     input_shape = (IMG_WIDTH,IMG_HEIGHT,3),\n#     pooling = 'avg',\n#     classes = 3,\n#     weights='imagenet'\n# )\n# for layer in pretrained_model.layers:\n#     layer.trainable = False\n\n# resnet_model.add(pretrained_model)\n# resnet_model.add(Flatten())\n# resnet_model.add(Dense(512,activation='relu'))\n# resnet_model.add(Dense(3,activation='softmax'))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# resnet_model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# resnet_model.compile(optimizer=Adam(0.001),loss='categorical_crossentropy',\n#                     metrics=['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# reduceLR = ReduceLROnPlateau(monitor='val_loss',\n#                              patience=10,\n#                              verbose= 1,\n#                              mode='min',\n#                              factor=  0.2,\n#                              min_lr = 1e-5)\n\n# early_stopping = EarlyStopping(monitor='val_accuracy',\n#                                patience = 10,\n#                                verbose=1,\n#                                mode='max',\n#                                restore_best_weights= True)\n# checkpoint = ModelCheckpoint('/kaggle/working/cervicalModel_weights.weights.h5', monitor='val_accuracy', verbose=1, save_best_only=False, mode='max', save_weights_only=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from PIL import ImageFile","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ImageFile.LOAD_TRUNCATED_IMAGES = True","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history = resnet_model.fit(train_generator,\n#                           validation_data=validation_generator,\n#                           epochs=10,\n#                           callbacks= [reduceLR]\n#                           )\n# history = model.fit(train_generator,\n#                     steps_per_epoch= TRAIN_STEPS,\n#                     validation_data=val_generator,\n#                     validation_steps=VAL_STEPS,\n#                     epochs= 100,\n#                    callbacks= [checkpoint,reduceLR])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#modelSaved = keras.models.load_model('./inception.hdf5') ","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}