{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[],"dockerImageVersionId":31192,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nimport tensorflow_datasets as tfds\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom sklearn.metrics import precision_score, recall_score, f1_score\n\n\ntfds.disable_progress_bar()\n\n(ds_train, ds_test), ds_info = tfds.load(\n    'tf_flowers',\n    split=['train[:80%]', 'train[80%:]'],\n    with_info=True,\n    as_supervised=True\n)\n\nIMG_SIZE = (128, 128)\nBATCH_SIZE = 64\n\ndef preprocess(image, label):\n    image = tf.image.resize(image, IMG_SIZE)\n    image = tf.cast(image, tf.float32) / 255.0\n    return image, label\n\ntrain_ds = ds_train.map(preprocess).cache().shuffle(1000).batch(BATCH_SIZE).prefetch(1)\ntest_ds  = ds_test.map(preprocess).batch(BATCH_SIZE).prefetch(1)\n\nmodel = tf.keras.Sequential([\n    tf.keras.layers.Conv2D(64, 3, activation='relu', input_shape=(128,128,3)),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.MaxPooling2D(),\n    \n    tf.keras.layers.Conv2D(128, 3, activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.MaxPooling2D(),\n    \n    tf.keras.layers.Conv2D(256, 3, activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.MaxPooling2D(),\n    \n    tf.keras.layers.Conv2D(256, 3, activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.GlobalAveragePooling2D(),\n    \n    tf.keras.layers.Dense(512, activation='relu'),\n    tf.keras.layers.Dropout(0.5),\n    tf.keras.layers.Dense(102, activation='softmax')\n])\n\nmodel.compile(\n    optimizer=tf.keras.optimizers.Adam(0.001),\n    loss='sparse_categorical_crossentropy',\n    metrics=['accuracy']\n)\n\nhistory = model.fit(train_ds, epochs=25, validation_data=test_ds)\n\n# Final evaluation \ntest_loss, test_acc = model.evaluate(test_ds, verbose=0)\nprint(f\"Test Accuracy: {test_acc:.4f}\")\n\n# Get predictions for metrics\ny_true = np.concatenate([y for x, y in test_ds], axis=0)\ny_pred = np.argmax(model.predict(test_ds, verbose=0), axis=1)\n\nprecision = precision_score(y_true, y_pred, average='macro')\nrecall    = recall_score(y_true, y_pred, average='macro')\nf1        = f1_score(y_true, y_pred, average='macro')\n\nprint(f\"Precision: {precision:.4f}\")\nprint(f\"Recall:    {recall:.4f}\")\nprint(f\"F1:        {f1:.4f}\")\n\n# Plots\nplt.figure(figsize=(12,4))\nplt.subplot(1,2,1); plt.plot(history.history['accuracy'], label='Train'); plt.plot(history.history['val_accuracy'], label='Val'); plt.legend(); plt.title('Accuracy')\nplt.subplot(1,2,2); plt.plot(history.history['loss'], label='Train'); plt.plot(history.history['val_loss'], label='Val'); plt.legend(); plt.title('Loss')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-19T16:08:56.705804Z","iopub.execute_input":"2025-11-19T16:08:56.706043Z","iopub.status.idle":"2025-11-19T16:11:23.281987Z","shell.execute_reply.started":"2025-11-19T16:08:56.706024Z","shell.execute_reply":"2025-11-19T16:11:23.281317Z"}},"outputs":[],"execution_count":null}]}