Codepython
# ==========================
# 1. Import Libraries
# ==========================
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, BatchNormalization
from sklearn.metrics import classification_report, confusion_matrix
# ==========================
# 2. Load Dataset
# ==========================
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print("Training images shape:", x_train.shape)
print("Training labels shape:", y_train.shape)
print("Test images shape:", x_test.shape)
print("Test labels shape:", y_test.shape)
# Flatten labels
y_train = y_train.flatten()
y_test = y_test.flatten()
# ==========================
# 3. Normalize Images
# ==========================
x_train = x_train / 255.0
x_test = x_test / 255.0
# ==========================
# 4. Class Names
# ==========================
class_names = [
'airplane','automobile','bird','cat','deer',
'dog','frog','horse','ship','truck'
]
# ==========================
# 5. Build CNN Model
# ==========================
model = Sequential()
# First Convolution Block
model.add(Conv2D(32, (3,3), activation='relu', padding='same', input_shape=(32,32,3)))
model.add(BatchNormalization())
model.add(Conv2D(32, (3,3), activation='relu'))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.25))
# Second Convolution Block
model.add(Conv2D(64, (3,3), activation='relu', padding='same'))
model.add(BatchNormalization())
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.25))
# Third Convolution Block
model.add(Conv2D(128, (3,3), activation='relu', padding='same'))
model.add(BatchNormalization())
model.add(Conv2D(128, (3,3), activation='relu'))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.25))
# Fully Connected Layer
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
# Output Layer
model.add(Dense(10, activation='softmax'))
# ==========================
# 6. Compile Model
# ==========================
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# ==========================
# 7. Model Summary
# ==========================
model.summary()
# ==========================
# 8. Train Model
# ==========================
history = model.fit(
x_train,
y_train,
epochs=20,
batch_size=64,
validation_split=0.2
)
# ==========================
# 9. Evaluate Model
# ==========================
test_loss, test_accuracy = model.evaluate(x_test, y_test)
print("\nTest Accuracy:", test_accuracy)
# ==========================
# 10. Predictions
# ==========================
y_pred_probs = model.predict(x_test)
y_pred = np.argmax(y_pred_probs, axis=1)
# ==========================
# 11. Classification Report
# ==========================
print("\nClassification Report:\n")
print(classification_report(y_test, y_pred, target_names=class_names))
# ==========================
# 12. Confusion Matrix
# ==========================
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(10,8))
sns.heatmap(cm, annot=True, fmt="d", cmap="Blues",
xticklabels=class_names,
yticklabels=class_names)
plt.xlabel("Predicted")
plt.ylabel("Actual")
plt.title("Confusion Matrix - CIFAR10 CNN")
plt.show()
# ==========================
# 13. Training Curves
# ==========================
plt.figure(figsize=(12,5))
# Accuracy
plt.subplot(1,2,1)
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title("Model Accuracy")
plt.xlabel("Epoch")
plt.ylabel("Accuracy")
plt.legend(["Train","Validation"])
# Loss
plt.subplot(1,2,2)
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title("Model Loss")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.legend(["Train","Validation"])
plt.show()
# ==========================
# 14. Show Sample Predictions
# ==========================
plt.figure(figsize=(10,5))
for i in range(10):
plt.subplot(2,5,i+1)
plt.imshow(x_test[i])
plt.title(class_names[y_pred[i]])
plt.axis("off")
plt.tight_layout()
plt.show()
Output
Training images shape: (50000, 32, 32, 3)
Training labels shape: (50000, 1)
Test images shape: (10000, 32, 32, 3)
Test labels shape: (10000, 1)
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 32, 32, 32) 896
batch_normalization (Batch (None, 32, 32, 32) 128
Normalization)
conv2d_1 (Conv2D) (None, 30, 30, 32) 9248
max_pooling2d (MaxPooling2 (None, 15, 15, 32) 0
D)
dropout (Dropout) (None, 15, 15, 32) 0
conv2d_2 (Conv2D) (None, 15, 15, 64) 18496
batch_normalization_1 (Bat (None, 15, 15, 64) 256
chNormalization)
conv2d_3 (Conv2D) (None, 13, 13, 64) 36928
max_pooling2d_1 (MaxPoolin (None, 6, 6, 64) 0
g2D)
dropout_1 (Dropout) (None, 6, 6, 64) 0
conv2d_4 (Conv2D) (None, 6, 6, 128) 73856
batch_normalization_2 (Bat (None, 6, 6, 128) 512
chNormalization)
conv2d_5 (Conv2D) (None, 4, 4, 128) 147584
max_pooling2d_2 (MaxPoolin (None, 2, 2, 128) 0
g2D)
dropout_2 (Dropout) (None, 2, 2, 128) 0
flatten (Flatten) (None, 512) 0
dense (Dense) (None, 256) 131328
dropout_3 (Dropout) (None, 256) 0
dense_1 (Dense) (None, 10) 2570
=================================================================
Total params: 421802 (1.61 MB)
Trainable params: 421354 (1.61 MB)
Non-trainable params: 448 (1.75 KB)
_________________________________________________________________