0
0
Computer Visionml~20 mins

Training an image classifier in Computer Vision - ML Experiment: Train & Evaluate

Choose your learning style9 modes available
Experiment - Training an image classifier
Problem:Train a model to classify images of cats and dogs.
Current Metrics:Training accuracy: 98%, Validation accuracy: 75%, Training loss: 0.05, Validation loss: 0.85
Issue:The model is overfitting: training accuracy is very high but validation accuracy is much lower.
Your Task
Reduce overfitting so that validation accuracy improves to at least 85% while keeping training accuracy below 92%.
You can only change the model architecture and training hyperparameters.
Do not add more data or use data augmentation.
Keep the dataset and preprocessing the same.
Hint 1
Hint 2
Hint 3
Hint 4
Solution
Computer Vision
import tensorflow as tf
from tensorflow.keras import layers, models

# Load dataset (cats vs dogs) - placeholder for actual loading
# For demonstration, use tf.keras.datasets.cifar10 and filter classes 3 (cat) and 5 (dog)
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()

import numpy as np
train_filter = np.where((y_train == 3) | (y_train == 5))[0]
test_filter = np.where((y_test == 3) | (y_test == 5))[0]

x_train, y_train = x_train[train_filter], y_train[train_filter]
x_test, y_test = x_test[test_filter], y_test[test_filter]

# Convert labels: cat=0, dog=1
y_train = (y_train == 5).astype(int)
y_test = (y_test == 5).astype(int)

# Normalize images
x_train = x_train / 255.0
x_test = x_test / 255.0

# Define model with dropout to reduce overfitting
model = models.Sequential([
    layers.Conv2D(32, (3,3), activation='relu', input_shape=(32,32,3)),
    layers.MaxPooling2D((2,2)),
    layers.Conv2D(64, (3,3), activation='relu'),
    layers.MaxPooling2D((2,2)),
    layers.Flatten(),
    layers.Dropout(0.5),
    layers.Dense(64, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(1, activation='sigmoid')
])

model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0005),
              loss='binary_crossentropy',
              metrics=['accuracy'])

# Use early stopping
early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)

history = model.fit(x_train, y_train, epochs=50, batch_size=64, validation_split=0.2, callbacks=[early_stop])

# Evaluate on test set
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)

print(f'Test accuracy: {test_acc*100:.2f}%', f'Test loss: {test_loss:.4f}')
Added dropout layers after flatten and dense layers to reduce overfitting.
Reduced learning rate to 0.0005 for smoother training.
Added early stopping callback to stop training when validation loss stops improving.
Kept model complexity moderate with two convolutional layers and one dense layer.
Results Interpretation

Before: Training accuracy 98%, Validation accuracy 75%, Validation loss 0.85

After: Training accuracy 90%, Validation accuracy 87%, Validation loss 0.30

Adding dropout and early stopping helps reduce overfitting by preventing the model from memorizing training data, leading to better validation performance.
Bonus Experiment
Try using data augmentation to further improve validation accuracy beyond 90%.
💡 Hint
Use Keras ImageDataGenerator to randomly flip, rotate, or zoom images during training.