Overfitting can still happen even with dropout and early stopping if the model capacity is too high or the data is limited.
You can combine multiple strategies instead of relying on just those two:
import tensorflow as tf
from tensorflow.keras import layers, models, regularizers
model = models.Sequential([
layers.Dense(128, activation='relu',
kernel_regularizer=regularizers.l2(0.001)),
layers.BatchNormalization(),
layers.Dropout(0.5),
layers.Dense(64, activation='relu',
kernel_regularizer=regularizers.l2(0.001)),
layers.BatchNormalization(),
layers.Dropout(0.5),
layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
early_stop = tf.keras.callbacks.EarlyStopping(
monitor='val_loss',
patience=5,
restore_best_weights=True
)
history = model.fit(
X_train, y_train,
validation_data=(X_val, y_val),
epochs=100,
batch_size=32,
callbacks=[early_stop]
)
Key things added here:
-
L2 regularization to penalize large weights
-
Batch normalization for more stable learning
-
Reduced layer size to limit model complexity
Also worth checking:
-
Data leakage between train and validation
-
Feature quality and noise
-
Whether your dataset is large enough for the model
Sometimes the fix isn’t more regularization, it’s a simpler model or better data.

Be the first to post a comment.