{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.10","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Imports and Setup","metadata":{}},{"cell_type":"code","source":"import os\nimport re\nimport gc\nimport glob\nimport imageio\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\nimport tensorflow as tf\nprint('TF version: ', tf.__version__)\nfrom tensorflow.keras.layers import *\nfrom tensorflow.keras.models import *\n\nfrom sklearn.model_selection import train_test_split","metadata":{"execution":{"iopub.status.busy":"2023-06-11T14:47:32.874739Z","iopub.execute_input":"2023-06-11T14:47:32.875144Z","iopub.status.idle":"2023-06-11T14:47:32.884992Z","shell.execute_reply.started":"2023-06-11T14:47:32.875104Z","shell.execute_reply":"2023-06-11T14:47:32.884054Z"},"trusted":true},"execution_count":2,"outputs":[{"name":"stdout","text":"TF version:  2.4.1\n","output_type":"stream"}]},{"cell_type":"markdown","source":"Set up Weights and Biases","metadata":{}},{"cell_type":"code","source":"import wandb\nprint('W&B version: ', wandb.__version__)\nfrom wandb.keras import WandbCallback\n\nwandb.login()","metadata":{"execution":{"iopub.status.busy":"2023-05-25T07:04:55.211499Z","iopub.execute_input":"2023-05-25T07:04:55.211854Z","iopub.status.idle":"2023-05-25T07:24:10.284963Z","shell.execute_reply.started":"2023-05-25T07:04:55.211818Z","shell.execute_reply":"2023-05-25T07:24:10.284005Z"},"trusted":true},"execution_count":2,"outputs":[{"name":"stdout","text":"W&B version:  0.10.33\n","output_type":"stream"},{"name":"stderr","text":"\u001b[34m\u001b[1mwandb\u001b[0m: You can find your API key in your browser here: https://wandb.ai/authorize\n","output_type":"stream"},{"output_type":"stream","name":"stdin","text":"\u001b[34m\u001b[1mwandb\u001b[0m: Paste an API key from your profile and hit enter:  ········································\n"},{"name":"stderr","text":"\u001b[34m\u001b[1mwandb\u001b[0m: Appending key for api.wandb.ai to your netrc file: /root/.netrc\n","output_type":"stream"},{"execution_count":2,"output_type":"execute_result","data":{"text/plain":"True"},"metadata":{}}]},{"cell_type":"code","source":"gpus = tf.config.list_physical_devices('GPU')\nif gpus:\n  try:\n    # Currently, memory growth needs to be the same across GPUs\n    for gpu in gpus:\n      tf.config.experimental.set_memory_growth(gpu, True)\n    logical_gpus = tf.config.experimental.list_logical_devices('GPU')\n    print(len(gpus), \"Physical GPUs,\", len(logical_gpus), \"Logical GPUs\")\n  except RuntimeError as e:\n    # Memory growth must be set before GPUs have been initialized\n    print(e)","metadata":{"execution":{"iopub.status.busy":"2023-06-11T14:47:44.61079Z","iopub.execute_input":"2023-06-11T14:47:44.61118Z","iopub.status.idle":"2023-06-11T14:47:46.384643Z","shell.execute_reply.started":"2023-06-11T14:47:44.611146Z","shell.execute_reply":"2023-06-11T14:47:46.38353Z"},"trusted":true},"execution_count":3,"outputs":[{"name":"stdout","text":"1 Physical GPUs, 1 Logical GPUs\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Prepare Dataset\n\nThere are four sub-directories per patient corresponding to different MRI Image Sequencing methods. In this kernel, I am using \"FLAIR\" MRI to get the balls rolling. To get the maximum out of the dataset using every sequencing method is recommended. ","metadata":{}},{"cell_type":"code","source":"# Load training csv file\ndf = pd.read_csv('../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv')\n\ndef get_patient_id(patient_id):\n    if patient_id < 10:\n        return '0000'+str(patient_id)\n    elif patient_id >= 10 and patient_id < 100:\n        return '000'+str(patient_id)\n    elif patient_id >= 100 and patient_id < 1000:\n        return '00'+str(patient_id)\n    else:\n        return '0'+str(patient_id)\n\ndef get_path(row):\n    patient_id = get_patient_id(row.BraTS21ID)\n    return f'../input/rsna-miccai-png/train/{patient_id}/FLAIR/'\n\ndf['path'] = df.apply(lambda row: get_path(row), axis=1)\n\n# Removing two patient ids from the dataframe since there are not FLAIR directories for these ids. \ndf = df.loc[df.BraTS21ID!=109]\ndf = df.loc[df.BraTS21ID!=709]\ndf = df.reset_index(drop=True)\n\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-11T14:47:48.205504Z","iopub.execute_input":"2023-06-11T14:47:48.205879Z","iopub.status.idle":"2023-06-11T14:47:48.273109Z","shell.execute_reply.started":"2023-06-11T14:47:48.205847Z","shell.execute_reply":"2023-06-11T14:47:48.272171Z"},"trusted":true},"execution_count":4,"outputs":[{"execution_count":4,"output_type":"execute_result","data":{"text/plain":"   BraTS21ID  MGMT_value                                         path\n0          0           1  ../input/rsna-miccai-png/train/00000/FLAIR/\n1          2           1  ../input/rsna-miccai-png/train/00002/FLAIR/\n2          3           0  ../input/rsna-miccai-png/train/00003/FLAIR/\n3          5           1  ../input/rsna-miccai-png/train/00005/FLAIR/\n4          6           1  ../input/rsna-miccai-png/train/00006/FLAIR/","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>BraTS21ID</th>\n      <th>MGMT_value</th>\n      <th>path</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>0</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/00000/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/00002/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>3</td>\n      <td>0</td>\n      <td>../input/rsna-miccai-png/train/00003/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>5</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/00005/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>6</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/00006/FLAIR/</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"cell_type":"markdown","source":"Prepare train-test split. Note that there are only 585 patients so if you are doing video classification, K-fold training might be beneficial. ","metadata":{}},{"cell_type":"code","source":"train_df, valid_df = train_test_split(df, test_size=0.1, stratify=df.MGMT_value.values)\nprint(f'Size of train_df: {len(train_df)}; valid_df: {len(valid_df)}')","metadata":{"execution":{"iopub.status.busy":"2023-06-11T14:47:52.187482Z","iopub.execute_input":"2023-06-11T14:47:52.187942Z","iopub.status.idle":"2023-06-11T14:47:52.198293Z","shell.execute_reply.started":"2023-06-11T14:47:52.187892Z","shell.execute_reply":"2023-06-11T14:47:52.197175Z"},"trusted":true},"execution_count":5,"outputs":[{"name":"stdout","text":"Size of train_df: 524; valid_df: 59\n","output_type":"stream"}]},{"cell_type":"code","source":"train_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-11T14:50:17.962435Z","iopub.execute_input":"2023-06-11T14:50:17.962823Z","iopub.status.idle":"2023-06-11T14:50:17.97393Z","shell.execute_reply.started":"2023-06-11T14:50:17.96277Z","shell.execute_reply":"2023-06-11T14:50:17.973027Z"},"trusted":true},"execution_count":7,"outputs":[{"execution_count":7,"output_type":"execute_result","data":{"text/plain":"     BraTS21ID  MGMT_value                                         path\n555        811           1  ../input/rsna-miccai-png/train/00811/FLAIR/\n395        577           1  ../input/rsna-miccai-png/train/00577/FLAIR/\n158        238           0  ../input/rsna-miccai-png/train/00238/FLAIR/\n270        397           0  ../input/rsna-miccai-png/train/00397/FLAIR/\n58          94           1  ../input/rsna-miccai-png/train/00094/FLAIR/","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>BraTS21ID</th>\n      <th>MGMT_value</th>\n      <th>path</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>555</th>\n      <td>811</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/00811/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>395</th>\n      <td>577</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/00577/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>158</th>\n      <td>238</td>\n      <td>0</td>\n      <td>../input/rsna-miccai-png/train/00238/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>270</th>\n      <td>397</td>\n      <td>0</td>\n      <td>../input/rsna-miccai-png/train/00397/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>58</th>\n      <td>94</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/00094/FLAIR/</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"cell_type":"code","source":"df","metadata":{"execution":{"iopub.status.busy":"2023-06-11T14:51:14.505641Z","iopub.execute_input":"2023-06-11T14:51:14.50606Z","iopub.status.idle":"2023-06-11T14:51:14.520689Z","shell.execute_reply.started":"2023-06-11T14:51:14.506024Z","shell.execute_reply":"2023-06-11T14:51:14.519743Z"},"trusted":true},"execution_count":8,"outputs":[{"execution_count":8,"output_type":"execute_result","data":{"text/plain":"     BraTS21ID  MGMT_value                                         path\n0            0           1  ../input/rsna-miccai-png/train/00000/FLAIR/\n1            2           1  ../input/rsna-miccai-png/train/00002/FLAIR/\n2            3           0  ../input/rsna-miccai-png/train/00003/FLAIR/\n3            5           1  ../input/rsna-miccai-png/train/00005/FLAIR/\n4            6           1  ../input/rsna-miccai-png/train/00006/FLAIR/\n..         ...         ...                                          ...\n578       1005           1  ../input/rsna-miccai-png/train/01005/FLAIR/\n579       1007           1  ../input/rsna-miccai-png/train/01007/FLAIR/\n580       1008           1  ../input/rsna-miccai-png/train/01008/FLAIR/\n581       1009           0  ../input/rsna-miccai-png/train/01009/FLAIR/\n582       1010           0  ../input/rsna-miccai-png/train/01010/FLAIR/\n\n[583 rows x 3 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>BraTS21ID</th>\n      <th>MGMT_value</th>\n      <th>path</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>0</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/00000/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/00002/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>3</td>\n      <td>0</td>\n      <td>../input/rsna-miccai-png/train/00003/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>5</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/00005/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>6</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/00006/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>578</th>\n      <td>1005</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/01005/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>579</th>\n      <td>1007</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/01007/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>580</th>\n      <td>1008</td>\n      <td>1</td>\n      <td>../input/rsna-miccai-png/train/01008/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>581</th>\n      <td>1009</td>\n      <td>0</td>\n      <td>../input/rsna-miccai-png/train/01009/FLAIR/</td>\n    </tr>\n    <tr>\n      <th>582</th>\n      <td>1010</td>\n      <td>0</td>\n      <td>../input/rsna-miccai-png/train/01010/FLAIR/</td>\n    </tr>\n  </tbody>\n</table>\n<p>583 rows × 3 columns</p>\n</div>"},"metadata":{}}]},{"cell_type":"code","source":"CONFIG = dict(\n    NUM_FRAMES = 10,\n    BATCH_SIZE = 8,\n    EPOCHS = 100,\n    IMG_SIZE = 224,\n    LSTM_UNITS = 512,\n    competition = 'rsna-miccai-brain',\n    _wandb_kernel = 'ayut'\n)","metadata":{"execution":{"iopub.status.busy":"2023-05-25T07:24:12.239338Z","iopub.execute_input":"2023-05-25T07:24:12.239718Z","iopub.status.idle":"2023-05-25T07:24:12.245009Z","shell.execute_reply.started":"2023-05-25T07:24:12.23968Z","shell.execute_reply":"2023-05-25T07:24:12.243774Z"},"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"markdown","source":"# Video Classification Data Pipeline\n\nA video classification data pipeline will compromise of multiple frames of the same video batched together. In order to batch the frames, the number of frames should be same. In this kerel it's controlled by `NUM_FRAMES`. \n\nIn have implemented the data pipeline using purely `tf.data`. Here are the important points to note:\n\n* The images in each `patient_id/FLAIR` directory is listed down using `glob.glob`. <br>\n* The path to images need to be sorted as per the image id given by `Image-X.png`. This is done by `sorted_nicely` function below. <br>\n* We need to select a window of frames given by `NUM_FRAMES`. I am using uniform sampling to do so. One can device a better sampling method. <br>\n* Iterate through each frame (image), load them and resize them. ","metadata":{}},{"cell_type":"code","source":"# https://stackoverflow.com/a/2669120/7636462\ndef sorted_nicely(l): \n    \"\"\" Sort the given iterable in the way that humans expect.\"\"\" \n    convert = lambda text: int(text) if text.isdigit() else text \n    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] \n    return sorted(l, key = alphanum_key)","metadata":{"execution":{"iopub.status.busy":"2023-05-25T07:24:12.247012Z","iopub.execute_input":"2023-05-25T07:24:12.247533Z","iopub.status.idle":"2023-05-25T07:24:12.262906Z","shell.execute_reply.started":"2023-05-25T07:24:12.247494Z","shell.execute_reply":"2023-05-25T07:24:12.261859Z"},"trusted":true},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"def decode_image(image):\n    # convert the compressed string to a 3D uint8 tensor\n    image = tf.image.decode_png(image, channels=1)\n    # Normalize image\n    image = tf.image.convert_image_dtype(image, dtype=tf.float32)\n    \n    return image\n\ndef parse_frames(dirname):\n    # get MRI images file paths for given patient \n    paths = glob.glob(dirname.decode('utf8')+'/*.png')\n    # Sort the images to get sequential imaging\n    paths = sorted_nicely(paths)\n    \n    # randomly select a window of images to be used as sequence\n    start = tf.random.uniform((1,), maxval=len(paths)-CONFIG['NUM_FRAMES'], dtype=tf.int32)\n\n    paths = tf.slice(paths, start, [CONFIG['NUM_FRAMES']])\n    \n    def get_frames(path):\n        # Load image\n        image = tf.io.read_file(path)\n        image = decode_image(image)\n        # Resize image\n        image = tf.image.resize(image, (CONFIG['IMG_SIZE'], CONFIG['IMG_SIZE']))\n        \n        return image\n\n    mri_images = tf.nest.map_structure(tf.stop_gradient, tf.map_fn(fn=get_frames, elems=paths, fn_output_signature=tf.float32))\n    \n    return mri_images\n    \ndef load_frame(df_dict):\n    dirname = df_dict['path']\n    paths = tf.numpy_function(parse_frames, [dirname], tf.float32)\n    \n    # Parse label\n    label = df_dict['MGMT_value']\n    label = tf.cast(label, tf.float32)\n    \n    return paths, label","metadata":{"execution":{"iopub.status.busy":"2023-05-25T07:24:12.2659Z","iopub.execute_input":"2023-05-25T07:24:12.26638Z","iopub.status.idle":"2023-05-25T07:24:12.278308Z","shell.execute_reply.started":"2023-05-25T07:24:12.266341Z","shell.execute_reply":"2023-05-25T07:24:12.27722Z"},"trusted":true},"execution_count":8,"outputs":[]},{"cell_type":"code","source":"AUTOTUNE = tf.data.AUTOTUNE\n\ntrainloader = tf.data.Dataset.from_tensor_slices(dict(train_df))\nvalidloader = tf.data.Dataset.from_tensor_slices(dict(valid_df))\n\n\ntrainloader = (\n    trainloader\n    .shuffle(1024)\n    .map(load_frame, num_parallel_calls=AUTOTUNE)\n    .batch(CONFIG['BATCH_SIZE'])\n    .prefetch(AUTOTUNE)\n)\n\nvalidloader = (\n    validloader\n    .map(load_frame, num_parallel_calls=AUTOTUNE)\n    .batch(CONFIG['BATCH_SIZE'])\n    .prefetch(AUTOTUNE)\n)","metadata":{"execution":{"iopub.status.busy":"2023-05-25T07:24:12.280228Z","iopub.execute_input":"2023-05-25T07:24:12.280763Z","iopub.status.idle":"2023-05-25T07:24:12.436338Z","shell.execute_reply.started":"2023-05-25T07:24:12.280725Z","shell.execute_reply":"2023-05-25T07:24:12.435478Z"},"trusted":true},"execution_count":9,"outputs":[]},{"cell_type":"code","source":"# test out the trainloader\nframes, labels = next(iter(trainloader))","metadata":{"execution":{"iopub.status.busy":"2023-05-25T07:24:12.438002Z","iopub.execute_input":"2023-05-25T07:24:12.438615Z","iopub.status.idle":"2023-05-25T07:24:13.359437Z","shell.execute_reply.started":"2023-05-25T07:24:12.438569Z","shell.execute_reply":"2023-05-25T07:24:13.358387Z"},"trusted":true},"execution_count":10,"outputs":[]},{"cell_type":"markdown","source":"In order to visualize the samples from our trainloader, I am using W&B. I find it easier to log everything onto W&B to visualize data than to write Matplotlib code. ","metadata":{}},{"cell_type":"code","source":"run = wandb.init(project='brain-tumor-video-classification', job_type='dataloader-viz')\n\nos.makedirs('gifs/')\nfor i, frame in enumerate(frames):\n    imageio.mimsave(f'gifs/out_{i}.gif', (frame*255).numpy().astype('uint8'))    \n\nwandb.log({'examples': [wandb.Image(f'gifs/out_{i}.gif', caption=f'{label.numpy()}') for i, label in enumerate(labels)]})\n    \nrun.finish()","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-05-25T07:24:13.360719Z","iopub.execute_input":"2023-05-25T07:24:13.361431Z","iopub.status.idle":"2023-05-25T07:24:25.152288Z","shell.execute_reply.started":"2023-05-25T07:24:13.361383Z","shell.execute_reply":"2023-05-25T07:24:25.151337Z"},"trusted":true},"execution_count":11,"outputs":[{"name":"stderr","text":"\u001b[34m\u001b[1mwandb\u001b[0m: Currently logged in as: \u001b[33mhelen_ctdh\u001b[0m (use `wandb login --relogin` to force relogin)\n\u001b[34m\u001b[1mwandb\u001b[0m: wandb version 0.15.3 is available!  To upgrade, please run:\n\u001b[34m\u001b[1mwandb\u001b[0m:  $ pip install wandb --upgrade\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"\n                Tracking run with wandb version 0.10.33<br/>\n                Syncing run <strong style=\"color:#cdcd00\">resilient-water-12</strong> to <a href=\"https://wandb.ai\" target=\"_blank\">Weights & Biases</a> <a href=\"https://docs.wandb.com/integrations/jupyter.html\" target=\"_blank\">(Documentation)</a>.<br/>\n                Project page: <a href=\"https://wandb.ai/helen_ctdh/brain-tumor-video-classification\" target=\"_blank\">https://wandb.ai/helen_ctdh/brain-tumor-video-classification</a><br/>\n                Run page: <a href=\"https://wandb.ai/helen_ctdh/brain-tumor-video-classification/runs/1yn4eq31\" target=\"_blank\">https://wandb.ai/helen_ctdh/brain-tumor-video-classification/runs/1yn4eq31</a><br/>\n                Run data is saved locally in <code>/kaggle/working/wandb/run-20230525_072413-1yn4eq31</code><br/><br/>\n            "},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"<br/>Waiting for W&B process to finish, PID 723<br/>Program ended successfully."},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"VBox(children=(Label(value=' 0.00MB of 1.09MB uploaded (0.00MB deduped)\\r'), FloatProgress(value=0.0, max=1.0)…","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"7a29b07e29d5499f940ef9a5f430f3d7"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Find user logs for this run at: <code>/kaggle/working/wandb/run-20230525_072413-1yn4eq31/logs/debug.log</code>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Find internal logs for this run at: <code>/kaggle/working/wandb/run-20230525_072413-1yn4eq31/logs/debug-internal.log</code>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"<h3>Run summary:</h3><br/><style>\n    table.wandb td:nth-child(1) { padding: 0 10px; text-align: right }\n    </style><table class=\"wandb\">\n<tr><td>_runtime</td><td>7</td></tr><tr><td>_timestamp</td><td>1684999460</td></tr><tr><td>_step</td><td>0</td></tr></table>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"<h3>Run history:</h3><br/><style>\n    table.wandb td:nth-child(1) { padding: 0 10px; text-align: right }\n    </style><table class=\"wandb\">\n<tr><td>_runtime</td><td>▁</td></tr><tr><td>_timestamp</td><td>▁</td></tr><tr><td>_step</td><td>▁</td></tr></table><br/>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Synced 4 W&B file(s), 8 media file(s), 0 artifact file(s) and 0 other file(s)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"\n                    <br/>Synced <strong style=\"color:#cdcd00\">resilient-water-12</strong>: <a href=\"https://wandb.ai/helen_ctdh/brain-tumor-video-classification/runs/1yn4eq31\" target=\"_blank\">https://wandb.ai/helen_ctdh/brain-tumor-video-classification/runs/1yn4eq31</a><br/>\n                "},"metadata":{}}]},{"cell_type":"markdown","source":"MRI Sequences, where each sequence is `NUM_FRAMES` long. \n\n![img](https://i.imgur.com/pKc7rnT.gif)","metadata":{}},{"cell_type":"markdown","source":"# Model\n\nIn order to model both spatial and temporal nature of videos, we can use a hybrid of CNN + LSTM model. \n\n* The `FeatureExtractor` model uses an EfficientNetB0 model as CNN backbone. It will be used to model the spatial aspect of videos. <br>\n* The `MRIModel` uses a `TimeDistributed` layer that runs the `FeatureExtractor` `NUM_FRAMES` times to get a vector of `(NUM_FRAMES, 1280)`. <br>\n* This is then fed to a single LSTM layer. You can use GRU and even Transformer in place of LSTM. I have used 256 units as it gave me the best results. ","metadata":{}},{"cell_type":"code","source":"def FeatureExtractor():\n    base_model = tf.keras.applications.EfficientNetB0(include_top=False, weights='imagenet')\n    base_model.trainabe = True\n\n    inputs = Input((CONFIG['IMG_SIZE'], CONFIG['IMG_SIZE'], 1))\n    x = Conv2D(3, kernel_size=(3, 3), padding='same', activation='relu')(inputs)\n    x = base_model(x, training=True)\n    flattened_output = GlobalAveragePooling2D()(x)\n    \n    return Model(inputs, flattened_output)\n\ntf.keras.backend.clear_session()\nmodel = FeatureExtractor()\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-05-25T07:24:25.153957Z","iopub.execute_input":"2023-05-25T07:24:25.154593Z","iopub.status.idle":"2023-05-25T07:24:28.960573Z","shell.execute_reply.started":"2023-05-25T07:24:25.154547Z","shell.execute_reply":"2023-05-25T07:24:28.959521Z"},"trusted":true},"execution_count":12,"outputs":[{"name":"stdout","text":"Downloading data from https://storage.googleapis.com/keras-applications/efficientnetb0_notop.h5\n16711680/16705208 [==============================] - 1s 0us/step\nModel: \"model\"\n_________________________________________________________________\nLayer (type)                 Output Shape              Param #   \n=================================================================\ninput_2 (InputLayer)         [(None, 224, 224, 1)]     0         \n_________________________________________________________________\nconv2d (Conv2D)              (None, 224, 224, 3)       30        \n_________________________________________________________________\nefficientnetb0 (Functional)  (None, None, None, 1280)  4049571   \n_________________________________________________________________\nglobal_average_pooling2d (Gl (None, 1280)              0         \n=================================================================\nTotal params: 4,049,601\nTrainable params: 4,007,578\nNon-trainable params: 42,023\n_________________________________________________________________\n","output_type":"stream"}]},{"cell_type":"code","source":"tf.keras.utils.plot_model(model, show_shapes=True)","metadata":{"execution":{"iopub.status.busy":"2023-05-25T07:24:28.963073Z","iopub.execute_input":"2023-05-25T07:24:28.963761Z","iopub.status.idle":"2023-05-25T07:24:29.515375Z","shell.execute_reply.started":"2023-05-25T07:24:28.96372Z","shell.execute_reply":"2023-05-25T07:24:29.514269Z"},"trusted":true},"execution_count":13,"outputs":[{"execution_count":13,"output_type":"execute_result","data":{"image/png":"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\n","text/plain":"<IPython.core.display.Image object>"},"metadata":{}}]},{"cell_type":"code","source":"def MRIModel():\n    inputs = Input((CONFIG['NUM_FRAMES'], CONFIG['IMG_SIZE'], CONFIG['IMG_SIZE'], 1))\n    feature_extractor = FeatureExtractor()\n    \n    time_wrapper = TimeDistributed(feature_extractor)(inputs)\n    \n    lstm_out = LSTM(CONFIG['LSTM_UNITS'], return_sequences=True, name=\"lstm\")(time_wrapper)\n    outputs = Dense(1, activation='sigmoid', name=\"lstm_sigmoid\")(lstm_out)\n    \n    return Model(inputs, outputs)\n\ntf.keras.backend.clear_session() \nmodel = MRIModel()\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-05-25T07:24:29.517329Z","iopub.execute_input":"2023-05-25T07:24:29.517953Z","iopub.status.idle":"2023-05-25T07:24:34.071556Z","shell.execute_reply.started":"2023-05-25T07:24:29.517904Z","shell.execute_reply":"2023-05-25T07:24:34.070371Z"},"trusted":true},"execution_count":14,"outputs":[{"name":"stdout","text":"Model: \"model_1\"\n_________________________________________________________________\nLayer (type)                 Output Shape              Param #   \n=================================================================\ninput_1 (InputLayer)         [(None, 10, 224, 224, 1)] 0         \n_________________________________________________________________\ntime_distributed (TimeDistri (None, 10, 1280)          4049601   \n_________________________________________________________________\nlstm (LSTM)                  (None, 10, 512)           3672064   \n_________________________________________________________________\nlstm_sigmoid (Dense)         (None, 10, 1)             513       \n=================================================================\nTotal params: 7,722,178\nTrainable params: 7,680,155\nNon-trainable params: 42,023\n_________________________________________________________________\n","output_type":"stream"}]},{"cell_type":"code","source":"tf.keras.utils.plot_model(model, show_shapes=True)","metadata":{"execution":{"iopub.status.busy":"2023-05-25T07:24:34.0728Z","iopub.execute_input":"2023-05-25T07:24:34.073174Z","iopub.status.idle":"2023-05-25T07:24:34.223759Z","shell.execute_reply.started":"2023-05-25T07:24:34.073141Z","shell.execute_reply":"2023-05-25T07:24:34.222759Z"},"trusted":true},"execution_count":15,"outputs":[{"execution_count":15,"output_type":"execute_result","data":{"image/png":"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5cuXERkZicTExBYrbkTmjJU3IiKiTvDCCy9AIpHAwcFBY5qvry/OnDmDw4cPo7q62gTZdYwbN27g8uXLyMrKMqhny+6ej76Yf9uSk5Oxdu1arF27VmPa0qVLVe/u3bt3r0PWT9TR2GySTIrNJonaz5yaTSYlJWHJkiVqZcuXL8eaNWtMlJF+2GyKqOfi9U9dwD6rtmOIiIiMY/HixVi8eLGp0yAiIjJLbDZJRERERERkBlh5IyIiIiIiMgOsvBEREREREZkBVt6IiIiIiIjMADssIZPLzs42dQpEZk15DaWnp5s4k+5POag49zVRz1NYWIj+/fubOg3q4ThUAJmURCIxdQpEREREOpk2bRqHCiBT4lABZFr87YCIjM2cxr0jIiLSB995IyIiIiIiMgOsvBEREREREZkBVt6IiIiIiIjMACtvREREREREZoCVNyIiIiIiIjPAyhsREREREZEZYOWNiIiIiIjIDLDyRkREREREZAZYeSMiIiIiIjIDrLwRERERERGZAVbeiIiIiIiIzAArb0RERERERGaAlTciIiIiIiIzwMobERERERGRGWDljYiIiIiIyAyw8kZERERERGQGWHkjIiIiIiIyA6y8ERERERERmQFW3oiIiIiIiMwAK29ERERERERmgJU3IiIiIiIiM8DKGxERERERkRlg5Y2IiIiIiMgMsPJGRERERERkBlh5IyIiIiIiMgOsvBEREREREZkBVt6IiIiIiIjMACtvREREREREZoCVNyIiIiIiIjPAyhsREREREZEZYOWNiIiIiIjIDLDyRkREREREZAZYeSMiIiIiIjIDVqZOgIiIyFA3b97EBx98oFb2/fffAwDWr1+vVt67d2/Mmzev03IjIiIyNokQQpg6CSIiIkM0NjbCzc0Nt27dgrW1dYtxDQ0NiI2NxbZt2zoxOyIiIqPax2aTRERktqysrDBjxgxYWlqioaGhxQ8AzJw508TZEhERtQ8rb0REZNZmzJiBu3fvthrj5uaGsWPHdlJGREREHYOVNyIiMmsBAQHo379/i9NtbGwwZ84cWFjwvzwiIjJv/J+MiIjMmkQiwezZs1t85+3OnTuYMWNGJ2dFRERkfKy8ERGR2Wut6eSgQYPg6+vbyRkREREZHytvRERk9h599FEMGzZMo9zGxgZ//vOfTZARERGR8bHyRkRE3cKcOXM0mk7e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uLi4ICIiAvHx8YYOp83F0xrS09Ph5eWFxMRETJ482dDhNNoT8rF9nDZJRERERK1OoVDg0KFD2L9/PzZu3GjocPRKCIGoqCjY2triww8/NHQ4bS6e1pCVlYWQkBDExsYaVeLWECZvRERERGQQXl5eOHfuHI4ePYqSkhJDh6M3ubm5yMrKQkpKik4rW7b3eFrD1q1bsWrVKqxatcrQoeiVWcNViIiIiJ4OcXFxWLBggepniUSCJUuWYOXKlQaMqn3r2rUrDh8+bOgw9MrJyQmnTp0ydBgqbS2e1rBmzRpDh9AimLwRERER/X/z589XW+GOiKgt4bRJIiIiIiIiI8DkjYiIiIiIyAgweSMiIiIiIjICTN6IiIiIiIiMQL0Llig31CQiIiJqjjNnzgDgd4vW8umnnxrVhuhEpO727dv1HpOIx7buTk1NxSeffNLiQREREbWE3NxcXLp0CX5+foYOhYiISGda/gizTyN5IyIiMmbJyckIDw8Hf70REVE7s4/PvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBM0MHQEREpKvs7GwEBQWhurpaVfbnn39CoVCgX79+anW9vLywY8eO1g6RiIhIb5i8ERGR0XJxcUFVVRUuX76scay4uFjt58mTJ7dWWERERC2C0yaJiMiovfbaazAze/LfIiUSCaZOndpKEREREbUMJm9ERGTUpkyZgtra2nqPSyQSeHt7o1u3bq0YFRERkf4xeSMiIqPm5uaGIUOGwMRE+680U1NTvPbaa60cFRERkf4xeSMiIqM3ffp0SCQSrcfq6uow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ERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGgMkbERERERGREWDyRkREREREZASYvBERERERERkBJm9ERERERERGwMzQARAREemqoqIC2dnZamW5ubkAgKysLLVyU1NTPPvss60WGxERkb5JhBDC0EEQERHp4v79+3B0dER1dXWDdceNG4cjR460QlREREQtYh+nTRIRkdHq0KED/P39YWLS8K+zyZMnt0JERERELYfJGxERGbVp06ahoUkklpaWmDhxYitFRERE1DKYvBERkVGbMGECrKys6j1uZmaGCRMmQCaTtWJURERE+sfkjYiIjJqNjQ0mTpwIc3Nzrcdra2sRERHRylERERHpH5M3IiIyelOnTq130RKpVIoxY8a0ckRERET6x+SNiIiMnr+/PxQKhUa5ubk5wsPDYWlpaYCoiIiI9IvJGxERGT1zc3NMnjwZFhYWauXV1dWYOnWqgaIiIiLSLyZvRETULkyZMgVVVVVqZQ4ODhgxYoSBIiIiItIvJm9ERNQu+Pj4wNHRUfWzubk5pk+fDlNTUwNGRUREpD9M3oiIqF0wMTHB9OnTVVMnq6urMWXKFANHRUREpD9M3oiIqN2YPHmyauqkm5sbBg4caOCIiIiI9IfJGxERtRve3t547rnnAAD/8z//A4lEYuCIiIiI9MfM0AEQtUWpqan45JNPDB0GEelAOW3y7NmzCAsLM3A0RKSLffv2GToEojaJI29EWty6dQv79+83dBhE7d6ZM2dw5swZvbb5zDPPwM7ODra2tnpt19jt378ft2/fNnQYRE90+/Zt/v4legKOvBE9Af/yR9SylCNj+v6/9ve//x2jR4/Wa5vGTiKR4J133sGkSZMMHQpRvZKTkxEeHm7oMIjaLI68ERFRu8PEjYiI2iMmb0REREREREaAyRsREREREZER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IzGvX7/eqo+HH37Y3MahQ4dk0qRJEhISIiqVSkaMGCE7duyQUaNGiUqlMtdz9b3V19eLVquV+Ph48fX1FbVaLdnZ2VJRUWGu40zspmX1y8vLJTMz01z/iSeeMNdPT093eLXJwMBAq74VCoWo1Wq57bbb5JlnnpGqqqqrXt/Q0CBz5syRgQMHiq+vr0RGRkpWVpZs27btmp+piFiV5+TkODzmzsTgKK426TngapPUA3C1SSK7dAoREZdmg0T/ATqdDhqNBvzxcL3BgwejtbUVx48f93Yo1A2YpoWuXbvWy5H89ykUCpSVlfGdN+rW+PuXyK61nDZJRC5nMBjQp08fXLp0yaL8zz//xJEjRxyaeklEPdfx48cxYcIEnD17FvX19RZLwQ8ZMgQXLlywuubKegqFwmqLkJ7sq6++QmJiokPTivfs2YOcnByEhoYiODgYY8aMsfmeqbvjefnll1FWVubSfomoa5i8EZFb/P3338jPz8eJEydw/vx57Nq1CxqNBiEhIXjttde8HR4RucmePXswbNgwZGVlISQkBBERERARVFZWms9rtVqr60z19Ho9wsPDISLYvXu3p8N3uSNHjmDChAkoKCgwr3prz88//4wRI0YgODgYf/zxB44dO4aBAwdi1KhR2Lp1q0fjefLJJ1FQUMB/s4m6ESZvRNcRRzZIffPNN7vcT1RUFL7++ms0NTXh7rvvRlhYGCZMmICbbroJu3btwsCBA7t+M0RuEhQUhLvuuuu67b8rzp49i/vuuw/3338/nnvuOavzSqUS4eHhKCkpwerVq70Qoee99tprGDFiBKqqqmzuQflvHR0deOKJJxAaGoqPP/4Y0dHRiIiIwAcffICEhATMmDEDbW1tHosnISEB69evx4IFC6DT6brULxG5BpcEI7qOePIdgszMTPNmz0R0fVi0aBEMBgNef/11m+f9/f1RWlqKe++9F/n5+UhJSUFiYqKHo/SslStXIiAgwKG63333HX7//Xc8//zzFtf06tULU6dOxZtvvony8nLcf//9HokHAJKTkzFlyhS88MILyM3N5WqyRF7GJ29ERETUZSKCFStW4I477kBMTMxV62VnZ+PVV1+F0WhEXl6ezfff/kucSZS++eYbALD5rp+prKKiwmPxmEyePBknT550aJ9PInIvJm9ERNTjNDQ0YM6cOUhISICfnx/CwsIw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f/8S2aVTiHSztYaJugGdTgeNRtPtluIm+q/Jy8sDAKxdu9bLkTju9ttvR319vcdWIHQVhUKBsrIyPPDAA27ro7m5GUlJSRg/fjyWLVvmtn68pampCTExMXj44YexfPlyb4fjkXj27t2LIUOGYNWqVXjwwQfd0se/8fcvkV1rOW2SiIiIXEKtVmPDhg1Yt24diouLvR2OS4kIZs6ciZCQEPzvf//zdjgeiefo0aPIzc1FQUGBRxI3Iro2Jm9ERETkMkOGDMHu3buxadMmnD171tvhuMzp06dx9OhRVFRUdGply54YT0lJCRYsWIAFCxa4pX0icl7va1chIiKioqIivPjii+avFQoF5s2bh/nz53sxqu5pwIABKC8v93YYLhUVFYUffvjB22GYeSKehQsXurV9InIekzciIiIHzJ07F3PnzvV2GEREdB3jtEkiIiIiIqIegMkbERERERFRD8DkjYiIiIiIqAdg8kZERERERNQDcMESIjt0Op23QyD6TzNtdM2fNc/Q6/XeDoHILn6PEtmnEG5hT2RFp9NBo9F4OwwiIqLrEv88JbJpLZM3IiIiIiKi7m8t33kjIiIiIiLqAZi8ERERERER9QBM3oiIiIiIiHoAJm9EREREREQ9wP8BZQdG6jW85QoAAAAASUVORK5CYII=\n","text/plain":"<IPython.core.display.Image object>"},"metadata":{}}]},{"cell_type":"markdown","source":"# 🚅 Train\n\nThis is a simple training pipeline that uses early stopping as regularizer and `WandbCallback` to log the metrics to Weights and Biases.","metadata":{}},{"cell_type":"code","source":"# Callbacks\ncheckpoint = tf.keras.callbacks.ModelCheckpoint(\n    filepath='model_checkpoint.h5',\n    monitor='val_loss',\n    save_best_only=True,\n    save_weights_only=False,\n    mode='min',\n    verbose=1\n)","metadata":{"execution":{"iopub.status.busy":"2023-05-25T07:24:34.225489Z","iopub.execute_input":"2023-05-25T07:24:34.225885Z","iopub.status.idle":"2023-05-25T07:24:34.231869Z","shell.execute_reply.started":"2023-05-25T07:24:34.225842Z","shell.execute_reply":"2023-05-25T07:24:34.230815Z"},"trusted":true},"execution_count":16,"outputs":[]},{"cell_type":"code","source":"tf.keras.backend.clear_session() \nmodel = MRIModel()\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n\nrun = wandb.init(project='brain-tumor-video-classification', \n                 group='EffnetB0-LSTM-512', \n                 job_type='train', \n                 config=CONFIG)\n\n# Train\nhistory = model.fit(trainloader, \n              epochs=CONFIG['EPOCHS'],\n              validation_data=validloader,\n              callbacks=[WandbCallback(),\n                         checkpoint])\n\n# Evaluate\nloss, acc = model.evaluate(validloader)\nwandb.log({'Val Accuracy': round(acc, 3)})\n\nrun.finish()","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-05-25T09:16:23.60125Z","iopub.execute_input":"2023-05-25T09:16:23.601636Z","iopub.status.idle":"2023-05-25T10:45:49.054082Z","shell.execute_reply.started":"2023-05-25T09:16:23.601604Z","shell.execute_reply":"2023-05-25T10:45:49.053001Z"},"trusted":true},"execution_count":20,"outputs":[{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Finishing last run (ID:2kr7rsnh) before initializing another..."},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"<br/>Waiting for W&B process to finish, PID 5073<br/>Program ended successfully."},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"VBox(children=(Label(value=' 0.00MB of 0.00MB uploaded (0.00MB deduped)\\r'), FloatProgress(value=1.0, max=1.0)…","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"00924c232c0d44829ed904c667e2b8e2"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Find user logs for this run at: <code>/kaggle/working/wandb/run-20230525_091519-2kr7rsnh/logs/debug.log</code>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Find internal logs for this run at: <code>/kaggle/working/wandb/run-20230525_091519-2kr7rsnh/logs/debug-internal.log</code>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Synced 5 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"\n                    <br/>Synced <strong style=\"color:#cdcd00\">daily-firefly-14</strong>: <a href=\"https://wandb.ai/helen_ctdh/brain-tumor-video-classification/runs/2kr7rsnh\" target=\"_blank\">https://wandb.ai/helen_ctdh/brain-tumor-video-classification/runs/2kr7rsnh</a><br/>\n                "},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"...Successfully finished last run (ID:2kr7rsnh). Initializing new run:<br/><br/>"},"metadata":{}},{"name":"stderr","text":"\u001b[34m\u001b[1mwandb\u001b[0m: wandb version 0.15.3 is available!  To upgrade, please run:\n\u001b[34m\u001b[1mwandb\u001b[0m:  $ pip install wandb --upgrade\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"\n                Tracking run with wandb version 0.10.33<br/>\n                Syncing run <strong style=\"color:#cdcd00\">winter-dust-15</strong> to <a href=\"https://wandb.ai\" target=\"_blank\">Weights & Biases</a> <a href=\"https://docs.wandb.com/integrations/jupyter.html\" target=\"_blank\">(Documentation)</a>.<br/>\n                Project page: <a href=\"https://wandb.ai/helen_ctdh/brain-tumor-video-classification\" target=\"_blank\">https://wandb.ai/helen_ctdh/brain-tumor-video-classification</a><br/>\n                Run page: <a href=\"https://wandb.ai/helen_ctdh/brain-tumor-video-classification/runs/1wxvqzkx\" target=\"_blank\">https://wandb.ai/helen_ctdh/brain-tumor-video-classification/runs/1wxvqzkx</a><br/>\n                Run data is saved locally in <code>/kaggle/working/wandb/run-20230525_091627-1wxvqzkx</code><br/><br/>\n            "},"metadata":{}},{"name":"stdout","text":"Epoch 1/100\n66/66 [==============================] - 69s 845ms/step - loss: 0.7885 - acc: 0.5429 - val_loss: 0.6999 - val_acc: 0.5186\n\nEpoch 00001: val_loss did not improve from 0.64389\nEpoch 2/100\n66/66 [==============================] - 54s 816ms/step - loss: 0.7065 - acc: 0.4722 - val_loss: 0.6840 - val_acc: 0.5576\n\nEpoch 00002: val_loss did not improve from 0.64389\nEpoch 3/100\n66/66 [==============================] - 54s 810ms/step - loss: 0.6891 - acc: 0.5223 - val_loss: 0.7162 - val_acc: 0.5000\n\nEpoch 00003: val_loss did not improve from 0.64389\nEpoch 4/100\n66/66 [==============================] - 54s 819ms/step - loss: 0.7119 - acc: 0.5121 - val_loss: 0.6692 - val_acc: 0.4864\n\nEpoch 00004: val_loss did not improve from 0.64389\nEpoch 5/100\n66/66 [==============================] - 53s 805ms/step - loss: 0.6827 - acc: 0.5676 - val_loss: 0.6718 - val_acc: 0.5898\n\nEpoch 00005: val_loss did not improve from 0.64389\nEpoch 6/100\n66/66 [==============================] - 54s 820ms/step - loss: 0.6820 - acc: 0.5571 - val_loss: 0.6830 - val_acc: 0.5983\n\nEpoch 00006: val_loss did not improve from 0.64389\nEpoch 7/100\n66/66 [==============================] - 54s 812ms/step - loss: 0.6802 - acc: 0.5635 - val_loss: 0.6786 - val_acc: 0.5678\n\nEpoch 00007: val_loss did not improve from 0.64389\nEpoch 8/100\n66/66 [==============================] - 54s 812ms/step - loss: 0.6745 - acc: 0.5983 - val_loss: 0.6828 - val_acc: 0.5610\n\nEpoch 00008: val_loss did not improve from 0.64389\nEpoch 9/100\n66/66 [==============================] - 54s 811ms/step - loss: 0.6825 - acc: 0.5851 - val_loss: 0.6736 - val_acc: 0.5898\n\nEpoch 00009: val_loss did not improve from 0.64389\nEpoch 10/100\n66/66 [==============================] - 54s 813ms/step - loss: 0.6658 - acc: 0.6107 - val_loss: 0.6648 - val_acc: 0.6119\n\nEpoch 00010: val_loss did not improve from 0.64389\nEpoch 11/100\n66/66 [==============================] - 54s 812ms/step - loss: 0.6810 - acc: 0.5725 - val_loss: 0.6754 - val_acc: 0.5644\n\nEpoch 00011: val_loss did not improve from 0.64389\nEpoch 12/100\n66/66 [==============================] - 54s 812ms/step - loss: 0.6676 - acc: 0.6090 - val_loss: 0.7068 - val_acc: 0.5017\n\nEpoch 00012: val_loss did not improve from 0.64389\nEpoch 13/100\n66/66 [==============================] - 53s 798ms/step - loss: 0.6817 - acc: 0.5688 - val_loss: 0.6989 - val_acc: 0.5305\n\nEpoch 00013: val_loss did not improve from 0.64389\nEpoch 14/100\n66/66 [==============================] - 54s 813ms/step - loss: 0.6660 - acc: 0.6067 - val_loss: 0.6765 - val_acc: 0.5559\n\nEpoch 00014: val_loss did not improve from 0.64389\nEpoch 15/100\n66/66 [==============================] - 53s 801ms/step - loss: 0.6855 - acc: 0.5721 - val_loss: 0.6831 - val_acc: 0.5695\n\nEpoch 00015: val_loss did not improve from 0.64389\nEpoch 16/100\n66/66 [==============================] - 54s 808ms/step - loss: 0.6906 - acc: 0.5547 - val_loss: 0.6847 - val_acc: 0.5525\n\nEpoch 00016: val_loss did not improve from 0.64389\nEpoch 17/100\n66/66 [==============================] - 54s 809ms/step - loss: 0.6923 - acc: 0.5527 - val_loss: 0.6832 - val_acc: 0.5712\n\nEpoch 00017: val_loss did not improve from 0.64389\nEpoch 18/100\n66/66 [==============================] - 54s 811ms/step - loss: 0.6765 - acc: 0.5762 - val_loss: 0.6826 - val_acc: 0.5407\n\nEpoch 00018: val_loss did not improve from 0.64389\nEpoch 19/100\n66/66 [==============================] - 53s 802ms/step - loss: 0.6894 - acc: 0.5466 - val_loss: 0.7012 - val_acc: 0.5203\n\nEpoch 00019: val_loss did not improve from 0.64389\nEpoch 20/100\n66/66 [==============================] - 52s 786ms/step - loss: 0.6875 - acc: 0.5463 - val_loss: 0.6877 - val_acc: 0.5373\n\nEpoch 00020: val_loss did not improve from 0.64389\nEpoch 21/100\n66/66 [==============================] - 53s 798ms/step - loss: 0.6861 - acc: 0.5422 - val_loss: 0.6957 - val_acc: 0.5068\n\nEpoch 00021: val_loss did not improve from 0.64389\nEpoch 22/100\n66/66 [==============================] - 53s 808ms/step - loss: 0.6872 - acc: 0.5474 - val_loss: 0.6842 - val_acc: 0.4881\n\nEpoch 00022: val_loss did not improve from 0.64389\nEpoch 23/100\n66/66 [==============================] - 52s 792ms/step - loss: 0.6833 - acc: 0.5508 - val_loss: 0.6758 - val_acc: 0.5678\n\nEpoch 00023: val_loss did not improve from 0.64389\nEpoch 24/100\n66/66 [==============================] - 53s 809ms/step - loss: 0.6843 - acc: 0.5535 - val_loss: 0.6950 - val_acc: 0.5271\n\nEpoch 00024: val_loss did not improve from 0.64389\nEpoch 25/100\n66/66 [==============================] - 53s 806ms/step - loss: 0.6773 - acc: 0.5720 - val_loss: 0.7011 - val_acc: 0.5254\n\nEpoch 00025: val_loss did not improve from 0.64389\nEpoch 26/100\n66/66 [==============================] - 53s 802ms/step - loss: 0.6767 - acc: 0.5988 - val_loss: 0.6844 - val_acc: 0.5373\n\nEpoch 00026: val_loss did not improve from 0.64389\nEpoch 27/100\n66/66 [==============================] - 53s 804ms/step - loss: 0.6690 - acc: 0.6098 - val_loss: 0.6765 - val_acc: 0.5203\n\nEpoch 00027: val_loss did not improve from 0.64389\nEpoch 28/100\n66/66 [==============================] - 53s 799ms/step - loss: 0.6796 - acc: 0.5616 - val_loss: 0.7278 - val_acc: 0.4712\n\nEpoch 00028: val_loss did not improve from 0.64389\nEpoch 29/100\n66/66 [==============================] - 53s 800ms/step - loss: 0.6715 - acc: 0.5998 - val_loss: 0.6701 - val_acc: 0.5661\n\nEpoch 00029: val_loss did not improve from 0.64389\nEpoch 30/100\n66/66 [==============================] - 53s 808ms/step - loss: 0.6743 - acc: 0.5903 - val_loss: 0.7100 - val_acc: 0.5254\n\nEpoch 00030: val_loss did not improve from 0.64389\nEpoch 31/100\n66/66 [==============================] - 53s 806ms/step - loss: 0.6705 - acc: 0.5934 - val_loss: 0.6936 - val_acc: 0.5407\n\nEpoch 00031: val_loss did not improve from 0.64389\nEpoch 32/100\n66/66 [==============================] - 52s 785ms/step - loss: 0.6698 - acc: 0.5929 - val_loss: 0.6922 - val_acc: 0.5271\n\nEpoch 00032: val_loss did not improve from 0.64389\nEpoch 33/100\n66/66 [==============================] - 52s 789ms/step - loss: 0.6793 - acc: 0.5761 - val_loss: 0.6763 - val_acc: 0.5814\n\nEpoch 00033: val_loss did not improve from 0.64389\nEpoch 34/100\n66/66 [==============================] - 53s 796ms/step - loss: 0.6772 - acc: 0.5753 - val_loss: 0.6878 - val_acc: 0.5644\n\nEpoch 00034: val_loss did not improve from 0.64389\nEpoch 35/100\n66/66 [==============================] - 53s 795ms/step - loss: 0.6682 - acc: 0.5975 - val_loss: 0.6994 - val_acc: 0.5136\n\nEpoch 00035: val_loss did not improve from 0.64389\nEpoch 36/100\n66/66 [==============================] - 53s 803ms/step - loss: 0.6663 - acc: 0.5946 - val_loss: 0.6847 - val_acc: 0.5441\n\nEpoch 00036: val_loss did not improve from 0.64389\nEpoch 37/100\n66/66 [==============================] - 53s 801ms/step - loss: 0.6814 - acc: 0.5582 - val_loss: 0.6715 - val_acc: 0.5644\n\nEpoch 00037: val_loss did not improve from 0.64389\nEpoch 38/100\n66/66 [==============================] - 53s 803ms/step - loss: 0.6856 - acc: 0.5700 - val_loss: 0.7303 - val_acc: 0.5017\n\nEpoch 00038: val_loss did not improve from 0.64389\nEpoch 39/100\n66/66 [==============================] - 53s 804ms/step - loss: 0.6735 - acc: 0.5787 - val_loss: 0.7010 - val_acc: 0.5000\n\nEpoch 00039: val_loss did not improve from 0.64389\nEpoch 40/100\n66/66 [==============================] - 53s 803ms/step - loss: 0.6490 - acc: 0.6381 - val_loss: 0.6742 - val_acc: 0.5949\n\nEpoch 00040: val_loss did not improve from 0.64389\nEpoch 41/100\n66/66 [==============================] - 53s 804ms/step - loss: 0.6608 - acc: 0.6151 - val_loss: 0.7155 - val_acc: 0.5051\n\nEpoch 00041: val_loss did not improve from 0.64389\nEpoch 42/100\n66/66 [==============================] - 53s 798ms/step - loss: 0.6699 - acc: 0.5989 - val_loss: 0.7045 - val_acc: 0.5390\n\nEpoch 00042: val_loss did not improve from 0.64389\nEpoch 43/100\n66/66 [==============================] - 53s 801ms/step - loss: 0.6748 - acc: 0.5955 - val_loss: 0.6757 - val_acc: 0.5780\n\nEpoch 00043: val_loss did not improve from 0.64389\nEpoch 44/100\n66/66 [==============================] - 52s 782ms/step - loss: 0.6379 - acc: 0.6536 - val_loss: 0.7000 - val_acc: 0.5458\n\nEpoch 00044: val_loss did not improve from 0.64389\nEpoch 45/100\n66/66 [==============================] - 52s 792ms/step - loss: 0.6827 - acc: 0.5700 - val_loss: 0.7049 - val_acc: 0.5153\n\nEpoch 00045: val_loss did not improve from 0.64389\nEpoch 46/100\n66/66 [==============================] - 53s 802ms/step - loss: 0.6628 - acc: 0.6142 - val_loss: 0.6974 - val_acc: 0.5797\n\nEpoch 00046: val_loss did not improve from 0.64389\nEpoch 47/100\n66/66 [==============================] - 53s 804ms/step - loss: 0.6718 - acc: 0.6012 - val_loss: 0.6414 - val_acc: 0.6492\n\nEpoch 00047: val_loss improved from 0.64389 to 0.64142, saving model to model_checkpoint.h5\nEpoch 48/100\n66/66 [==============================] - 53s 799ms/step - loss: 0.6614 - acc: 0.5974 - val_loss: 0.6649 - val_acc: 0.6000\n\nEpoch 00048: val_loss did not improve from 0.64142\nEpoch 49/100\n66/66 [==============================] - 53s 806ms/step - loss: 0.6607 - acc: 0.5992 - val_loss: 0.6492 - val_acc: 0.6051\n\nEpoch 00049: val_loss did not improve from 0.64142\nEpoch 50/100\n66/66 [==============================] - 53s 803ms/step - loss: 0.6699 - acc: 0.5668 - val_loss: 0.6693 - val_acc: 0.5864\n\nEpoch 00050: val_loss did not improve from 0.64142\nEpoch 51/100\n66/66 [==============================] - 52s 789ms/step - loss: 0.6629 - acc: 0.5809 - val_loss: 0.6882 - val_acc: 0.5695\n\nEpoch 00051: val_loss did not improve from 0.64142\nEpoch 52/100\n66/66 [==============================] - 53s 803ms/step - loss: 0.6670 - acc: 0.6000 - val_loss: 0.6553 - val_acc: 0.5983\n\nEpoch 00052: val_loss did not improve from 0.64142\nEpoch 53/100\n66/66 [==============================] - 52s 794ms/step - loss: 0.6575 - acc: 0.6120 - val_loss: 0.6965 - val_acc: 0.5305\n\nEpoch 00053: val_loss did not improve from 0.64142\nEpoch 54/100\n66/66 [==============================] - 53s 805ms/step - loss: 0.6413 - acc: 0.6469 - val_loss: 0.6893 - val_acc: 0.5576\n\nEpoch 00054: val_loss did not improve from 0.64142\nEpoch 55/100\n66/66 [==============================] - 53s 798ms/step - loss: 0.6609 - acc: 0.6163 - val_loss: 0.6741 - val_acc: 0.5644\n\nEpoch 00055: val_loss did not improve from 0.64142\nEpoch 56/100\n66/66 [==============================] - 53s 805ms/step - loss: 0.6574 - acc: 0.6114 - val_loss: 0.6876 - val_acc: 0.5559\n\nEpoch 00056: val_loss did not improve from 0.64142\nEpoch 57/100\n66/66 [==============================] - 54s 809ms/step - loss: 0.6501 - acc: 0.6326 - val_loss: 0.7177 - val_acc: 0.4831\n\nEpoch 00057: val_loss did not improve from 0.64142\nEpoch 58/100\n66/66 [==============================] - 54s 810ms/step - loss: 0.6445 - acc: 0.6212 - val_loss: 0.6861 - val_acc: 0.5864\n\nEpoch 00058: val_loss did not improve from 0.64142\nEpoch 59/100\n66/66 [==============================] - 54s 812ms/step - loss: 0.6649 - acc: 0.6132 - val_loss: 0.7209 - val_acc: 0.4949\n\nEpoch 00059: val_loss did not improve from 0.64142\nEpoch 60/100\n66/66 [==============================] - 54s 820ms/step - loss: 0.6634 - acc: 0.5969 - val_loss: 0.7326 - val_acc: 0.5102\n\nEpoch 00060: val_loss did not improve from 0.64142\nEpoch 61/100\n66/66 [==============================] - 53s 808ms/step - loss: 0.6648 - acc: 0.5930 - val_loss: 0.6803 - val_acc: 0.5949\n\nEpoch 00061: val_loss did not improve from 0.64142\nEpoch 62/100\n66/66 [==============================] - 53s 808ms/step - loss: 0.6471 - acc: 0.6372 - val_loss: 0.7135 - val_acc: 0.5373\n\nEpoch 00062: val_loss did not improve from 0.64142\nEpoch 63/100\n66/66 [==============================] - 53s 806ms/step - loss: 0.6652 - acc: 0.5956 - val_loss: 0.7155 - val_acc: 0.5136\n\nEpoch 00063: val_loss did not improve from 0.64142\nEpoch 64/100\n66/66 [==============================] - 54s 810ms/step - loss: 0.6466 - acc: 0.6295 - val_loss: 0.7053 - val_acc: 0.5593\n\nEpoch 00064: val_loss did not improve from 0.64142\nEpoch 65/100\n66/66 [==============================] - 54s 814ms/step - loss: 0.6459 - acc: 0.6397 - val_loss: 0.7128 - val_acc: 0.5441\n\nEpoch 00065: val_loss did not improve from 0.64142\nEpoch 66/100\n66/66 [==============================] - 53s 809ms/step - loss: 0.6478 - acc: 0.6336 - val_loss: 0.6817 - val_acc: 0.6102\n\nEpoch 00066: val_loss did not improve from 0.64142\nEpoch 67/100\n66/66 [==============================] - 53s 807ms/step - loss: 0.6553 - acc: 0.6181 - val_loss: 0.7114 - val_acc: 0.5119\n\nEpoch 00067: val_loss did not improve from 0.64142\nEpoch 68/100\n66/66 [==============================] - 54s 809ms/step - loss: 0.6211 - acc: 0.6699 - val_loss: 0.7439 - val_acc: 0.5153\n\nEpoch 00068: val_loss did not improve from 0.64142\nEpoch 69/100\n66/66 [==============================] - 54s 810ms/step - loss: 0.6489 - acc: 0.6275 - val_loss: 0.6718 - val_acc: 0.5729\n\nEpoch 00069: val_loss did not improve from 0.64142\nEpoch 70/100\n66/66 [==============================] - 54s 810ms/step - loss: 0.6429 - acc: 0.6329 - val_loss: 0.6874 - val_acc: 0.5847\n\nEpoch 00070: val_loss did not improve from 0.64142\nEpoch 71/100\n66/66 [==============================] - 54s 810ms/step - loss: 0.6425 - acc: 0.6434 - val_loss: 0.7657 - val_acc: 0.4678\n\nEpoch 00071: val_loss did not improve from 0.64142\nEpoch 72/100\n66/66 [==============================] - 52s 791ms/step - loss: 0.6835 - acc: 0.5551 - val_loss: 0.7295 - val_acc: 0.4881\n\nEpoch 00072: val_loss did not improve from 0.64142\nEpoch 73/100\n66/66 [==============================] - 54s 810ms/step - loss: 0.6303 - acc: 0.6634 - val_loss: 0.7015 - val_acc: 0.5525\n\nEpoch 00073: val_loss did not improve from 0.64142\nEpoch 74/100\n66/66 [==============================] - 54s 812ms/step - loss: 0.6400 - acc: 0.6392 - val_loss: 0.6919 - val_acc: 0.5424\n\nEpoch 00074: val_loss did not improve from 0.64142\nEpoch 75/100\n66/66 [==============================] - 54s 812ms/step - loss: 0.6489 - acc: 0.6211 - val_loss: 0.7657 - val_acc: 0.4847\n\nEpoch 00075: val_loss did not improve from 0.64142\nEpoch 76/100\n66/66 [==============================] - 54s 811ms/step - loss: 0.6163 - acc: 0.6504 - val_loss: 0.7455 - val_acc: 0.4966\n\nEpoch 00076: val_loss did not improve from 0.64142\nEpoch 77/100\n66/66 [==============================] - 54s 812ms/step - loss: 0.6549 - acc: 0.6348 - val_loss: 0.6873 - val_acc: 0.5627\n\nEpoch 00077: val_loss did not improve from 0.64142\nEpoch 78/100\n66/66 [==============================] - 53s 807ms/step - loss: 0.6459 - acc: 0.6335 - val_loss: 0.7211 - val_acc: 0.4746\n\nEpoch 00078: val_loss did not improve from 0.64142\nEpoch 79/100\n66/66 [==============================] - 53s 808ms/step - loss: 0.6843 - acc: 0.5724 - val_loss: 0.6919 - val_acc: 0.5780\n\nEpoch 00079: val_loss did not improve from 0.64142\nEpoch 80/100\n66/66 [==============================] - 53s 808ms/step - loss: 0.6409 - acc: 0.6419 - val_loss: 0.7310 - val_acc: 0.5593\n\nEpoch 00080: val_loss did not improve from 0.64142\nEpoch 81/100\n66/66 [==============================] - 53s 806ms/step - loss: 0.6479 - acc: 0.6437 - val_loss: 0.6612 - val_acc: 0.6288\n\nEpoch 00081: val_loss did not improve from 0.64142\nEpoch 82/100\n66/66 [==============================] - 53s 801ms/step - loss: 0.6462 - acc: 0.6421 - val_loss: 0.6649 - val_acc: 0.6203\n\nEpoch 00082: val_loss did not improve from 0.64142\nEpoch 83/100\n66/66 [==============================] - 53s 806ms/step - loss: 0.6347 - acc: 0.6468 - val_loss: 0.6879 - val_acc: 0.5559\n\nEpoch 00083: val_loss did not improve from 0.64142\nEpoch 84/100\n66/66 [==============================] - 52s 786ms/step - loss: 0.6294 - acc: 0.6524 - val_loss: 0.7314 - val_acc: 0.4966\n\nEpoch 00084: val_loss did not improve from 0.64142\nEpoch 85/100\n66/66 [==============================] - 53s 803ms/step - loss: 0.6432 - acc: 0.6336 - val_loss: 0.6786 - val_acc: 0.5407\n\nEpoch 00085: val_loss did not improve from 0.64142\nEpoch 86/100\n66/66 [==============================] - 53s 799ms/step - loss: 0.6338 - acc: 0.6538 - val_loss: 0.7260 - val_acc: 0.5186\n\nEpoch 00086: val_loss did not improve from 0.64142\nEpoch 87/100\n66/66 [==============================] - 52s 791ms/step - loss: 0.6294 - acc: 0.6441 - val_loss: 0.7025 - val_acc: 0.5593\n\nEpoch 00087: val_loss did not improve from 0.64142\nEpoch 88/100\n66/66 [==============================] - 53s 794ms/step - loss: 0.6038 - acc: 0.6881 - val_loss: 0.7154 - val_acc: 0.5102\n\nEpoch 00088: val_loss did not improve from 0.64142\nEpoch 89/100\n66/66 [==============================] - 52s 785ms/step - loss: 0.6475 - acc: 0.6209 - val_loss: 0.7032 - val_acc: 0.5339\n\nEpoch 00089: val_loss did not improve from 0.64142\nEpoch 90/100\n66/66 [==============================] - 53s 803ms/step - loss: 0.6107 - acc: 0.6708 - val_loss: 0.7393 - val_acc: 0.5153\n\nEpoch 00090: val_loss did not improve from 0.64142\nEpoch 91/100\n66/66 [==============================] - 53s 802ms/step - loss: 0.6280 - acc: 0.6520 - val_loss: 0.7208 - val_acc: 0.5271\n\nEpoch 00091: val_loss did not improve from 0.64142\nEpoch 92/100\n66/66 [==============================] - 53s 806ms/step - loss: 0.6109 - acc: 0.6801 - val_loss: 0.7497 - val_acc: 0.4695\n\nEpoch 00092: val_loss did not improve from 0.64142\nEpoch 93/100\n66/66 [==============================] - 53s 803ms/step - loss: 0.6430 - acc: 0.6458 - val_loss: 0.7750 - val_acc: 0.5339\n\nEpoch 00093: val_loss did not improve from 0.64142\nEpoch 94/100\n66/66 [==============================] - 53s 802ms/step - loss: 0.6226 - acc: 0.6627 - val_loss: 0.7095 - val_acc: 0.5695\n\nEpoch 00094: val_loss did not improve from 0.64142\nEpoch 95/100\n66/66 [==============================] - 54s 810ms/step - loss: 0.6035 - acc: 0.6824 - val_loss: 0.8861 - val_acc: 0.4864\n\nEpoch 00095: val_loss did not improve from 0.64142\nEpoch 96/100\n66/66 [==============================] - 53s 809ms/step - loss: 0.6525 - acc: 0.6574 - val_loss: 0.7313 - val_acc: 0.5305\n\nEpoch 00096: val_loss did not improve from 0.64142\nEpoch 97/100\n66/66 [==============================] - 53s 800ms/step - loss: 0.6154 - acc: 0.6710 - val_loss: 0.7846 - val_acc: 0.4949\n\nEpoch 00097: val_loss did not improve from 0.64142\nEpoch 98/100\n66/66 [==============================] - 53s 799ms/step - loss: 0.6000 - acc: 0.6698 - val_loss: 0.7145 - val_acc: 0.5780\n\nEpoch 00098: val_loss did not improve from 0.64142\nEpoch 99/100\n66/66 [==============================] - 53s 804ms/step - loss: 0.5979 - acc: 0.6810 - val_loss: 0.7742 - val_acc: 0.5576\n\nEpoch 00099: val_loss did not improve from 0.64142\nEpoch 100/100\n66/66 [==============================] - 52s 789ms/step - loss: 0.5918 - acc: 0.6804 - val_loss: 0.6936 - val_acc: 0.5525\n\nEpoch 00100: val_loss did not improve from 0.64142\n8/8 [==============================] - 3s 297ms/step - loss: 0.6988 - acc: 0.5983\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"<br/>Waiting for W&B process to finish, PID 5151<br/>Program ended successfully."},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"VBox(children=(Label(value=' 88.92MB of 88.92MB uploaded (0.00MB deduped)\\r'), FloatProgress(value=1.0, max=1.…","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"9ffcd75f117941fbbb0f3e352692b6e3"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Find user logs for this run at: <code>/kaggle/working/wandb/run-20230525_091627-1wxvqzkx/logs/debug.log</code>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Find internal logs for this run at: <code>/kaggle/working/wandb/run-20230525_091627-1wxvqzkx/logs/debug-internal.log</code>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"<h3>Run summary:</h3><br/><style>\n    table.wandb td:nth-child(1) { padding: 0 10px; text-align: right }\n    </style><table class=\"wandb\">\n<tr><td>epoch</td><td>99</td></tr><tr><td>loss</td><td>0.60843</td></tr><tr><td>acc</td><td>0.66584</td></tr><tr><td>val_loss</td><td>0.69364</td></tr><tr><td>val_acc</td><td>0.55254</td></tr><tr><td>_runtime</td><td>5350</td></tr><tr><td>_timestamp</td><td>1685011541</td></tr><tr><td>_step</td><td>100</td></tr><tr><td>best_val_loss</td><td>0.64142</td></tr><tr><td>best_epoch</td><td>46</td></tr><tr><td>Val Accuracy</td><td>0.598</td></tr></table>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"<h3>Run history:</h3><br/><style>\n    table.wandb td:nth-child(1) { padding: 0 10px; text-align: right }\n    </style><table class=\"wandb\">\n<tr><td>epoch</td><td>▁▁▁▁▂▂▂▂▂▃▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇███</td></tr><tr><td>loss</td><td>█▅▅▅▅▅▅▅▅▅▅▅▄▄▄▄▄▄▄▄▄▄▃▄▄▃▃▃▄▃▄▅▃▂▂▂▂▂▁▁</td></tr><tr><td>acc</td><td>▁▂▃▃▃▄▄▂▃▁▃▃▅▄▄▄▅▅▅▄▄▅▅▅▅▆▆▆▄▆▅▄▆▇▇▇█▇██</td></tr><tr><td>val_loss</td><td>▄▄▃▃▂▄▃▃▃▂▃▅▃▃▃▄▄▄▃▁▃▃▃▅▃▄▄▂▅▃▃▃▂▅▄▄▆▄█▃</td></tr><tr><td>val_acc</td><td>▃▂▇▅▅▄▅▄▃▆▄▁▄▅▄▂▃▅▆▇▆▅▅▂▇▅▃▆▂▄▅▆█▂▅▄▁▆▂▅</td></tr><tr><td>_runtime</td><td>▁▁▁▂▂▂▂▂▂▃▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▆▆▆▆▆▆▇▇▇▇▇████</td></tr><tr><td>_timestamp</td><td>▁▁▁▂▂▂▂▂▂▃▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▆▆▆▆▆▆▇▇▇▇▇████</td></tr><tr><td>_step</td><td>▁▁▁▁▂▂▂▂▂▃▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇███</td></tr><tr><td>Val Accuracy</td><td>▁</td></tr></table><br/>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Synced 5 W&B file(s), 1 media file(s), 0 artifact file(s) and 1 other file(s)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"\n                    <br/>Synced <strong style=\"color:#cdcd00\">winter-dust-15</strong>: <a href=\"https://wandb.ai/helen_ctdh/brain-tumor-video-classification/runs/1wxvqzkx\" target=\"_blank\">https://wandb.ai/helen_ctdh/brain-tumor-video-classification/runs/1wxvqzkx</a><br/>\n                "},"metadata":{}}]},{"cell_type":"code","source":"def plot_history(history):\n  \"\"\"\n    Plotting training and validation learning curves.\n\n    Args:\n      history: model history with all the metric measures\n  \"\"\"\n  fig, (ax1, ax2) = plt.subplots(2)\n\n  fig.set_size_inches(18.5, 10.5)\n\n  # Plot loss\n  ax1.set_title('Loss')\n  ax1.plot(history.history['loss'], label = 'train')\n  ax1.plot(history.history['val_loss'], label = 'test')\n  ax1.set_ylabel('Loss')\n  \n  # Determine upper bound of y-axis\n  max_loss = max(history.history['loss'] + history.history['val_loss'])\n\n  ax1.set_ylim([0, np.ceil(max_loss)])\n  ax1.set_xlabel('Epoch')\n  ax1.legend(['Train', 'Validation']) \n\n  # Plot accuracy\n  ax2.set_title('Accuracy')\n  ax2.plot(history.history['accuracy'],  label = 'train')\n  ax2.plot(history.history['val_accuracy'], label = 'test')\n  ax2.set_ylabel('Accuracy')\n  ax2.set_ylim([0, 1])\n  ax2.set_xlabel('Epoch')\n  ax2.legend(['Train', 'Validation'])\n\n  plt.show()\n\nplot_history(history)","metadata":{"execution":{"iopub.status.busy":"2023-05-25T09:15:29.416772Z","iopub.status.idle":"2023-05-25T09:15:29.417695Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# WORK IN PROGRESS","metadata":{}}]}