I’m making a model with Keras that tries to predict if a person has Parkinson’s disease based on a drawing of a spiral using this dataset. However, my model is limited to a max train accuracy of 72.22% and a max test accuracy of 66.67% for some reason no matter how many more epochs or layers I add.
For example, this is the result of one model training:
Graph of model accuracy and loss
However, this one was a bit of a special case since most other times the model will initially be at around 50% accuracy for the first 1-2 epochs and then will plateau at 72.22% or will start at 72.22%, dip to around 50%, and then once again plateau at 72.22%.
I’ve tried using different optimizers, more Conv2D and MaxPooling2D layers, and more Dense layers, but none of the things I’ve tried have increased my model’s accuracy.
Also, I’m using the correct loss function and correct number of output neurons, which is why this question is different from some of the other similar ones.
Code
Data collection & normalization:
trainSet = keras.utils.image_dataset_from_directory(DATA_DIR, seed=SEED,
validation_split=0.3, subset="training")
testSet = keras.utils.image_dataset_from_directory(DATA_DIR, seed=SEED,
validation_split=0.3, subset="validation")
trainSet = trainSet.map(lambda img, label: (img / 255, label))
testSet = testSet.map(lambda img, label: (img / 255, label))
Console output:
Found 102 files belonging to 2 classes.
Using 72 files for training.
Data augmentation:
dataAugmentation = keras.models.Sequential()
dataAugmentation.add(keras.layers.InputLayer(shape=(256, 256, 3)))
dataAugmentation.add(keras.layers.RandomFlip())
dataAugmentation.add(keras.layers.RandomZoom(0.2, 0.2))
dataAugmentation.add(keras.layers.RandomRotation(0.2))
Model:
model = keras.models.Sequential()
model.add(dataAugmentation)
model.add(keras.layers.Conv2D(16, 3, activation='relu'))
model.add(keras.layers.MaxPooling2D())
model.add(keras.layers.Conv2D(32, 3, activation='relu'))
model.add(keras.layers.MaxPooling2D())
model.add(keras.layers.Conv2D(16, 3, activation='relu'))
model.add(keras.layers.MaxPooling2D())
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(150, activation='relu'))
model.add(keras.layers.Dense(150, activation='relu'))
model.add(keras.layers.Dense(120, activation='relu'))
model.add(keras.layers.Dense(60, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer=keras.optimizers.Adam(), loss=keras.losses.BinaryCrossentropy(), metrics=['accuracy'])
trainingHistory = model.fit(trainSet, epochs=50, verbose=2)