import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.utils import to_categorical
# Load data
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# Normalize images
x_train, x_test = x_train / 255.0, x_test / 255.0
# Convert labels to categorical
num_classes = 10
y_train_cat = to_categorical(y_train, num_classes)
y_test_cat = to_categorical(y_test, num_classes)
# Define a simple CNN model
model = Sequential([
Conv2D(32, (3,3), activation='relu', input_shape=(32,32,3)),
MaxPooling2D((2,2)),
Conv2D(64, (3,3), activation='relu'),
MaxPooling2D((2,2)),
Flatten(),
Dense(64, activation='relu'),
Dense(num_classes, activation='softmax')
])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# Train model briefly for demonstration
model.fit(x_train, y_train_cat, epochs=3, batch_size=64, validation_split=0.1, verbose=0)
# Evaluate top-1 accuracy
loss, top1_acc = model.evaluate(x_test, y_test_cat, verbose=0)
# Calculate top-3 accuracy
# Use tf.keras.metrics.TopKCategoricalAccuracy
top3_acc_metric = tf.keras.metrics.TopKCategoricalAccuracy(k=3)
top3_acc_metric.update_state(y_test_cat, model.predict(x_test, verbose=0))
top3_acc = top3_acc_metric.result().numpy()
print(f"Top-1 accuracy on test set: {top1_acc*100:.2f}%")
print(f"Top-3 accuracy on test set: {top3_acc*100:.2f}%")