{"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":"* We have used RSNA official datset.It has dcm files to store mammograms.\n* Have to convert to png\n* below code converts train,test dcm sets to png sets","metadata":{}},{"cell_type":"code","source":"!pip install -qU python-gdcm pydicom pylibjpeg","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:43:22.09684Z","iopub.execute_input":"2023-04-28T10:43:22.097587Z","iopub.status.idle":"2023-04-28T10:43:32.607357Z","shell.execute_reply.started":"2023-04-28T10:43:22.097544Z","shell.execute_reply":"2023-04-28T10:43:32.606045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#import libraries\nimport os\nimport cv2\nimport glob\nimport gdcm\nimport pydicom\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nfrom tqdm.notebook import tqdm\nfrom joblib import Parallel, delayed","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:43:32.610935Z","iopub.execute_input":"2023-04-28T10:43:32.611366Z","iopub.status.idle":"2023-04-28T10:43:32.617959Z","shell.execute_reply.started":"2023-04-28T10:43:32.611317Z","shell.execute_reply":"2023-04-28T10:43:32.616879Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nimport tensorflow.keras.backend as K\nimport matplotlib.image as mpimg\npd.options.display.max_columns = 50","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:43:32.619731Z","iopub.execute_input":"2023-04-28T10:43:32.620112Z","iopub.status.idle":"2023-04-28T10:43:32.633253Z","shell.execute_reply.started":"2023-04-28T10:43:32.620074Z","shell.execute_reply":"2023-04-28T10:43:32.63217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### **Convert test data DCM to PNG**","metadata":{}},{"cell_type":"markdown","source":"Save the processed image","metadata":{}},{"cell_type":"code","source":"def process(f, size=512, save_folder=\"\", extension=\"png\"):\n    patient = f.split('/')[-2]\n    image = f.split('/')[-1][:-4]\n\n    dicom = pydicom.dcmread(f)\n    img = dicom.pixel_array\n\n    img = (img - img.min()) / (img.max() - img.min())\n\n    if dicom.PhotometricInterpretation == \"MONOCHROME1\":\n        img = 1 - img\n\n    img = cv2.resize(img, (size, size))\n\n    cv2.imwrite(save_folder + f\"{patient}_{image}.{extension}\", (img * 255).astype(np.uint8))","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:43:32.636508Z","iopub.execute_input":"2023-04-28T10:43:32.636927Z","iopub.status.idle":"2023-04-28T10:43:32.647653Z","shell.execute_reply.started":"2023-04-28T10:43:32.636888Z","shell.execute_reply":"2023-04-28T10:43:32.646583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_pngs_from_dcms(dcm_path,SAVE_FOLDER,SIZE,EXTENSION):\n    train_images = glob.glob(dcm_path)\n    len(train_images)  # 54706\n    print('...........Images loaded')\n    \n    os.makedirs(SAVE_FOLDER, exist_ok=True)\n    # an empty directory called train_output in kaggle/working path is created\n    print('...........New folder created')\n    \n    _ = Parallel(n_jobs=4)(\n    delayed(process)(uid, size=SIZE, save_folder=SAVE_FOLDER, extension=EXTENSION)\n    for uid in tqdm(train_images)\n    )\n    \n    print('............Finished')","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:43:32.649369Z","iopub.execute_input":"2023-04-28T10:43:32.650205Z","iopub.status.idle":"2023-04-28T10:43:32.662419Z","shell.execute_reply.started":"2023-04-28T10:43:32.650164Z","shell.execute_reply":"2023-04-28T10:43:32.661404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dcm_path = '/kaggle/input/rsna-breast-cancer-detection/test_images/*/*.dcm'\nSAVE_FOLDER = \"test_output/\"\nSIZE = 512\nEXTENSION = \"png\"\ncreate_pngs_from_dcms(dcm_path,SAVE_FOLDER,SIZE,EXTENSION)","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:43:32.664111Z","iopub.execute_input":"2023-04-28T10:43:32.664963Z","iopub.status.idle":"2023-04-28T10:43:38.046063Z","shell.execute_reply.started":"2023-04-28T10:43:32.66492Z","shell.execute_reply":"2023-04-28T10:43:38.044289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **To visulaise data that we are working with**","metadata":{}},{"cell_type":"code","source":"train_images = glob.glob('/kaggle/input/rsna-breast-cancer-512-pngs/*.png')\n\ntrain_images[0]","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:43:38.050957Z","iopub.execute_input":"2023-04-28T10:43:38.051942Z","iopub.status.idle":"2023-04-28T10:43:38.25812Z","shell.execute_reply.started":"2023-04-28T10:43:38.051876Z","shell.execute_reply":"2023-04-28T10:43:38.256943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for f in tqdm(train_images[-4:]):\n    img = cv2.imread(f)\n    plt.figure(figsize=(5, 5))\n    plt.imshow(img, cmap=\"gray\")\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:43:38.260076Z","iopub.execute_input":"2023-04-28T10:43:38.260394Z","iopub.status.idle":"2023-04-28T10:43:39.321195Z","shell.execute_reply.started":"2023-04-28T10:43:38.260365Z","shell.execute_reply":"2023-04-28T10:43:39.320111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **Load train and test datasets**","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/train.csv')\ntest_df = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/test.csv')\n\ntrain_df.head()\ntrain_df.info()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:43:39.323136Z","iopub.execute_input":"2023-04-28T10:43:39.323891Z","iopub.status.idle":"2023-04-28T10:43:39.396838Z","shell.execute_reply.started":"2023-04-28T10:43:39.323851Z","shell.execute_reply":"2023-04-28T10:43:39.395269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **Add image paths to train Dataframe**","metadata":{}},{"cell_type":"code","source":"# row = train_df[train_df['']]\ntrain_images = glob.glob('/kaggle/input/rsna-breast-cancer-512-pngs/*.png')\n\nfor path in tqdm(train_images):\n    name = path.split('/')[-1]\n    chunks = name.split('.')[0]\n    patient_id = chunks.split('_')[0]\n    image_id = chunks.split('_')[1]\n    \n    idx = (train_df['patient_id']==int(patient_id)) & (train_df['image_id']==int(image_id))\n    train_df.loc[idx, 'img_path'] =path\n","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:43:39.402927Z","iopub.execute_input":"2023-04-28T10:43:39.403214Z","iopub.status.idle":"2023-04-28T10:45:25.816805Z","shell.execute_reply.started":"2023-04-28T10:43:39.403186Z","shell.execute_reply":"2023-04-28T10:45:25.815604Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df[['patient_id','image_id','img_path']].head()\ntrain_df['img_path'][0]","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:25.818506Z","iopub.execute_input":"2023-04-28T10:45:25.819368Z","iopub.status.idle":"2023-04-28T10:45:25.835605Z","shell.execute_reply.started":"2023-04-28T10:45:25.819326Z","shell.execute_reply":"2023-04-28T10:45:25.834658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **Add image paths to test Dataframe**","metadata":{}},{"cell_type":"code","source":"test_images = glob.glob('/kaggle/working/test_output/*.png')\n\nfor path in tqdm(test_images):\n    name = path.split('/')[-1]\n    chunks = name.split('.')[0]\n    patient_id = chunks.split('_')[0]\n    image_id = chunks.split('_')[1]\n    \n    idx = (test_df['patient_id']==int(patient_id)) & (test_df['image_id']==int(image_id))\n    test_df.loc[idx, 'img_path'] =path\n\ntest_df[['patient_id','image_id','img_path']].head()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:25.836927Z","iopub.execute_input":"2023-04-28T10:45:25.837976Z","iopub.status.idle":"2023-04-28T10:45:25.879603Z","shell.execute_reply.started":"2023-04-28T10:45:25.837937Z","shell.execute_reply":"2023-04-28T10:45:25.878581Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Exploration and Feature Engineering","metadata":{}},{"cell_type":"markdown","source":"* 'site_id'\n* 'patient_id'\n* 'image_id'\n* 'laterality'\n* 'view' =  the craniocaudal (CC) view and the mediolateral oblique (MLO) view.\n* 'age'\n* 'cancer'\n* 'biopsy'\n* 'invasive'\n* 'BIRADS'\n* 'implant'\n* 'density'\n* 'machine_id'\n* 'difficult_negative_case'\n* 'img_path'","metadata":{}},{"cell_type":"code","source":"cols = ['image_id','age','machine_id','img_path']\nfor i in list(train_df.drop(cols,axis=1).columns):\n    print(i)\n    print(train_df[i].value_counts())\n    print('----------------\\n')","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:25.881069Z","iopub.execute_input":"2023-04-28T10:45:25.881516Z","iopub.status.idle":"2023-04-28T10:45:25.91213Z","shell.execute_reply.started":"2023-04-28T10:45:25.88148Z","shell.execute_reply":"2023-04-28T10:45:25.911455Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **Make a data frame to reduce bias in dataset non-cancer cases**","metadata":{}},{"cell_type":"code","source":"# cancer cases\n# cancer\n# 0    53548\n# 1     1158\n# Name: cancer, dtype: int64\n# ----------------\n\ndf = train_df.copy()\n# imgs of cancer\ncanc_count = df.loc[df['cancer']==1].shape[0]\ncanc_count\n\n# pick as many non canc cases as canc cases\ndf2 = df.loc[df['cancer']==0][:canc_count]\n\n# use rest of imgs for testing model\ndf_test_1 = df.loc[df['cancer']==0][canc_count:]\n\n# see how is the split\ndf2['cancer'].value_counts()\n\n# cancat both categ cases\ndf3 = df.loc[df['cancer']==1]\ndf4 = pd.concat([df2,df3],axis=0)\n# look at the split\ndf4['cancer'].value_counts()\n\n# df4 = The balanced data set","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:25.913324Z","iopub.execute_input":"2023-04-28T10:45:25.914269Z","iopub.status.idle":"2023-04-28T10:45:25.950622Z","shell.execute_reply.started":"2023-04-28T10:45:25.914231Z","shell.execute_reply":"2023-04-28T10:45:25.94939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# make split - train&val : 90% , test : 10%\n\nperc_90 = int(1158*0.9)\n\nnoncanc_df = df4.loc[df4['cancer']==0]\n# take 90% non canc cases\nnoncanc_df_train = noncanc_df[:perc_90]\n# take 10% non canc cases\nnoncanc_df_test = noncanc_df[perc_90:]\n\ncanc_df = df4.loc[df4['cancer']==1]\n# take 90% canc cases\ncanc_df_train = canc_df[:perc_90]\n# take 10% canc cases\ncanc_df_test = canc_df[perc_90:]\n\ntrain_df_new = pd.concat([noncanc_df_train,canc_df_train],axis = 0)\ntest_df_new = pd.concat([noncanc_df_test,canc_df_test],axis = 0)\n\ntrain_df_new['cancer'].value_counts()\ntest_df_new['cancer'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:25.952332Z","iopub.execute_input":"2023-04-28T10:45:25.952764Z","iopub.status.idle":"2023-04-28T10:45:25.974477Z","shell.execute_reply.started":"2023-04-28T10:45:25.952724Z","shell.execute_reply":"2023-04-28T10:45:25.973091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y_train = list(train_df_new.drop(['img_path'], axis=1).columns)\nY_val = list(test_df_new.drop(['img_path'], axis=1).columns)\n# Y_test = list(test_df.drop(['img_path'], axis=1).columns)\n# unq_disease = len(Y_val)\n# unq_disease\nY_train","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:25.976342Z","iopub.execute_input":"2023-04-28T10:45:25.976712Z","iopub.status.idle":"2023-04-28T10:45:25.990882Z","shell.execute_reply.started":"2023-04-28T10:45:25.976681Z","shell.execute_reply":"2023-04-28T10:45:25.989218Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,\n                                                                horizontal_flip=True,\n                                                                vertical_flip=True,\n                                                                rotation_range=90,\n                                                               validation_split=0.20)\ntest_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n# The value for class_mode in flow_from_dataframe MUST be 'raw' if you are attempting to do multilabel classification.\ntrain_gen = train_datagen.flow_from_dataframe(train_df_new, \n                                              x_col='img_path', \n                                              y_col=['cancer'],\n                                              target_size=(128,128),\n                                              class_mode='raw',\n                                              batch_size=16,\n                                              shuffle=True)\n\n# train_gen = train_datagen.flow_from_dataframe(train_df, \n#                                               x_col='img_path', \n#                                               y_col=Y_train,\n#                                               target_size=(150,150),\n#                                               class_mode='raw',\n#                                               batch_size=16,\n#                                               shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:25.992925Z","iopub.execute_input":"2023-04-28T10:45:25.993375Z","iopub.status.idle":"2023-04-28T10:45:29.891462Z","shell.execute_reply.started":"2023-04-28T10:45:25.993337Z","shell.execute_reply":"2023-04-28T10:45:29.890449Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_gen = train_datagen.flow_from_dataframe(test_df_new,\n                                          x_col='img_path',\n                                          y_col=['cancer'],\n                                          target_size=(128,128),\n                                          class_mode='raw',\n                                          batch_size=8)","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:29.893005Z","iopub.execute_input":"2023-04-28T10:45:29.893396Z","iopub.status.idle":"2023-04-28T10:45:30.337842Z","shell.execute_reply.started":"2023-04-28T10:45:29.893358Z","shell.execute_reply":"2023-04-28T10:45:30.336578Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_gen = train_datagen.flow_from_dataframe(test_df_new,\n                                            x_col='img_path',\n                                            y_col='cancer',\n                                          target_size=(128,128),\n                                          class_mode='raw',\n                                          batch_size=8,\n                                         seed = 42)\n\n","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:30.339395Z","iopub.execute_input":"2023-04-28T10:45:30.339767Z","iopub.status.idle":"2023-04-28T10:45:30.353733Z","shell.execute_reply.started":"2023-04-28T10:45:30.339731Z","shell.execute_reply":"2023-04-28T10:45:30.352545Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualizing Augmentation","metadata":{}},{"cell_type":"code","source":"# Load some sample images\nimg_path = '/kaggle/input/rsna-breast-cancer-512-pngs/10006_462822612.png'\nimg = tf.keras.preprocessing.image.load_img(img_path, target_size=(256, 256))\n\n# Convert image to numpy array\nimg_array = tf.keras.preprocessing.image.img_to_array(img)\n\n# Add a batch dimension to the array\nimg_array = np.expand_dims(img_array, axis=0)\n\n# Generate augmented images using the flow() method\naug_iter = train_datagen.flow(img_array, batch_size=1)\n\n# Visualize the augmented images\nfig, ax = plt.subplots(1, 5, figsize=(15, 15))\nfor i in range(5):\n    aug_img = next(aug_iter)[0]\n    ax[i].imshow(aug_img)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:30.355575Z","iopub.execute_input":"2023-04-28T10:45:30.356274Z","iopub.status.idle":"2023-04-28T10:45:31.049801Z","shell.execute_reply.started":"2023-04-28T10:45:30.356237Z","shell.execute_reply":"2023-04-28T10:45:31.048549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modeling","metadata":{}},{"cell_type":"code","source":"def UNet(inputs):\n    # First convolution block\n    x = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(inputs)\n    d1_con = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(x)\n    d1 = tf.keras.layers.MaxPool2D(pool_size=2, strides=2)(d1_con)\n    \n    # Second convolution block\n    d2 = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(d1)\n    d2_con = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(d2)\n    d2 = tf.keras.layers.MaxPool2D(pool_size=2, strides=2)(d2_con)\n    \n    # Third convolution block\n    d3 = tf.keras.layers.Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(d2)\n    d3_con = tf.keras.layers.Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(d3)\n    d3 = tf.keras.layers.MaxPool2D(pool_size=2, strides=2)(d3_con)\n    \n    # Fourth convolution block\n    d4 = tf.keras.layers.Conv2D(512, 3, activation='relu', padding='same', kernel_initializer='he_normal')(d3)\n    d4_con = tf.keras.layers.Conv2D(512, 3, activation='relu', padding='same', kernel_initializer='he_normal')(d4)\n    d4 = tf.keras.layers.MaxPool2D(pool_size=2, strides=2)(d4_con)\n    \n    # Bottleneck layer\n    b = tf.keras.layers.Conv2D(1024, 3, activation='relu', padding='same', kernel_initializer='he_normal')(d4)\n    b = tf.keras.layers.Conv2D(1024, 3, activation='relu', padding='same', kernel_initializer='he_normal')(b)\n    \n    # First upsampling block\n    u1 = tf.keras.layers.Conv2DTranspose(512, 3, strides =(2,2),padding='same')(b)\n    u1 = tf.keras.layers.Concatenate(axis=3)([u1, d4_con])\n    u1 = tf.keras.layers.Conv2D(512, 3, activation='relu', padding='same', kernel_initializer='he_normal')(u1)\n    u1 = tf.keras.layers.Conv2D(512, 3, activation='relu', padding='same', kernel_initializer='he_normal')(u1)\n    \n    # Second upsampling block\n    u2 = tf.keras.layers.Conv2DTranspose(256, 3, strides =(2,2),padding='same')(u1)\n    u2 = tf.keras.layers.Concatenate(axis=3)([u2, d3_con])\n    u2 = tf.keras.layers.Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(u2)\n    u2 = tf.keras.layers.Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(u2)\n    \n    \n    \n    # Third upsampling block\n    u3 = tf.keras.layers.Conv2DTranspose(128, 3, strides =(2,2),padding='same')(u2)\n    u3 = tf.keras.layers.Concatenate(axis=3)([u3, d2_con])\n    u3 = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(u3)\n    u3 = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(u3)\n    \n    # Fourth upsampling block\n    u4 = tf.keras.layers.Conv2DTranspose(64, 3, strides =(2,2),padding='same')(u3)\n    u4 = tf.keras.layers.Concatenate(axis=3)([u4, d1_con])\n    u4 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(u4)\n    u4 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(u4)\n    \n    \n    \n    # Flatten and output\n    flat = tf.keras.layers.Flatten()(u4)\n    hid1 = tf.keras.layers.Dense(units=50, activation='relu')(flat)\n    out = tf.keras.layers.Dense(units=1, activation='softmax')(hid1)\n    model = tf.keras.Model(inputs=[inputs], outputs=[out])\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:31.051827Z","iopub.execute_input":"2023-04-28T10:45:31.052633Z","iopub.status.idle":"2023-04-28T10:45:31.076222Z","shell.execute_reply.started":"2023-04-28T10:45:31.052583Z","shell.execute_reply":"2023-04-28T10:45:31.075071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.metrics import Accuracy\n\nauc = tf.keras.metrics.AUC(multi_label=True,thresholds=[0,0.5])\naucpr = tf.keras.metrics.AUC(curve='PR',multi_label=True,thresholds=[0,0.5])\ninputs = tf.keras.layers.Input(shape=(128,128,3))\nunet = UNet(inputs)\nunet.compile(optimizer='adam', loss='binary_crossentropy', metrics=[auc,aucpr]) #,tf.keras.metrics.Accuracy()\nunet.summary()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:31.078003Z","iopub.execute_input":"2023-04-28T10:45:31.078907Z","iopub.status.idle":"2023-04-28T10:45:31.4511Z","shell.execute_reply.started":"2023-04-28T10:45:31.078861Z","shell.execute_reply":"2023-04-28T10:45:31.450314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_history = unet.fit(train_gen, epochs=5, validation_data=val_gen)","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:45:31.452159Z","iopub.execute_input":"2023-04-28T10:45:31.452525Z","iopub.status.idle":"2023-04-28T10:48:25.335045Z","shell.execute_reply.started":"2023-04-28T10:45:31.452488Z","shell.execute_reply":"2023-04-28T10:48:25.333932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **Plot model loss**","metadata":{}},{"cell_type":"code","source":"plt.plot(model_history.history['loss'])\nplt.plot(model_history.history['val_loss'])\nplt.title('model loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\n\n\n\nplt.legend(['train', 'test'], loc='upper left')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:48:25.33679Z","iopub.execute_input":"2023-04-28T10:48:25.337154Z","iopub.status.idle":"2023-04-28T10:48:25.561067Z","shell.execute_reply.started":"2023-04-28T10:48:25.337116Z","shell.execute_reply":"2023-04-28T10:48:25.560036Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **Evaluating model**","metadata":{}},{"cell_type":"code","source":"# Evaluate model on test data\nevaluation_metrics = unet.evaluate(val_gen)\n\nevaluation_metrics\n\n# for train_gen : loss: 0.6638 - accuracy: 0.6247 - auc_10: 0.5000 - auc_11: 0.6247\n# for val_gen : loss: 1.1809 - accuracy: 0.0000e+00 - auc_10: 0.0000e+00 - auc_11: 0.0000e+00\n# for test_gen : loss: 0.7860 - accuracy: 0.5000 - auc_10: 0.5000 - auc_11: 0.5000","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:48:25.562459Z","iopub.execute_input":"2023-04-28T10:48:25.563451Z","iopub.status.idle":"2023-04-28T10:48:27.911074Z","shell.execute_reply.started":"2023-04-28T10:48:25.563393Z","shell.execute_reply":"2023-04-28T10:48:27.910078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"unet.evaluate(test_gen)","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:48:27.912547Z","iopub.execute_input":"2023-04-28T10:48:27.913202Z","iopub.status.idle":"2023-04-28T10:48:29.344097Z","shell.execute_reply.started":"2023-04-28T10:48:27.913165Z","shell.execute_reply":"2023-04-28T10:48:29.342252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_temp1 = df4.loc[df4['cancer']==0]\nnon_canc_path = df_temp1['img_path'].iloc[0]\nnon_canc_path","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:52:12.945333Z","iopub.execute_input":"2023-04-28T10:52:12.946712Z","iopub.status.idle":"2023-04-28T10:52:12.957054Z","shell.execute_reply.started":"2023-04-28T10:52:12.946668Z","shell.execute_reply":"2023-04-28T10:52:12.955465Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.preprocessing import image\nimport numpy as np\n\nimg_path = non_canc_path\nimg = image.load_img(img_path, target_size=(128, 128))\nimg_array = image.img_to_array(img)\nimg_array = np.expand_dims(img_array, axis=0)\nimg_array = img_array / 255.0 # normalize the pixel value\n\n# make a prediction on the input image\npreds = unet.predict(img_array)\n\n# get the predicted class by taking the argmax of the output\npredicted_class = np.argmax(preds, axis=-1)[0]\n\n# print the predicted class\nprint('Predicted class:', predicted_class)","metadata":{"execution":{"iopub.status.busy":"2023-04-28T10:52:17.435326Z","iopub.execute_input":"2023-04-28T10:52:17.4361Z","iopub.status.idle":"2023-04-28T10:52:17.859786Z","shell.execute_reply.started":"2023-04-28T10:52:17.436059Z","shell.execute_reply":"2023-04-28T10:52:17.858797Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"unet.predict()","metadata":{},"execution_count":null,"outputs":[]}]}