{"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":"# RSNA 2022 Cerical Spine Fracture Detection\n**CSCI217 Project**","metadata":{}},{"cell_type":"markdown","source":"## Import Libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nimport tensorflow as tf\nimport tensorflow.keras.layers as tfl\nfrom tensorflow.keras import backend as K\nfrom sklearn.model_selection import StratifiedKFold\nfrom tensorflow.keras.preprocessing.image import load_img, img_to_array\nfrom tensorflow.keras.applications import EfficientNetB0\n\nimport os\nimport cv2\nimport glob\nimport pydicom as dicom\nimport nibabel as nib\nimport sys","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-01-07T15:40:44.998281Z","iopub.execute_input":"2023-01-07T15:40:44.999302Z","iopub.status.idle":"2023-01-07T15:40:50.887547Z","shell.execute_reply.started":"2023-01-07T15:40:44.999154Z","shell.execute_reply":"2023-01-07T15:40:50.886581Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load Data","metadata":{}},{"cell_type":"markdown","source":"#### Load dataframes","metadata":{}},{"cell_type":"code","source":"df_train = pd.read_csv(\"/kaggle/input/rsna-2022-cervical-spine-fracture-detection/train.csv\")\ndf_test = pd.DataFrame({\"row_id\": ['1.2.826.0.1.3680043.22327_C1', '1.2.826.0.1.3680043.25399_C1', '1.2.826.0.1.3680043.5876_C1'], \n                        \"StudyInstanceUID\": ['1.2.826.0.1.3680043.22327', '1.2.826.0.1.3680043.25399', '1.2.826.0.1.3680043.5876'], \n                        \"prediction_type\": [\"C1\", \"C1\", \"C1\"]})  \n\ntrain_images_dir = '/kaggle/input/rsna-2022-cervical-spine-fracture-detection/train_images'\ntest_images_dir = '/kaggle/input/rsna-2022-cervical-spine-fracture-detection/test_images'\n\nnew_submission = []\nmeans = dict(zip(df_train.columns[1:], np.average(df_train.iloc[:,1:], axis=0, weights=df_train[\"patient_overall\"] + 1)))\nprediction_type = df_test['prediction_type'].tolist()\nsubmission = pd.read_csv('/kaggle/input/rsna-2022-cervical-spine-fracture-detection/sample_submission.csv')\nfor i in range(len(submission)):        \n    new_submission.append(means[prediction_type[i]])\nsubmission['fractured'] = new_submission\n\nprediction_type_mapping = df_test['prediction_type'].map({'C1': 0, 'C2': 1, 'C3': 2, 'C4': 3, 'C5': 4, 'C6': 5, 'C7': 6}).values\n\ndf_train.head()","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:41:15.964953Z","iopub.execute_input":"2023-01-07T15:41:15.9656Z","iopub.status.idle":"2023-01-07T15:41:16.015209Z","shell.execute_reply.started":"2023-01-07T15:41:15.965563Z","shell.execute_reply":"2023-01-07T15:41:16.014219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Load Dicom Helper Function","metadata":{}},{"cell_type":"code","source":"def load_dicom(path, size = 64):\n    img=dicom.dcmread(path)\n    img.PhotometricInterpretation = 'YBR_FULL'\n    data=img.pixel_array\n    data=data-np.min(data)\n    if np.max(data) != 0:\n        data=data/np.max(data)\n    data=(data*255).astype(np.uint8)        \n    return cv2.cvtColor(data.reshape(512, 512), cv2.COLOR_GRAY2RGB)\n\n    \npatients = sorted(os.listdir(train_images_dir))","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:41:18.112383Z","iopub.execute_input":"2023-01-07T15:41:18.112743Z","iopub.status.idle":"2023-01-07T15:41:18.218081Z","shell.execute_reply.started":"2023-01-07T15:41:18.112713Z","shell.execute_reply":"2023-01-07T15:41:18.21713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### visualize Images","metadata":{}},{"cell_type":"code","source":"image_file = glob.glob(\"/kaggle/input/rsna-2022-cervical-spine-fracture-detection/train_images/1.2.826.0.1.3680043.10001/*.dcm\")\nplt.figure(figsize=(20, 10))\n\nfor i in range(16):\n    ax = plt.subplot(4, 4, i + 1)\n    image_path = image_file[i]\n    image = load_dicom(image_path)\n    plt.axis('off')   \n    plt.imshow(image)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:41:20.414015Z","iopub.execute_input":"2023-01-07T15:41:20.414396Z","iopub.status.idle":"2023-01-07T15:41:21.98169Z","shell.execute_reply.started":"2023-01-07T15:41:20.414364Z","shell.execute_reply":"2023-01-07T15:41:21.980589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Create Data Generator\n(As data is so large that it can't fit in memory)","metadata":{}},{"cell_type":"code","source":"def RSNATrainGenerator(train_df, batch_size, infinite = True, base_path = train_images_dir):\n    while True:\n        trainset = []\n        trainidt = []\n        trainlabel = []\n        for i in (range(len(train_df))):\n            idt = train_df.loc[i, 'StudyInstanceUID']\n            path = os.path.join(base_path, idt)\n            for im in os.listdir(path):\n                dc = dicom.read_file(os.path.join(path,im))\n                if dc.file_meta.TransferSyntaxUID.name =='JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1])':\n                    continue\n                img = load_dicom(os.path.join(path , im))\n                img = cv2.resize(img, (128 , 128))\n                image = img_to_array(img)\n                image = image / 255.0\n                trainset += [image]\n                cur_label = [train_df.loc[i,f'C{j}'] for j in range(1,8)]\n                trainlabel += [cur_label]\n                trainidt += [idt]\n                if len(trainidt) == batch_size:                    \n                    yield np.array(trainset), np.array(trainlabel)\n                    trainset, trainlabel, trainidt = [], [], []\n            i+=1","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:41:23.853993Z","iopub.execute_input":"2023-01-07T15:41:23.854422Z","iopub.status.idle":"2023-01-07T15:41:23.865647Z","shell.execute_reply.started":"2023-01-07T15:41:23.854384Z","shell.execute_reply":"2023-01-07T15:41:23.864332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def RSNATestGenerator(test_df, batch_size, infinite = True, base_path = test_images_dir):\n    while 1:        \n        testset=[]\n        testidt=[]\n        for i in (range(len(test_df))):        \n            if type(test_df) is list: idt = test_df[i]\n            else: idt = test_df['StudyInstanceUID'].iloc[i]\n            path = os.path.join(base_path, idt)\n            if os.path.exists(path):\n                for im in os.listdir(path):\n                    dc = dicom.read_file(os.path.join(path,im))\n                    if dc.file_meta.TransferSyntaxUID.name =='JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1])':\n                        continue\n                    img=load_dicom(os.path.join(path,im))\n                    img=cv2.resize(img,(128, 128))\n                    image=img_to_array(img)\n                    image=image/255.0\n                    testset+=[image]\n                    testidt+=[idt]\n                    if len(testset) == batch_size:                        \n                        yield np.array(testset)\n                        testset = []\n        if len(testset) > 0: yield np.array(testset)\n        if not infinite: break","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:41:25.590312Z","iopub.execute_input":"2023-01-07T15:41:25.590681Z","iopub.status.idle":"2023-01-07T15:41:25.60068Z","shell.execute_reply.started":"2023-01-07T15:41:25.590647Z","shell.execute_reply":"2023-01-07T15:41:25.599627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = RSNATrainGenerator(df_train, 64)\nsample = next(train_data)\nprint(\"input_shape:\", sample[0].shape)\nprint(\"target_shape:\", sample[1].shape)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:41:27.595563Z","iopub.execute_input":"2023-01-07T15:41:27.59592Z","iopub.status.idle":"2023-01-07T15:41:30.283918Z","shell.execute_reply.started":"2023-01-07T15:41:27.595889Z","shell.execute_reply":"2023-01-07T15:41:30.282914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create Model","metadata":{"execution":{"iopub.status.busy":"2022-12-24T08:45:28.342629Z","iopub.execute_input":"2022-12-24T08:45:28.342996Z","iopub.status.idle":"2022-12-24T08:45:28.347812Z","shell.execute_reply.started":"2022-12-24T08:45:28.342963Z","shell.execute_reply":"2022-12-24T08:45:28.346634Z"}}},{"cell_type":"code","source":"def get_model_A1():       \n    eff_model = tf.keras.applications.EfficientNetB0(\n                    include_top=False,\n                    weights=\"imagenet\",\n                    pooling=\"max\")\n    \n    for layer in eff_model.layers[:-10]:\n        layer.trainable = False\n        \n        \n    inp = tfl.Input((128, 128 ,3))\n    x = eff_model(inp)\n    x = tfl.Dense(128, 'relu')(x)\n    x = tfl.Dropout(0.5)(x)\n    out = tfl.Dense(7, 'sigmoid')(x)\n    \n    model = tf.keras.models.Model(inp, out)\n    model.compile(loss=\"binary_crossentropy\", optimizer = tf.keras.optimizers.Adam(learning_rate = 1e-5),\n                 metrics=[tf.keras.metrics.BinaryAccuracy()])\n    model.summary()\n    return model\n\nget_model_A1()","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:41:32.090928Z","iopub.execute_input":"2023-01-07T15:41:32.091309Z","iopub.status.idle":"2023-01-07T15:41:37.585223Z","shell.execute_reply.started":"2023-01-07T15:41:32.091268Z","shell.execute_reply":"2023-01-07T15:41:37.584275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model_A2():\n    inp = tfl.Input((128, 128 ,3))\n    x = tfl.Conv2D(32, (3, 3), activation='relu')(inp)\n    x = tfl.MaxPooling2D((2, 2))(x)\n    x = tfl.Conv2D(64, (3, 3), activation='relu')(inp)\n    x = tfl.MaxPooling2D((2, 2))(x)\n    x = tfl.Conv2D(128, (3, 3), activation='relu')(inp)\n    x = tfl.MaxPooling2D((2, 2))(x)\n    x = tfl.Flatten()(x)\n    x = tfl.Dense(128, 'relu')(x)\n    x = tfl.Dropout(0.5)(x)\n    out = tfl.Dense(7, 'sigmoid')(x)\n    \n    model = tf.keras.models.Model(inp, out)\n        \n    model.compile(loss=\"binary_crossentropy\",\n                  optimizer = tf.keras.optimizers.Adam(learning_rate = 1e-4),\n                  metrics=[tf.keras.metrics.BinaryAccuracy()])\n    model.summary()\n    \n    return model\n\nget_model_A2()","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:42:05.24312Z","iopub.execute_input":"2023-01-07T15:42:05.244186Z","iopub.status.idle":"2023-01-07T15:42:05.312682Z","shell.execute_reply.started":"2023-01-07T15:42:05.244145Z","shell.execute_reply":"2023-01-07T15:42:05.311606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model_M1():       \n    MobileNet_model = tf.keras.applications.MobileNet(\n    include_top=False,\n    weights='imagenet',\n    pooling=\"max\",\n)\n    \n    for layer in MobileNet_model.layers[:-10]:\n        layer.trainable = False\n        \n        \n    inp = tfl.Input((128, 128 ,3))\n    x = MobileNet_model(inp)\n    out = tfl.Dense(7, 'sigmoid')(x)\n    model = tf.keras.models.Model(inp, out)\n    model.compile(loss=\"binary_crossentropy\", optimizer = tf.keras.optimizers.Adam(learning_rate = 0.0001),\n                 metrics=[tf.keras.metrics.BinaryAccuracy()])\n    model.summary()\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:42:06.537409Z","iopub.execute_input":"2023-01-07T15:42:06.537763Z","iopub.status.idle":"2023-01-07T15:42:06.544682Z","shell.execute_reply.started":"2023-01-07T15:42:06.537734Z","shell.execute_reply":"2023-01-07T15:42:06.543712Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model_M2():\n    DenseNet_model = tf.keras.applications.DenseNet121(\n    include_top=False,\n    weights='imagenet',\n    pooling=\"max\",\n)\n    \n    for layer in DenseNet_model.layers[:-10]:\n        layer.trainable = False\n        \n        \n    inp = tfl.Input((128, 128 ,3))\n    x = DenseNet_model(inp)\n    out = tfl.Dense(7, 'sigmoid')(x)\n    model = tf.keras.models.Model(inp, out)\n    model.compile(loss=\"binary_crossentropy\", optimizer = tf.keras.optimizers.Adam(learning_rate = 0.0001),\n                 metrics=[tf.keras.metrics.BinaryAccuracy()])\n    model.summary()\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:42:08.670146Z","iopub.execute_input":"2023-01-07T15:42:08.670861Z","iopub.status.idle":"2023-01-07T15:42:08.678195Z","shell.execute_reply.started":"2023-01-07T15:42:08.670822Z","shell.execute_reply":"2023-01-07T15:42:08.677076Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model_O1():       \n    eff_model = tf.keras.applications.Xception(\n                    include_top=False,\n                    weights=\"imagenet\",\n                    pooling=\"max\"\n                    )\n    \n    for layer in eff_model.layers[:-10]:\n        layer.trainable = False\n        \n        \n    inp = tfl.Input((128, 128 ,3))\n    x = eff_model(inp)\n    out = tfl.Dense(7, 'sigmoid')(x)\n    model = tf.keras.models.Model(inp, out)\n    model.compile(loss=\"binary_crossentropy\", optimizer = tf.keras.optimizers.Adam(learning_rate = 0.0001),\n                 metrics=[tf.keras.metrics.BinaryAccuracy()])\n    model.summary()\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:42:10.726844Z","iopub.execute_input":"2023-01-07T15:42:10.727193Z","iopub.status.idle":"2023-01-07T15:42:10.734597Z","shell.execute_reply.started":"2023-01-07T15:42:10.727162Z","shell.execute_reply":"2023-01-07T15:42:10.733469Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow import keras\nfrom tensorflow.keras import layers\ndef get_model_O2():\n    model = keras.Sequential([\n        layers.Dense(128, activation='relu', input_shape=[128,128,3]),\n        layers.Dropout(0.4),\n        layers.Dense(128, activation='relu'),\n        layers.Dropout(0.6),\n        layers.Dense(64, activation='relu'),\n        layers.Flatten(),\n        layers.Dense(7, activation='sigmoid'),\n    ])\n    \n    model.compile(loss=\"binary_crossentropy\", optimizer = tf.keras.optimizers.Adam(learning_rate = 1e-4),\n                 metrics=[tf.keras.metrics.BinaryAccuracy()])\n    model.summary()\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:44:17.502973Z","iopub.execute_input":"2023-01-07T15:44:17.503375Z","iopub.status.idle":"2023-01-07T15:44:17.511413Z","shell.execute_reply.started":"2023-01-07T15:44:17.503341Z","shell.execute_reply":"2023-01-07T15:44:17.51044Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model_K1():       \n    eff_model = tf.keras.applications.InceptionV3(\n                    include_top=False,\n                    weights=\"imagenet\",\n                    pooling=\"max\"\n                    )\n    \n    for layer in eff_model.layers[:-10]:\n        layer.trainable = False\n        \n        \n    inp = tfl.Input((128, 128 ,3))\n    x = eff_model(inp)\n    # x = tfl.Conv2D(3, 3, padding = 'SAME')(x)\n    out = tfl.Dense(7, 'sigmoid')(x)\n    model = tf.keras.models.Model(inp, out)\n    model.layers[2].trainable = False\n    model.compile(loss=\"binary_crossentropy\", optimizer = tf.keras.optimizers.Adam(learning_rate = 0.0001),\n                 metrics=[tf.keras.metrics.BinaryAccuracy()])\n    model.summary()\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:45:05.529932Z","iopub.execute_input":"2023-01-07T15:45:05.530316Z","iopub.status.idle":"2023-01-07T15:45:05.537521Z","shell.execute_reply.started":"2023-01-07T15:45:05.530279Z","shell.execute_reply":"2023-01-07T15:45:05.536398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model_K2():\n    num_classes = 7\n    image_size = 128\n    model = keras.Sequential([\n                    layers.experimental.preprocessing.Rescaling(1./255, input_shape=(image_size, image_size, 3)),\n                    layers.Conv2D(16, 3, padding='same', activation='relu'),\n                    layers.MaxPooling2D(),\n                    layers.Conv2D(32, 3, padding='same', activation='relu'),\n                    layers.MaxPooling2D(),\n                    layers.Conv2D(64, 3, padding='same', activation='relu'),\n                    layers.MaxPooling2D(),\n                    layers.Flatten(),\n                    layers.Dense(128, activation='relu'),\n                    layers.Dense(64, activation='relu'),\n                    layers.Dense(num_classes)])\n    model.compile(loss=\"binary_crossentropy\", optimizer = tf.keras.optimizers.Adam(learning_rate = 1e-4),\n                 metrics=[tf.keras.metrics.BinaryAccuracy()])\n    model.summary()\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:45:10.500545Z","iopub.execute_input":"2023-01-07T15:45:10.500899Z","iopub.status.idle":"2023-01-07T15:45:10.508619Z","shell.execute_reply.started":"2023-01-07T15:45:10.50087Z","shell.execute_reply":"2023-01-07T15:45:10.507646Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model_N1():\n    base_model = keras.applications.ResNet50(\n    weights='imagenet',  # Load weights pre-trained on ImageNet.\n    input_shape=(128, 128, 3),\n    include_top=False)  # include the ImageNet classifier at the top.\n    base_model.trainable = False\n\n    model = tf.keras.models.Sequential()\n    model.add(base_model)\n    model.add(tf.keras.layers.Flatten())\n#     model.add(tf.keras.layers.Dropout(0.5))\n    model.add(tf.keras.layers.Dense(128, activation='relu'))\n    model.add(tf.keras.layers.Dense(64, activation='relu'))\n    model.add(tf.keras.layers.Dense(32, activation='relu'))\n    model.add(tf.keras.layers.Dense(1, activation='sigmoid'))\n\n#     model.layers[0].trainable = False\n    \n    model.compile(\n        loss='binary_crossentropy',\n        optimizer=tf.keras.optimizers.Adam(learning_rate = 1e-4),\n        metrics=[tf.keras.metrics.BinaryAccuracy()]\n    )\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:45:12.91783Z","iopub.execute_input":"2023-01-07T15:45:12.918195Z","iopub.status.idle":"2023-01-07T15:45:12.926663Z","shell.execute_reply.started":"2023-01-07T15:45:12.918164Z","shell.execute_reply":"2023-01-07T15:45:12.925587Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model_N2():\n    base_model = keras.applications.VGG16(\n    weights='imagenet',  # Load weights pre-trained on ImageNet.\n    input_shape=(128, 128, 3),\n    include_top=False)  # Do not include the ImageNet classifier at the top.\n    base_model.trainable = False\n\n    model = tf.keras.models.Sequential()\n    model.add(base_model)\n    model.add(tf.keras.layers.Flatten())\n#     model.add(tf.keras.layers.Dropout(0.5))\n    model.add(tf.keras.layers.Dense(128, activation='relu'))\n    model.add(tf.keras.layers.Dense(64, activation='relu'))\n    model.add(tf.keras.layers.Dense(32, activation='relu'))\n    model.add(tf.keras.layers.Dense(1, activation='sigmoid'))\n\n#     model.layers[0].trainable = False\n    \n    model.compile(\n        loss='binary_crossentropy',\n        optimizer=tf.keras.optimizers.Adam(learning_rate = 1e-4),\n        metrics=[tf.keras.metrics.BinaryAccuracy()]\n    )\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:45:14.902808Z","iopub.execute_input":"2023-01-07T15:45:14.903171Z","iopub.status.idle":"2023-01-07T15:45:14.911196Z","shell.execute_reply.started":"2023-01-07T15:45:14.903137Z","shell.execute_reply":"2023-01-07T15:45:14.910283Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"functions = [('Abdallah', get_model_A1, get_model_A2), ('Mohammad', get_model_M1, get_model_M2), ('Omar Ahmed', get_model_O1, get_model_O2), ('Omar Khaled', get_model_K1, get_model_K2), ('Nadeen', get_model_N1, get_model_N2)]","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:45:17.687764Z","iopub.execute_input":"2023-01-07T15:45:17.688444Z","iopub.status.idle":"2023-01-07T15:45:17.694309Z","shell.execute_reply.started":"2023-01-07T15:45:17.688401Z","shell.execute_reply":"2023-01-07T15:45:17.693476Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"accuracies = []\nfor person in functions:\n    print(person[0])\n    for train_idx, val_idx in StratifiedKFold(5).split(df_train, df_train['patient_overall']):    \n        K.clear_session()\n        x_train = df_train.iloc[train_idx].reset_index()\n        x_val = df_train.iloc[val_idx].reset_index()\n\n        train_gen = RSNATrainGenerator(x_train, min(len(x_train), 64), infinite = False, base_path = train_images_dir)\n        val_gen = RSNATrainGenerator(x_val, min(len(x_val), 64), infinite = False, base_path = train_images_dir)\n\n        model1 = person[1]()\n        model2 = person[2]()\n\n\n        hist1 = model1.fit_generator(                            \n            train_gen,\n            epochs = 5,\n            callbacks = [tf.keras.callbacks.EarlyStopping(monitor = 'val_loss', patience = 2, restore_best_weights = True)],\n            validation_steps = max((len(x_val) // 64), 1),\n            steps_per_epoch = max((len(x_train) // 64), 1),\n            validation_data = val_gen,\n          )\n\n        hist2 = model2.fit_generator(                            \n            train_gen,\n            epochs = 5,\n            callbacks = [tf.keras.callbacks.EarlyStopping(monitor = 'val_loss', patience = 2, restore_best_weights = True)],\n            validation_steps = max((len(x_val) // 64), 1),\n            steps_per_epoch = max((len(x_train) // 64), 1),\n            validation_data = val_gen,\n          )\n        accuracies.append(model1.evaluate(val_gen, steps = max((len(x_val) // 64), 1))[1])\n        accuracies.append(model2.evaluate(val_gen, steps = max((len(x_val) // 64), 1))[1])\n        try: # the best we can do at the moment..\n            preds1 = model1.predict_generator(RSNATestGenerator(df_test, min(len(df_test), 64), infinite = False, base_path = test_images_dir), steps = max((len(df_test) // 64), 1))\n            preds2 = model2.predict_generator(RSNATestGenerator(df_test, min(len(df_test), 64), infinite = False, base_path = test_images_dir), steps = max((len(df_test) // 64), 1))\n\n            new_preds = []\n            for pred_idx in range(len(preds1)):\n                new_preds.append(preds1[pred_idx][prediction_type_mapping[pred_idx]])\n            submission['fractured'] += np.array(new_preds) / 10\n\n            new_preds = []\n            for pred_idx in range(len(preds2)):\n                new_preds.append(preds2[pred_idx][prediction_type_mapping[pred_idx]])\n            submission['fractured'] += np.array(new_preds) / 10\n\n        except: traceback.print_exc()    ","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:45:20.520083Z","iopub.execute_input":"2023-01-07T15:45:20.520477Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.array(accuracies).mean()","metadata":{"execution":{"iopub.status.busy":"2023-01-07T18:01:13.07724Z","iopub.execute_input":"2023-01-07T18:01:13.07766Z","iopub.status.idle":"2023-01-07T18:01:13.091543Z","shell.execute_reply.started":"2023-01-07T18:01:13.077623Z","shell.execute_reply":"2023-01-07T18:01:13.090511Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"execution":{"iopub.status.busy":"2023-01-07T18:10:13.977277Z","iopub.execute_input":"2023-01-07T18:10:13.978Z","iopub.status.idle":"2023-01-07T18:10:14.00206Z","shell.execute_reply.started":"2023-01-07T18:10:13.977962Z","shell.execute_reply":"2023-01-07T18:10:14.000731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index = 0)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T18:10:14.88102Z","iopub.execute_input":"2023-01-07T18:10:14.881415Z","iopub.status.idle":"2023-01-07T18:10:14.894822Z","shell.execute_reply.started":"2023-01-07T18:10:14.88138Z","shell.execute_reply":"2023-01-07T18:10:14.893763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"new_preds","metadata":{"execution":{"iopub.status.busy":"2023-01-07T18:10:15.891187Z","iopub.execute_input":"2023-01-07T18:10:15.891891Z","iopub.status.idle":"2023-01-07T18:10:15.898446Z","shell.execute_reply.started":"2023-01-07T18:10:15.891855Z","shell.execute_reply":"2023-01-07T18:10:15.897438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"execution":{"iopub.status.busy":"2023-01-07T18:10:16.877301Z","iopub.execute_input":"2023-01-07T18:10:16.877665Z","iopub.status.idle":"2023-01-07T18:10:16.888549Z","shell.execute_reply.started":"2023-01-07T18:10:16.877635Z","shell.execute_reply":"2023-01-07T18:10:16.887387Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.array(new_preds) / 5","metadata":{"execution":{"iopub.status.busy":"2023-01-07T18:10:18.362507Z","iopub.execute_input":"2023-01-07T18:10:18.363033Z","iopub.status.idle":"2023-01-07T18:10:18.371624Z","shell.execute_reply.started":"2023-01-07T18:10:18.362999Z","shell.execute_reply":"2023-01-07T18:10:18.370496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}