from tensorflow.keras.utils import image_dataset_from_directory from tensorflow.keras import Sequential from tensorflow.keras.layers import ( Dense, Conv2D, MaxPooling2D, Flatten, BatchNormalization, Dropout, ) from utils import plot_accuracy, plot_loss, process import numpy as np from sklearn.metrics import classification_report train_ds = image_dataset_from_directory( directory="sports-classification/train", labels="inferred", label_mode="int", batch_size=64, image_size=(256, 256), ) validation_ds = image_dataset_from_directory( directory="sports-classification/valid", labels="inferred", label_mode="int", batch_size=64, image_size=(256, 256), ) test_ds = image_dataset_from_directory( directory="sports-classification/test", labels="inferred", label_mode="int", batch_size=64, image_size=(256, 256), ) train_ds = train_ds.map(process) validation_ds = validation_ds.map(process) test_ds = test_ds.map(process) model = Sequential() model.add( Conv2D( 128, kernel_size=(3, 3), padding="valid", activation="leaky_relu", input_shape=(256, 256, 3), ) ) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2), strides=2, padding="valid")) model.add(Conv2D(64, kernel_size=(3, 3), padding="valid", activation="leaky_relu")) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2), strides=2, padding="valid")) model.add(Conv2D(32, kernel_size=(3, 3), padding="valid", activation="leaky_relu")) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2), strides=2, padding="valid")) model.add(Flatten()) model.add(Dense(512, activation="leaky_relu")) model.add(Dropout(0.1)) model.add(Dense(256, activation="leaky_relu")) model.add(Dropout(0.1)) model.add(Dense(128, activation="leaky_relu")) model.add(Dropout(0.1)) model.add(Dense(100, activation="softmax")) model.compile( optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"] ) callback = tf.keras.callbacks.EarlyStopping(monitor="loss", patience=2) history = model.fit( train_ds, epochs=50, batch_size=32, callbacks=[callback], validation_data=validation_ds, ) plot_loss(history) plot_accuracy(history) y_pred = np.array([]) y_true = np.array([]) for x, y in test_ds: y_pred = np.concatenate([y_pred, model.predict_classes(x)]) y_true = np.concatenate([y_true, np.argmax(y.numpy(), axis=-1)]) print("Classification Report: \n", classification_report(y_pred, y_true))