import tensorflow as tf
from tensorflow.keras import layers, models, callbacks
# Step 1: Load and preprocess data using tf.data
def load_and_preprocess(batch_size=32):
(x_train, y_train), (x_val, y_val) = tf.keras.datasets.mnist.load_data()
x_train = x_train.astype('float32') / 255.0
x_val = x_val.astype('float32') / 255.0
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train))
val_ds = tf.data.Dataset.from_tensor_slices((x_val, y_val))
def preprocess(image, label):
image = tf.expand_dims(image, -1) # Add channel dimension
return image, label
train_ds = train_ds.map(preprocess).shuffle(10000).batch(batch_size).prefetch(tf.data.AUTOTUNE)
val_ds = val_ds.map(preprocess).batch(batch_size).prefetch(tf.data.AUTOTUNE)
return train_ds, val_ds
# Step 2: Define the model
def create_model():
model = models.Sequential([
layers.Conv2D(32, 3, activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D(),
layers.Conv2D(64, 3, activation='relu'),
layers.MaxPooling2D(),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
# Step 3: Train and evaluate the model
def train_and_evaluate(batch_size=32, epochs=15):
train_ds, val_ds = load_and_preprocess(batch_size)
model = create_model()
early_stop = callbacks.EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)
history = model.fit(train_ds,
validation_data=val_ds,
epochs=epochs,
callbacks=[early_stop])
val_loss, val_acc = model.evaluate(val_ds, verbose=0)
train_loss, train_acc = model.evaluate(train_ds, verbose=0)
return {
'training_accuracy': train_acc * 100,
'validation_accuracy': val_acc * 100,
'validation_loss': val_loss
}
if __name__ == '__main__':
metrics = train_and_evaluate(batch_size=64, epochs=15)
print(f"Training Accuracy: {metrics['training_accuracy']:.2f}%")
print(f"Validation Accuracy: {metrics['validation_accuracy']:.2f}%")
print(f"Validation Loss: {metrics['validation_loss']:.4f}")