{"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 pydicom\nimport torch\n\nimport pandas as pd\nimport numpy as np\n# import seaborn as sns\nimport os\nimport glob\n\n\nimport matplotlib.pyplot as plt\n# from skimage.io import imsave\nfrom PIL import Image\nfrom tqdm.notebook import tqdm\n# from skimage.transform import resize\nfrom glob import glob\nimport cv2\n\n#preprocessing\nimport torchvision\nfrom torchvision import transforms, datasets\nfrom torch.utils.data import Dataset, DataLoader\nfrom torch.utils.data.sampler import SubsetRandomSampler\nfrom skimage import io, transform\n\n#network architecture\nimport torchvision\nfrom torchvision import models\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:16.412339Z","iopub.execute_input":"2023-03-22T12:13:16.412824Z","iopub.status.idle":"2023-03-22T12:13:20.491226Z","shell.execute_reply.started":"2023-03-22T12:13:16.412769Z","shell.execute_reply":"2023-03-22T12:13:20.490107Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"d_train = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/train.csv')\nprint(\"\\n\\nTrain Dataframe\\n\\n\")\ndisplay(d_train)\n\nd_test = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/test.csv')\nprint(\"\\n\\nTest Dataframe\\n\\n\")\ndisplay(d_test)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.493489Z","iopub.execute_input":"2023-03-22T12:13:20.494064Z","iopub.status.idle":"2023-03-22T12:13:20.656299Z","shell.execute_reply.started":"2023-03-22T12:13:20.494021Z","shell.execute_reply":"2023-03-22T12:13:20.65522Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### **View Image**","metadata":{}},{"cell_type":"code","source":"# # specify your image path\n# image_path = '/kaggle/input/rsna-breast-cancer-detection/train_images/10006/1874946579.dcm'\n# ds_1 = pydicom.dcmread(image_path)\n\n# plt.imshow(ds_1.pixel_array, cmap=plt.cm.bone)\n# ds_1","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:37.869707Z","iopub.execute_input":"2023-03-22T12:13:37.870493Z","iopub.status.idle":"2023-03-22T12:13:37.875351Z","shell.execute_reply.started":"2023-03-22T12:13:37.87045Z","shell.execute_reply":"2023-03-22T12:13:37.874112Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### **Metadata**","metadata":{}},{"cell_type":"code","source":"# # Better to load with pydicom.dcmread vs. deprecated pydicom.filereader.dcmread\n# ds_2 = pydicom.filereader.dcmread('/kaggle/input/rsna-breast-cancer-detection/train_images/10006/1459541791.dcm')\n# print(ds_1==ds_2)\n# print(ds_2)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:44.052823Z","iopub.execute_input":"2023-03-22T12:13:44.053226Z","iopub.status.idle":"2023-03-22T12:13:44.057453Z","shell.execute_reply.started":"2023-03-22T12:13:44.053187Z","shell.execute_reply":"2023-03-22T12:13:44.056321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Good os functions\n#   - os.path.join\n#   - os.listdir\n# Basic directories\nINPUT_DIR = os.path.join(\"/\", \"kaggle\", \"input\")\nCOMP_DIR = os.path.join(INPUT_DIR,\"rsna-breast-cancer-detection\")\n\n# Image directories\nTRAIN_IMG_DIR = os.path.join(COMP_DIR, \"train_images\")\nTEST_IMG_DIR = os.path.join(COMP_DIR, \"test_images\")\n\n# Csv paths\nTRAIN_CSV_PATH = os.path.join(COMP_DIR, \"train.csv\")\nTEST_CSV_PATH = os.path.join(COMP_DIR, \"test.csv\")\nSS_CSV_PATH = os.path.join(COMP_DIR, \"sample_submission.csv\")\n\n# Get all DCM information\nALL_TRAIN_DCM_FILES = glob(os.path.join(TRAIN_IMG_DIR, \"**\", \"*.dcm\"))\nALL_TEST_DCM_FILES = glob(os.path.join(TEST_IMG_DIR, \"**\", \"*.dcm\"))\n\n# Patient IDs\nTRAIN_PATIENT_IDS = [os.path.join(TRAIN_IMG_DIR, patient_id) for patient_id in sorted(os.listdir(TRAIN_IMG_DIR))]\nTEST_PATIENT_IDS = [os.path.join(TEST_IMG_DIR, patient_id) for patient_id in sorted(os.listdir(TEST_IMG_DIR))]\n\ndisplay(d_train)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:55.418642Z","iopub.execute_input":"2023-03-22T12:13:55.419378Z","iopub.status.idle":"2023-03-22T12:14:52.260652Z","shell.execute_reply.started":"2023-03-22T12:13:55.419338Z","shell.execute_reply":"2023-03-22T12:14:52.25959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def get_dcm_path(_row, root_img_dir):\n#     # fstring string conversion could also work\n#     return os.path.join(root_img_dir, str(_row[\"patient_id\"]), str(_row[\"image_id\"])+\".dcm\")\n# x = [12,5,2,4]\n# list(map(lambda a: a**2, x))\n\nd_train[\"dcm_path\"] = d_train.apply(\n    lambda _row: os.path.join(TRAIN_IMG_DIR, str(_row[\"patient_id\"]), str(_row[\"image_id\"])+\".dcm\"), \n    axis=1)\ndisplay(d_train)\n\nd_test[\"dcm_path\"] = d_test.apply(\n    lambda _row: os.path.join(TEST_IMG_DIR, str(_row[\"patient_id\"]), str(_row[\"image_id\"])+\".dcm\"), \n    axis=1)\ndisplay(d_test)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.865064Z","iopub.status.idle":"2023-03-22T12:13:20.865669Z","shell.execute_reply.started":"2023-03-22T12:13:20.865316Z","shell.execute_reply":"2023-03-22T12:13:20.865342Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def resize_and_rescale_dcm(dcm_path, output_dir=\"/kaggle/working/output\", data_split=\"train_images\", do_invert=True, resize_to=(512,512), interpolation=cv2.INTER_LINEAR, return_img=True):\n    \n#     uint16_max = 65536\n    \n#     # Step 0 - Update output directory\n#     output_dir = os.path.join(output_dir, data_split) # --> ['/kaggle/working/output/train_images' | '/kaggle/working/output/test_images']\n    \n#     # Step 1 - Create output directory if not already created\n#     if not os.path.isdir(output_dir): \n#         os.makedirs(output_dir, exist_ok=True)\n    \n#     # Step 2 - Read the dicom object\n#     dcm_data = pydicom.dcmread(dcm_path)\n#     dcm_pi = dcm_data.PhotometricInterpretation\n\n#     # Step 3 - Get the image data\n#     dcm_image = dcm_data.pixel_array\n    \n#     # Step 4 [optional] - Invert the image\n#     if do_invert and dcm_pi==\"MONOCHROME1\": \n#         dcm_image = np.invert(dcm_image)\n    \n#     # Step 5 - Resize Image\n#     dcm_image = cv2.resize(dcm_image, resize_to, interpolation=interpolation)\n    \n#     # Step 6 - Normalize image data to be between 0 and 1 (and float32)\n#     if dcm_image.dtype=='uint16':\n#         dcm_image = dcm_image/uint16_max\n    \n#     # Step 7 - Save the image to file (output_dir)\n#     file_name = \"_\".join(dcm_path[:-4].rsplit(\"/\", 2)[-2:])+\".png\"\n#     cv2.imwrite(filename=os.path.join(output_dir, file_name), img=dcm_image)\n    \n#     # Step 8 - Return if desired\n#     if return_img:\n#         return dcm_image\n    \n# # plt.imshow(d_train[\"dcm_path\"][2222]).pixel_array, cmap=plt.cm.bone)\n# demo_dcm = d_train.dcm_path[110]\n\n# print(demo_dcm)\n# _img = resize_and_rescale_dcm(demo_dcm)\n\n# plt.figure(figsize=(10,10))\n# plt.imshow(_img, cmap=\"gray\")\n# plt.title(f\"{_img.shape}\")\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.867931Z","iopub.status.idle":"2023-03-22T12:13:20.868965Z","shell.execute_reply.started":"2023-03-22T12:13:20.868715Z","shell.execute_reply":"2023-03-22T12:13:20.868742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls ./output/train_images","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.870179Z","iopub.status.idle":"2023-03-22T12:13:20.871084Z","shell.execute_reply.started":"2023-03-22T12:13:20.8708Z","shell.execute_reply":"2023-03-22T12:13:20.870828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Option 1 -- [0,255] --> uint8 representation (black=0, gray=128, white=255)\n# Option 2 -- [0,1] --> float32 representation (black=0, gray=0.5, white=1)\n\n# Option 3 -- [0,65536] --> uint16 representation (black=0, gray=0.5, white=1)\n\n# Go from one option to another you can do min-max-normalization","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.872597Z","iopub.status.idle":"2023-03-22T12:13:20.873465Z","shell.execute_reply.started":"2023-03-22T12:13:20.873211Z","shell.execute_reply":"2023-03-22T12:13:20.873238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **EDA** \n***use plotly***","metadata":{}},{"cell_type":"markdown","source":"# **Preprocessing**","metadata":{}},{"cell_type":"code","source":"image = io.imread('/kaggle/input/rsna-mammography-images-as-pngs/images_as_pngs/train_images_processed/10006/1459541791.png')\nchannels = image.shape[-1] if image.ndim == 3 else 1\nprint(channels)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.874893Z","iopub.status.idle":"2023-03-22T12:13:20.875763Z","shell.execute_reply.started":"2023-03-22T12:13:20.875499Z","shell.execute_reply":"2023-03-22T12:13:20.875526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import plotly.express as px\nclass_cancer = d_train['cancer'].value_counts()[1]\nclass_no_cancer = d_train['cancer'].value_counts()[0]\n\nfig = px.bar(d_train, x=[\"cancer\", \"no cancer\"], y=[class_cancer,class_no_cancer], color=[\"Cancer\", \"No cancer\"],\n    labels=dict(x=\"Diagnosis\", y=\"Number of patients\", color=\"Key\")\n)\nfig.show()\n\n\n","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.877217Z","iopub.status.idle":"2023-03-22T12:13:20.878059Z","shell.execute_reply.started":"2023-03-22T12:13:20.877788Z","shell.execute_reply":"2023-03-22T12:13:20.877814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"imageFilesDir = '/kaggle/input/rsna-mammography-images-as-pngs/images_as_pngs/train_images_processed'\nfiles = list(glob(os.path.join(imageFilesDir, \"**\", \"*.png\")))","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.879586Z","iopub.status.idle":"2023-03-22T12:13:20.881744Z","shell.execute_reply.started":"2023-03-22T12:13:20.881466Z","shell.execute_reply":"2023-03-22T12:13:20.881494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\n\ndef tf_open_img(img_path, n_channels=3, resize_to=None):\n    \n    # Load the raw data from the file\n    img = tf.io.read_file(img_path)\n    \n    # Decode the PNG image to a uint8 tensor\n    img = tf.image.decode_png(img, channels=n_channels)\n    \n    # Resize the image to 224x224\n    if resize_to is not None:\n        img = tf.image.resize(img, size=(resize_to, resize_to))\n    \n    # Convert the pixel values to float between 0 and 1\n    img = tf.cast(img, tf.float32) / 255.0\n    \n    return img\n\nplt.imshow(tf_open_img(files[0], resize_to=224))","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.883417Z","iopub.status.idle":"2023-03-22T12:13:20.883907Z","shell.execute_reply.started":"2023-03-22T12:13:20.883659Z","shell.execute_reply":"2023-03-22T12:13:20.883684Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# number of subprocesses to use for data loading\nnum_workers = 0\n\n# how many samples per batch to load\nbatch_size = 32 # [1,2,4,8,16,32,64,128,256] \n\n# percentage of training set to use as validation\nvalid_size = 0.2","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.885956Z","iopub.status.idle":"2023-03-22T12:13:20.887056Z","shell.execute_reply.started":"2023-03-22T12:13:20.886794Z","shell.execute_reply":"2023-03-22T12:13:20.88682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **Visualize a Batch of Training Data**","metadata":{}},{"cell_type":"code","source":"# Define classes\nclasses   = ['no_cancer', 'cancer']\nclass_s2i = {k:i for i,k in enumerate(classes)} # cancer --> 1\nclass_i2s = {i:k for i,k in enumerate(classes)} # 0 --> no_cancer\nencoder = lambda x: class_s2i.get(x)\ndecoder = lambda x: class_i2s.get(x)\n\n# train/val split\nnum_train = len(files)\n\nindices = list(range(num_train))\nnp.random.shuffle(indices)\n\nsplit = int(valid_size * num_train)\ntrain_idx, valid_idx     = np.array(indices[split:]), np.array(indices[:split])\ntrain_files, valid_files = np.array(files)[train_idx], np.array(files)[valid_idx]\n(len(train_files), len(valid_files))\n\nprint(train_files)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.888344Z","iopub.status.idle":"2023-03-22T12:13:20.889276Z","shell.execute_reply.started":"2023-03-22T12:13:20.888998Z","shell.execute_reply":"2023-03-22T12:13:20.889033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get map from img_id to cancer\ntrain_img_id_to_cancer = d_train.groupby(\"image_id\")[\"cancer\"].first().to_dict()\n\ntrain_y = np.array([\n    train_img_id_to_cancer[int(f_path.rsplit(\"/\", 1)[-1][:-4])]\n    for f_path in train_files\n])\nvalid_y = np.array([\n    train_img_id_to_cancer[int(f_path.rsplit(\"/\", 1)[-1][:-4])]\n    for f_path in valid_files\n])\n\ntrain_y.shape, valid_y.shape\ntrain_y","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.890713Z","iopub.status.idle":"2023-03-22T12:13:20.891751Z","shell.execute_reply.started":"2023-03-22T12:13:20.891455Z","shell.execute_reply":"2023-03-22T12:13:20.891522Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"demo_idx = 5\n\ndef plot_example(f_path, lbl, _figsize=(12,12)):\n    img = tf_open_img(f_path)\n    lbl_str = decoder(lbl)\n    \n    plt.figure(figsize=(_figsize))\n    plt.title(f\"Label: {lbl_str}\", fontweight=\"bold\")\n    plt.imshow(img)\n    plt.axis(False)\n    plt.show()\n    \n\nplot_example(train_files[demo_idx], train_y[demo_idx], (10,10))","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.893707Z","iopub.status.idle":"2023-03-22T12:13:20.89421Z","shell.execute_reply.started":"2023-03-22T12:13:20.893946Z","shell.execute_reply":"2023-03-22T12:13:20.893971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def batch_data_generator(file_arr, lbl_arr, batch_size=8, load_images=True):\n    n_ex = file_arr.shape[0]\n    for i in range(0, n_ex, batch_size):\n        x_batch = file_arr[i:i+batch_size]\n        y_batch  = lbl_arr[i:i+batch_size]\n        if load_images:\n            x_batch = np.stack([tf_open_img(f_path) for f_path in x_batch], axis=0)\n        \n        yield x_batch, y_batch\n        \ntrain_generator = batch_data_generator(train_files, train_y)\nvalid_generator = batch_data_generator(valid_files, valid_y)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.896235Z","iopub.status.idle":"2023-03-22T12:13:20.896727Z","shell.execute_reply.started":"2023-03-22T12:13:20.896467Z","shell.execute_reply":"2023-03-22T12:13:20.896492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for i, (a,b) in enumerate(zip([\"a\",\"b\",\"c\"], [1,2,3])):\n#     print(i,a,b)\n\n\ndef plot_batch_of_examples(xs, ys, fig_width=20, n_cols=4, row_height=6):\n    assert len(xs.shape)==4\n    b,w,h,c = xs.shape\n    \n    n_rows     = int(np.ceil(b/n_cols))\n    fig_height = n_rows*row_height\n    \n    # Starting Point\n    plt.figure(figsize=(fig_width, fig_height))\n    \n    for i, (img, lbl) in enumerate(zip(xs,ys)):\n        plt.subplot(n_rows, n_cols, i+1)\n        plt.title(f\"Label: {decoder(lbl)} ({lbl})\", fontweight=\"bold\")\n        plt.imshow(img)\n        plt.axis(False)\n    \n    # Ending Point\n    plt.tight_layout()\n    plt.show()\n    \nx,y = next(train_generator)\nplot_batch_of_examples(x,y)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.898703Z","iopub.status.idle":"2023-03-22T12:13:20.899198Z","shell.execute_reply.started":"2023-03-22T12:13:20.898936Z","shell.execute_reply":"2023-03-22T12:13:20.898961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **Define Network Architecture**","metadata":{}},{"cell_type":"code","source":"#define hyperparameters\nnum_epochs = 10\nbatch_size = 8\nlearning_rate = 0.1","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.901233Z","iopub.status.idle":"2023-03-22T12:13:20.901728Z","shell.execute_reply.started":"2023-03-22T12:13:20.901469Z","shell.execute_reply":"2023-03-22T12:13:20.901494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resnet50 = tf.keras.applications.ResNet50(include_top=False, pooling=\"avg\")\nresnet50.summary()","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.903883Z","iopub.status.idle":"2023-03-22T12:13:20.904385Z","shell.execute_reply.started":"2023-03-22T12:13:20.904121Z","shell.execute_reply":"2023-03-22T12:13:20.904165Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model(bb, dropout):\n    _inputs = bb.inputs\n    x = bb(_inputs)\n    x = tf.keras.layers.Dropout(dropout)(x)\n    _outputs = tf.keras.layers.Dense(1, activation=\"sigmoid\")(x)\n    return tf.keras.Model(inputs=_inputs, outputs=_outputs)\n\nresnet50.trainable=False\nmodel = get_model(resnet50, 0.2)\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.906371Z","iopub.status.idle":"2023-03-22T12:13:20.906861Z","shell.execute_reply.started":"2023-03-22T12:13:20.906613Z","shell.execute_reply":"2023-03-22T12:13:20.906639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_ds = tf.data.Dataset.from_tensor_slices((train_files, train_y))\\\n                          .map(lambda x,y: (tf_open_img(x), y))\\\n                          .batch(8)\\\n                          .shuffle(64)\\\n                          .prefetch(tf.data.AUTOTUNE)\nvalid_ds = tf.data.Dataset.from_tensor_slices((valid_files, valid_y))\\\n                          .map(lambda x,y: (tf_open_img(x), y))\\\n                          .batch(8)\\\n                          .prefetch(tf.data.AUTOTUNE)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.908855Z","iopub.status.idle":"2023-03-22T12:13:20.909353Z","shell.execute_reply.started":"2023-03-22T12:13:20.909092Z","shell.execute_reply":"2023-03-22T12:13:20.909119Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **Train Model**","metadata":{}},{"cell_type":"code","source":"from sklearn.utils import class_weight\n\nclass_weights = class_weight.compute_class_weight('balanced', classes = np.unique(train_y), \n                                                  y = train_y)\nclass_weights_dict = dict(enumerate(class_weights))","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.911316Z","iopub.status.idle":"2023-03-22T12:13:20.911807Z","shell.execute_reply.started":"2023-03-22T12:13:20.911556Z","shell.execute_reply":"2023-03-22T12:13:20.911584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer=\"adam\", loss=\"binary_crossentropy\", metrics = 'accuracy')\nmodel.fit(train_ds, validation_data=valid_ds, epochs=10, class_weight = class_weights_dict)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.913697Z","iopub.status.idle":"2023-03-22T12:13:20.914214Z","shell.execute_reply.started":"2023-03-22T12:13:20.913932Z","shell.execute_reply":"2023-03-22T12:13:20.91396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save(\"my model\")","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.916288Z","iopub.status.idle":"2023-03-22T12:13:20.916785Z","shell.execute_reply.started":"2023-03-22T12:13:20.916531Z","shell.execute_reply":"2023-03-22T12:13:20.916558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"my_model = tf.keras.models.load_model(\"my model\")","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.918813Z","iopub.status.idle":"2023-03-22T12:13:20.919319Z","shell.execute_reply.started":"2023-03-22T12:13:20.919046Z","shell.execute_reply":"2023-03-22T12:13:20.919073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **Test Model**","metadata":{}},{"cell_type":"code","source":"def test_model(model, x_val):\n    loss, accuracy = model.evaluate(x_val)\n    print(f\"ValidationLoss: {loss:.4f}, Validation Accuracy:{accuracy:.4f}\")\n    return loss, accuracy\n","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.92186Z","iopub.status.idle":"2023-03-22T12:13:20.922538Z","shell.execute_reply.started":"2023-03-22T12:13:20.922269Z","shell.execute_reply":"2023-03-22T12:13:20.922298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_model(my_model, valid_ds)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T12:13:20.924216Z","iopub.status.idle":"2023-03-22T12:13:20.925089Z","shell.execute_reply.started":"2023-03-22T12:13:20.924823Z","shell.execute_reply":"2023-03-22T12:13:20.924849Z"},"trusted":true},"execution_count":null,"outputs":[]}]}