How should I train my CNN with a tiny dataset I'm working on a problem where I aim to classify sections of a track made on the floor using tape, into either left turns, right turns or straight track.
I'm struggling creating a CNN that is not severely overfitting my data. I've tried some augmentation techniques but have come into issues as for example, flipping a right turn makes it become a left turn, crippling the model.
My dataset is only ~450 images so I was wondering what techniques could be employed to help overcome the problem. From what I can tell, the model is severely overfitting the data its given.

I've added one of each image classification to provide an example of the data

Thanks in advance

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size = (img_height,img_width),
    batch_size=batch_size)


val_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset='validation',
    seed=123,
    image_size=(img_height,img_width),
    batch_size=batch_size)


class_names = train_ds.class_names
print(class_names)


AUTOTUNE = tf.data.AUTOTUNE


train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

#normalization_layer = layers.experimental.preprocessing.Rescaling(1./255)



normalized_ds = train_ds.map(lambda x,y: (normalization_layer(x), y))
image_batch, labels_Batch = next(iter(normalized_ds))
first_image = image_batch[0]
print(np.min(first_image), np.max(first_image))

num_classes = 2





model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.summary()




model = Sequential([
                    layers.experimental.preprocessing.Rescaling(1./255, input_shape =(img_height,img_width, 3)),
                    layers.Dropout(0.2),
                    layers.Conv2D(8, 3, padding='same',activation='relu'),
                    layers.MaxPooling2D(),
                    layers.Conv2D(16,3,padding='same', activation='relu'),
                    layers.MaxPooling2D(),
                    layers.Conv2D(32, 3, padding='same',activation='relu'),
                    layers.MaxPooling2D(),
                    layers.Flatten(),
                    layers.Dense(64,activation='relu'),
                    layers.Dense(num_classes)
])
```


You should start from a pre-trained model, replace it's output layer with a 3 class classification layer and finetune your model on your images.
This is a standard procedure. Here's an example in pytorch for you.
You have not stated anything about your methods including but not limited to architecture, augmentations, dropout, regularization, loss, learning rate, optimizer etc. So it's harde to say anything more specific.
