{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":22307,"databundleVersionId":1502524,"sourceType":"competition"}],"dockerImageVersionId":30776,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport shutil\nimport pydicom\nimport matplotlib.pyplot as plt\nimport scipy.io\nimport numpy as np\nimport cv2\nfrom PIL import Image\nimport pandas as pd\nimport gc\nfrom tqdm import tqdm\n\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential, Model\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras import layers\nfrom tensorflow.keras import applications\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint\nfrom tensorflow.keras.layers import Dense, Conv2D , MaxPool2D , Flatten , Dropout , BatchNormalization\n\nfrom sklearn.model_selection import RepeatedKFold, cross_val_score, train_test_split\nfrom sklearn.metrics import confusion_matrix, accuracy_score","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T12:19:20.624059Z","iopub.execute_input":"2024-12-05T12:19:20.624382Z","iopub.status.idle":"2024-12-05T12:19:35.346673Z","shell.execute_reply.started":"2024-12-05T12:19:20.624354Z","shell.execute_reply":"2024-12-05T12:19:35.345704Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ds = pydicom.dcmread(\"/kaggle/input/rsna-str-pulmonary-embolism-detection/train/0045f113e031/454c8fdfb649/0075a38c1940.dcm\")\ndcm_sample=ds.pixel_array.astype('float32')\nscaled_image = (np.maximum(dcm_sample, 0) / dcm_sample.max())\nplt.imshow(scaled_image)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T12:19:35.348335Z","iopub.execute_input":"2024-12-05T12:19:35.349251Z","iopub.status.idle":"2024-12-05T12:19:35.642264Z","shell.execute_reply.started":"2024-12-05T12:19:35.349209Z","shell.execute_reply":"2024-12-05T12:19:35.641481Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#not_noraml\ndf = pd.read_csv(\"/kaggle/input/rsna-str-pulmonary-embolism-detection/train.csv\")\ndf = df.loc[df[\"pe_present_on_image\"]==1,:].reset_index(drop=True)\nprint(len(df))\ndf.tail()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T12:19:35.643482Z","iopub.execute_input":"2024-12-05T12:19:35.643813Z","iopub.status.idle":"2024-12-05T12:19:38.916068Z","shell.execute_reply.started":"2024-12-05T12:19:35.643774Z","shell.execute_reply":"2024-12-05T12:19:38.91524Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#normal\ndf1 = pd.read_csv(\"/kaggle/input/rsna-str-pulmonary-embolism-detection/train.csv\")\ndf1 = df1.loc[(df1[\"pe_present_on_image\"] == 0) & (df1[\"negative_exam_for_pe\"] == 1) ,:].reset_index(drop=True)\nprint(len(df1))\ndf1.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T12:19:38.918437Z","iopub.execute_input":"2024-12-05T12:19:38.919194Z","iopub.status.idle":"2024-12-05T12:19:41.195052Z","shell.execute_reply.started":"2024-12-05T12:19:38.919164Z","shell.execute_reply":"2024-12-05T12:19:41.194157Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!mkdir /kaggle/data\n\n!mkdir /kaggle/data/train\n!mkdir /kaggle/data/valid\n!mkdir /kaggle/data/test\n\n!mkdir /kaggle/data/train/normal\n!mkdir /kaggle/data/train/not_normal\n\n!mkdir /kaggle/data/valid/normal\n!mkdir /kaggle/data/valid/not_normal\n\n!mkdir /kaggle/data/test/normal\n!mkdir /kaggle/data/test/not_normal","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T12:19:41.196149Z","iopub.execute_input":"2024-12-05T12:19:41.196425Z","iopub.status.idle":"2024-12-05T12:19:51.232478Z","shell.execute_reply.started":"2024-12-05T12:19:41.196399Z","shell.execute_reply":"2024-12-05T12:19:51.231233Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Train not_normal\nfor i in tqdm(range(10000)):\n    dcm = pydicom.dcmread(\"/kaggle/input/rsna-str-pulmonary-embolism-detection/train/\"+df.loc[i,'StudyInstanceUID']+'/'+df.loc[i,'SeriesInstanceUID']+'/'+df.loc[i,'SOPInstanceUID']+'.dcm')\n    dc_image=dcm.pixel_array.astype('float32')\n    #scaled_image = (np.maximum(dc_image, 0) / dc_image.max())\n    #scaled_image = np.reshape(scaled_image,(scaled_image.shape[0], scaled_image.shape[1], 1))\n    im = Image.fromarray(dc_image).convert('RGB').resize((256,256))  \n    im.save(\"/kaggle/data/train/not_normal/\"+str(i)+\".jpg\")\n    del dcm, dc_image, im\n    gc.collect()\n#     #ملخص:\n# الكود يقرأ صور DICOM من ملفات طبية.\n# يحول الصور إلى مصفوفة بكسلات، ثم يعيد تشكيلها وحفظها بصيغة JPEG بحجم 256x256.\n# يتم تحرير الذاكرة بعد معالجة كل صورة للحفاظ على أداء النظام.\n# هذا الكود مناسب للتعامل مع كميات كبيرة من البيانات الطبية وتحويلها إلى صور يمكن استخدامها بسهولة في نماذج الذكاء الاصطناعي مثل الشبكات العصبية.\n    #\n    #\n    #\n    \n    #\n    #\n    #","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T12:19:51.234166Z","iopub.execute_input":"2024-12-05T12:19:51.234585Z","iopub.status.idle":"2024-12-05T12:51:30.828043Z","shell.execute_reply.started":"2024-12-05T12:19:51.234542Z","shell.execute_reply":"2024-12-05T12:51:30.8272Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Train normal\nfrom tqdm import tqdm\nimport pydicom\nfor i in tqdm(range(10000)):\n    dcm = pydicom.dcmread(\"/kaggle/input/rsna-str-pulmonary-embolism-detection/train/\"+df1.loc[i,'StudyInstanceUID']+'/'+df1.loc[i,'SeriesInstanceUID']+'/'+df1.loc[i,'SOPInstanceUID']+'.dcm')\n    dc_image = dcm.pixel_array.astype('float32')\n    #scaled_image = (np.maximum(dc_image, 0) / dc_image.max())\n    #scaled_image = np.reshape(scaled_image,(scaled_image.shape[0], scaled_image.shape[1], 1))\n    im = Image.fromarray(dc_image).convert('RGB').resize((256,256))  \n    im.save(\"/kaggle/data/train/normal/\"+str(i)+\".jpg\")\n    del dcm, dc_image, im\n    gc.collect()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T12:51:30.829403Z","iopub.execute_input":"2024-12-05T12:51:30.83006Z","iopub.status.idle":"2024-12-05T13:24:29.795612Z","shell.execute_reply.started":"2024-12-05T12:51:30.830016Z","shell.execute_reply":"2024-12-05T13:24:29.79472Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Valid not_normal\nfor i in tqdm(range(10000,12000)):\n    dcm = pydicom.dcmread(\"/kaggle/input/rsna-str-pulmonary-embolism-detection/train/\"+df.loc[i,'StudyInstanceUID']+'/'+df.loc[i,'SeriesInstanceUID']+'/'+df.loc[i,'SOPInstanceUID']+'.dcm')\n    dc_image=dcm.pixel_array.astype('float32')\n    #scaled_image = (np.maximum(dc_image, 0) / dc_image.max())\n    #scaled_image = np.reshape(scaled_image,(scaled_image.shape[0], scaled_image.shape[1], 1))\n    im = Image.fromarray(dc_image).convert('RGB').resize((256,256))  \n    im.save(\"/kaggle/data/valid/not_normal/\"+str(i)+\".jpg\")\n    del dcm, dc_image, im\n    gc.collect()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:24:29.796695Z","iopub.execute_input":"2024-12-05T13:24:29.796966Z","iopub.status.idle":"2024-12-05T13:31:09.572348Z","shell.execute_reply.started":"2024-12-05T13:24:29.796938Z","shell.execute_reply":"2024-12-05T13:31:09.571515Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Valid normal\nfor i in tqdm(range(10000,12000)):\n    dcm = pydicom.dcmread(\"/kaggle/input/rsna-str-pulmonary-embolism-detection/train/\"+df1.loc[i,'StudyInstanceUID']+'/'+df1.loc[i,'SeriesInstanceUID']+'/'+df1.loc[i,'SOPInstanceUID']+'.dcm')\n    dc_image=dcm.pixel_array.astype('float32')\n    #scaled_image = (np.maximum(dc_image, 0) / dc_image.max())\n    #scaled_image = np.reshape(scaled_image,(scaled_image.shape[0], scaled_image.shape[1], 1))\n    im = Image.fromarray(dc_image).convert('RGB').resize((256,256))  \n    im.save(\"/kaggle/data/valid/normal/\"+str(i)+\".jpg\")\n    del dcm, dc_image, im\n    gc.collect()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:31:09.573276Z","iopub.execute_input":"2024-12-05T13:31:09.573555Z","iopub.status.idle":"2024-12-05T13:38:16.461332Z","shell.execute_reply.started":"2024-12-05T13:31:09.573529Z","shell.execute_reply":"2024-12-05T13:38:16.460493Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Test not_normal\nfor i in tqdm(range(12000,14000)):\n    dcm = pydicom.dcmread(\"/kaggle/input/rsna-str-pulmonary-embolism-detection/train/\"+df.loc[i,'StudyInstanceUID']+'/'+df.loc[i,'SeriesInstanceUID']+'/'+df.loc[i,'SOPInstanceUID']+'.dcm')\n    dc_image=dcm.pixel_array.astype('float32')\n    #scaled_image = (np.maximum(dc_image, 0) / dc_image.max())\n    #scaled_image = np.reshape(scaled_image,(scaled_image.shape[0], scaled_image.shape[1], 1))\n    im = Image.fromarray(dc_image).convert('RGB').resize((256,256))  \n    im.save(\"/kaggle/data/test/not_normal/\"+str(i)+\".jpg\")\n    del dcm, dc_image, im\n    gc.collect()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:38:16.46528Z","iopub.execute_input":"2024-12-05T13:38:16.465546Z","iopub.status.idle":"2024-12-05T13:45:16.592277Z","shell.execute_reply.started":"2024-12-05T13:38:16.465521Z","shell.execute_reply":"2024-12-05T13:45:16.591379Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Test normal\nfor i in tqdm(range(12000,14000)):\n    dcm = pydicom.dcmread(\"/kaggle/input/rsna-str-pulmonary-embolism-detection/train/\"+df1.loc[i,'StudyInstanceUID']+'/'+df1.loc[i,'SeriesInstanceUID']+'/'+df1.loc[i,'SOPInstanceUID']+'.dcm')\n    dc_image=dcm.pixel_array.astype('float32')\n    #scaled_image = (np.maximum(dc_image, 0) / dc_image.max())\n    #scaled_image = np.reshape(scaled_image,(scaled_image.shape[0], scaled_image.shape[1], 1))\n    im = Image.fromarray(dc_image).convert('RGB').resize((256,256))  \n    im.save(\"/kaggle/data/test/normal/\"+str(i)+\".jpg\")\n    del dcm, dc_image, im\n    gc.collect()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:45:16.593232Z","iopub.execute_input":"2024-12-05T13:45:16.593463Z","iopub.status.idle":"2024-12-05T13:52:20.668776Z","shell.execute_reply.started":"2024-12-05T13:45:16.593439Z","shell.execute_reply":"2024-12-05T13:52:20.667938Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\ntrain_datagen = ImageDataGenerator(\n      featurewise_center=False,  \n      samplewise_center=False, \n      featurewise_std_normalization=False,  \n      samplewise_std_normalization=False, \n      rescale=1./255,\n      rotation_range=20,\n      width_shift_range=0.2,\n      height_shift_range=0.2,\n      shear_range=0.2,\n      zoom_range=0.2,\n      horizontal_flip=True,\n      vertical_flip=True,\n      fill_mode='nearest')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:52:20.670017Z","iopub.execute_input":"2024-12-05T13:52:20.670738Z","iopub.status.idle":"2024-12-05T13:52:20.675454Z","shell.execute_reply.started":"2024-12-05T13:52:20.670694Z","shell.execute_reply":"2024-12-05T13:52:20.674596Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_generator = train_datagen.flow_from_directory(\n        '/kaggle/data/train',\n        target_size=(256, 256),\n        batch_size=64,\n        class_mode='binary')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:52:20.676411Z","iopub.execute_input":"2024-12-05T13:52:20.676653Z","iopub.status.idle":"2024-12-05T13:52:20.937285Z","shell.execute_reply.started":"2024-12-05T13:52:20.676628Z","shell.execute_reply":"2024-12-05T13:52:20.936594Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"valid_datagen = ImageDataGenerator(\n      rescale=1./255)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:52:20.938252Z","iopub.execute_input":"2024-12-05T13:52:20.938521Z","iopub.status.idle":"2024-12-05T13:52:20.942632Z","shell.execute_reply.started":"2024-12-05T13:52:20.938494Z","shell.execute_reply":"2024-12-05T13:52:20.941716Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"valid_generator = valid_datagen.flow_from_directory(\n        '/kaggle/data/valid',\n        target_size=(256, 256),\n        batch_size=64,\n        class_mode='binary')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:52:20.943594Z","iopub.execute_input":"2024-12-05T13:52:20.943803Z","iopub.status.idle":"2024-12-05T13:52:21.007027Z","shell.execute_reply.started":"2024-12-05T13:52:20.94378Z","shell.execute_reply":"2024-12-05T13:52:21.006413Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(\n      rescale=1./255)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:52:21.008026Z","iopub.execute_input":"2024-12-05T13:52:21.008286Z","iopub.status.idle":"2024-12-05T13:52:21.012356Z","shell.execute_reply.started":"2024-12-05T13:52:21.008259Z","shell.execute_reply":"2024-12-05T13:52:21.011419Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_generator = valid_datagen.flow_from_directory(\n        '/kaggle/data/test',\n        target_size=(256, 256),\n        batch_size=64,\n        class_mode='binary')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:52:21.013274Z","iopub.execute_input":"2024-12-05T13:52:21.013545Z","iopub.status.idle":"2024-12-05T13:52:21.076106Z","shell.execute_reply.started":"2024-12-05T13:52:21.01352Z","shell.execute_reply":"2024-12-05T13:52:21.075281Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(32 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu' , input_shape = ( 256, 256, 3)))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool2D((2,2) , strides = 2 , padding = 'same'))\nmodel.add(Conv2D(64 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu'))\nmodel.add(Dropout(0.1))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool2D((2,2) , strides = 2 , padding = 'same'))\nmodel.add(Conv2D(64 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool2D((2,2) , strides = 2 , padding = 'same'))\nmodel.add(Conv2D(128 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu'))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool2D((2,2) , strides = 2 , padding = 'same'))\nmodel.add(Conv2D(256 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu'))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool2D((2,2) , strides = 2 , padding = 'same'))\nmodel.add(Flatten())\nmodel.add(Dense(units = 128 , activation = 'relu'))\nmodel.add(Dropout(0.2))\nmodel.add(Dense(units = 1 , activation = 'sigmoid'))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:52:21.077177Z","iopub.execute_input":"2024-12-05T13:52:21.077442Z","iopub.status.idle":"2024-12-05T13:52:22.050455Z","shell.execute_reply.started":"2024-12-05T13:52:21.077415Z","shell.execute_reply":"2024-12-05T13:52:22.049764Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!mkdir /kaggle/models","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:52:22.051512Z","iopub.execute_input":"2024-12-05T13:52:22.051845Z","iopub.status.idle":"2024-12-05T13:52:23.081718Z","shell.execute_reply.started":"2024-12-05T13:52:22.051808Z","shell.execute_reply":"2024-12-05T13:52:23.080455Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from keras.callbacks import ModelCheckpoint, ReduceLROnPlateau\n\nloss = tf.keras.losses.BinaryCrossentropy()\nmodel.compile(loss=loss, \n              optimizer='Adam', \n              metrics=['binary_accuracy'])\n\nlearning_rate_reduction = ReduceLROnPlateau(monitor='val_binary_accuracy', patience=2, verbose=1, factor=0.3, min_lr=0.000001)\n\n# Update the filepath to end with '.keras'\nfilepath = \"/kaggle/models/saved-model-{epoch:02d}-{val_binary_accuracy:.2f}.keras\"\n\n# Use the updated filepath\ncheckpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, \n                             save_best_only=False, save_freq='epoch')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:52:23.083368Z","iopub.execute_input":"2024-12-05T13:52:23.08369Z","iopub.status.idle":"2024-12-05T13:52:23.102183Z","shell.execute_reply.started":"2024-12-05T13:52:23.08366Z","shell.execute_reply":"2024-12-05T13:52:23.101283Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# Assuming train_generator and valid_generator are already defined\nhistory = model.fit(\n      train_generator,\n      epochs=25,\n      validation_data=valid_generator,\n      validation_steps=4,\n      callbacks=[checkpoint, learning_rate_reduction],\n      verbose=1\n)\n ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T13:52:23.103409Z","iopub.execute_input":"2024-12-05T13:52:23.103745Z","iopub.status.idle":"2024-12-05T15:43:03.788106Z","shell.execute_reply.started":"2024-12-05T13:52:23.103715Z","shell.execute_reply":"2024-12-05T15:43:03.787273Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.save('model.h5')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T15:43:03.789296Z","iopub.execute_input":"2024-12-05T15:43:03.789548Z","iopub.status.idle":"2024-12-05T15:43:03.885415Z","shell.execute_reply.started":"2024-12-05T15:43:03.789523Z","shell.execute_reply":"2024-12-05T15:43:03.884732Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.plot(history.history['binary_accuracy'], label='The score of correct predictions on the training set')\nplt.plot(history.history['val_binary_accuracy'], label='The score of correct predictions on the val set')\nplt.xlabel('Epoch')\nplt.ylabel('Score correct answers')\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T15:43:03.886331Z","iopub.execute_input":"2024-12-05T15:43:03.886553Z","iopub.status.idle":"2024-12-05T15:43:04.116112Z","shell.execute_reply.started":"2024-12-05T15:43:03.886529Z","shell.execute_reply":"2024-12-05T15:43:04.115244Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nbest_acc = 0\nbest_model = \"\"\n\nfor i in os.listdir(\"/kaggle/models\"):\n    model.load_weights(\"/kaggle/models/\" + i)\n    # Use `evaluate` instead of `evaluate_generator`\n    loss, acc = model.evaluate(test_generator, steps=3, verbose=0)\n    if acc > best_acc:\n        best_acc = acc  # Update the best accuracy\n        best_model = i  # Save the current model name\n\nprint(f\"The best model is {best_model} with an accuracy of {best_acc:.2f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T15:45:23.598763Z","iopub.execute_input":"2024-12-05T15:45:23.599136Z","iopub.status.idle":"2024-12-05T15:45:49.382608Z","shell.execute_reply.started":"2024-12-05T15:45:23.599105Z","shell.execute_reply":"2024-12-05T15:45:49.381692Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load the best model weights\nmodel.load_weights(\"/kaggle/models/\" + best_model)\n\n# Use `evaluate` instead of `evaluate_generator`\nloss, acc = model.evaluate(test_generator, steps=3, verbose=0)\n\n# Convert accuracy to percentage\nacc = acc * 100\nprint(f\"Accuracy is: {acc:.2f}%\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T15:46:38.081667Z","iopub.execute_input":"2024-12-05T15:46:38.082095Z","iopub.status.idle":"2024-12-05T15:46:39.118835Z","shell.execute_reply.started":"2024-12-05T15:46:38.082064Z","shell.execute_reply":"2024-12-05T15:46:39.117939Z"}},"outputs":[],"execution_count":null}]}