I am new to AI & ML and trying to develop a model to classify a set of MRI scan images of brain tumors. It has two classes(‘Healthy’ and ‘Tumor’). My data set has 4600 images (2087 for Healthy,2513 for Tumor). I use 15 epochs, The accuracy is increasing gradually. But the validation loss and validation accuracy is going up and down. I feel it is because the model is overfitting. How can I improve my model to perform well? Thank you.
This is how I split data for training and validation.
<code>training_data, validation_data = tf.keras.utils.image_dataset_from_directory(data_dir,
<code>training_data, validation_data = tf.keras.utils.image_dataset_from_directory(data_dir,
batch_size=32,
image_size=(128, 128),
validation_split=.2,
subset='both',
seed=42)
</code>
training_data, validation_data = tf.keras.utils.image_dataset_from_directory(data_dir,
batch_size=32,
image_size=(128, 128),
validation_split=.2,
subset='both',
seed=42)
Output :
Found 4514 files belonging to 2 classes.
Using 3612 files for training.
Using 902 files for validation.
This is how images looks like
Here I rescale the data
<code>training_data = training_data.map(lambda x,y: (x/255,y))
validation_data = validation_data.map(lambda x,y: (x/255,y))
<code>training_data = training_data.map(lambda x,y: (x/255,y))
validation_data = validation_data.map(lambda x,y: (x/255,y))
</code>
training_data = training_data.map(lambda x,y: (x/255,y))
validation_data = validation_data.map(lambda x,y: (x/255,y))
I did Data augmentation as follows
<code>data_augmentation = tf.keras.Sequential(
tf.keras.layers.RandomFlip("horizontal"),
tf.keras.layers.RandomRotation(0.2),
tf.keras.layers.RandomZoom(0.2),
<code>data_augmentation = tf.keras.Sequential(
[
tf.keras.layers.RandomFlip("horizontal"),
tf.keras.layers.RandomRotation(0.2),
tf.keras.layers.RandomZoom(0.2),
])
</code>
data_augmentation = tf.keras.Sequential(
[
tf.keras.layers.RandomFlip("horizontal"),
tf.keras.layers.RandomRotation(0.2),
tf.keras.layers.RandomZoom(0.2),
])
This is my model
<code>model = tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer(shape=(128, 128, 3)))
model.add(data_augmentation)
model.add(tf.keras.layers.Conv2D(32, kernel_size=3, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.MaxPooling2D(2, 2)),
model.add(tf.keras.layers.Conv2D(64, kernel_size=3, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.MaxPooling2D(2, 2)),
model.add(tf.keras.layers.Conv2D(128, kernel_size=3, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.MaxPooling2D(2, 2)),
model.add(tf.keras.layers.Flatten()),
model.add(tf.keras.layers.Dense(128, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.Dropout(0.3)),
model.add(tf.keras.layers.Dense(32, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.Dropout(0.3)),
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
<code>model = tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer(shape=(128, 128, 3)))
model.add(data_augmentation)
model.add(tf.keras.layers.Conv2D(32, kernel_size=3, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.MaxPooling2D(2, 2)),
model.add(tf.keras.layers.Conv2D(64, kernel_size=3, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.MaxPooling2D(2, 2)),
model.add(tf.keras.layers.Conv2D(128, kernel_size=3, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.MaxPooling2D(2, 2)),
model.add(tf.keras.layers.Flatten()),
model.add(tf.keras.layers.Dense(128, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.Dropout(0.3)),
model.add(tf.keras.layers.Dense(32, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.Dropout(0.3)),
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
</code>
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer(shape=(128, 128, 3)))
model.add(data_augmentation)
model.add(tf.keras.layers.Conv2D(32, kernel_size=3, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.MaxPooling2D(2, 2)),
model.add(tf.keras.layers.Conv2D(64, kernel_size=3, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.MaxPooling2D(2, 2)),
model.add(tf.keras.layers.Conv2D(128, kernel_size=3, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.MaxPooling2D(2, 2)),
model.add(tf.keras.layers.Flatten()),
model.add(tf.keras.layers.Dense(128, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.Dropout(0.3)),
model.add(tf.keras.layers.Dense(32, activation='relu')),
model.add(tf.keras.layers.BatchNormalization()),
model.add(tf.keras.layers.Dropout(0.3)),
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))