{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"tpuV5e8","dataSources":[{"sourceId":21154,"databundleVersionId":1243559,"sourceType":"competition"},{"sourceId":53288259,"sourceType":"kernelVersion"}],"dockerImageVersionId":31153,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# ======================================\n# 🌸 Petals to the Metal - Flower Dataset Loader\n# ======================================\n\nimport tensorflow as tf\nimport tensorflow_datasets as tfds\nimport matplotlib.pyplot as plt\nimport re, math\n\n# Path to dataset (choose resolution)\nGCS_PATH = '/kaggle/input/tpu-getting-started/tfrecords-jpeg-224x224'\n\n# Load TFRecord file paths\nTRAINING_FILENAMES = tf.io.gfile.glob(GCS_PATH + '/train/*.tfrec')\nVALIDATION_FILENAMES = tf.io.gfile.glob(GCS_PATH + '/val/*.tfrec')\nTEST_FILENAMES = tf.io.gfile.glob(GCS_PATH + '/test/*.tfrec')\n\nprint(f\"✅ Files loaded:\")\nprint(f\"Train TFRecords: {len(TRAINING_FILENAMES)}\")\nprint(f\"Val TFRecords:   {len(VALIDATION_FILENAMES)}\")\nprint(f\"Test TFRecords:  {len(TEST_FILENAMES)}\")\n\n# ======================================\n# Function to parse TFRecord files\n# ======================================\nIMAGE_SIZE = [224, 224]\nAUTO = tf.data.experimental.AUTOTUNE\n\ndef read_tfrecord(example):\n    TFREC_FORMAT = {\n        'image': tf.io.FixedLenFeature([], tf.string),\n        'class': tf.io.FixedLenFeature([], tf.int64),\n        'id': tf.io.FixedLenFeature([], tf.string)\n    }\n    example = tf.io.parse_single_example(example, TFREC_FORMAT)\n    image = tf.image.decode_jpeg(example['image'], channels=3)\n    image = tf.image.resize(image, IMAGE_SIZE)\n    label = tf.cast(example['class'], tf.int32)\n    return image, label\n\ndef load_dataset(filenames):\n    dataset = tf.data.TFRecordDataset(filenames, num_parallel_reads=AUTO)\n    dataset = dataset.map(read_tfrecord, num_parallel_calls=AUTO)\n    return dataset\n\n# ======================================\n# Load one batch and display sample\n# ======================================\ntrain_ds = load_dataset(TRAINING_FILENAMES).batch(8)\nimages, labels = next(iter(train_ds))\n\nplt.figure(figsize=(10, 10))\nfor i in range(8):\n    plt.subplot(2, 4, i+1)\n    plt.imshow(images[i].numpy().astype(\"uint8\"))\n    plt.title(f\"Label: {labels[i].numpy()}\")\n    plt.axis('off')\nplt.show()\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-11-03T03:09:45.388539Z","iopub.execute_input":"2025-11-03T03:09:45.388798Z","iopub.status.idle":"2025-11-03T03:10:16.564721Z","shell.execute_reply.started":"2025-11-03T03:09:45.388782Z","shell.execute_reply":"2025-11-03T03:10:16.563814Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ======================================\n# 🌸 Simple Flower Classifier + Submission Generator\n# ======================================\n\nimport tensorflow as tf\nfrom tensorflow.keras import layers, models\nimport pandas as pd\nimport numpy as np\nimport os\n\n# === File paths ===\nDATA_DIR = '/kaggle/input/tpu-getting-started'\nTRAINING_FILENAMES = tf.io.gfile.glob(os.path.join(DATA_DIR, 'tfrecords-jpeg-192x192', 'train/*.tfrec'))\nVALIDATION_FILENAMES = tf.io.gfile.glob(os.path.join(DATA_DIR, 'tfrecords-jpeg-192x192', 'val/*.tfrec'))\nTEST_FILENAMES = tf.io.gfile.glob(os.path.join(DATA_DIR, 'tfrecords-jpeg-192x192', 'test/*.tfrec'))\n\n# === Constants ===\nIMAGE_SIZE = [192, 192]\nBATCH_SIZE = 32\nAUTO = tf.data.experimental.AUTOTUNE\n\n# === TFRecord reader ===\ndef read_tfrecord(example, labeled=True):\n    TFREC_FORMAT = {'image': tf.io.FixedLenFeature([], tf.string), 'id': tf.io.FixedLenFeature([], tf.string)}\n    if labeled:\n        TFREC_FORMAT['class'] = tf.io.FixedLenFeature([], tf.int64)\n    example = tf.io.parse_single_example(example, TFREC_FORMAT)\n    image = tf.image.decode_jpeg(example['image'], channels=3)\n    image = tf.image.resize(image, IMAGE_SIZE)\n    image = tf.cast(image, tf.float32) / 255.0\n    if labeled:\n        return image, tf.cast(example['class'], tf.int32)\n    else:\n        return image, example['id']\n\ndef load_dataset(filenames, labeled=True):\n    dataset = tf.data.TFRecordDataset(filenames, num_parallel_reads=AUTO)\n    dataset = dataset.map(lambda x: read_tfrecord(x, labeled), num_parallel_calls=AUTO)\n    dataset = dataset.batch(BATCH_SIZE).prefetch(AUTO)\n    return dataset\n\n# === Load datasets ===\ntrain_ds = load_dataset(TRAINING_FILENAMES)\nval_ds = load_dataset(VALIDATION_FILENAMES)\ntest_ds = load_dataset(TEST_FILENAMES, labeled=False)\n\n# === Define simple CNN model ===\nmodel = models.Sequential([\n    layers.Input(shape=(*IMAGE_SIZE, 3)),\n    layers.Conv2D(32, (3,3), activation='relu'),\n    layers.MaxPooling2D(),\n    layers.Conv2D(64, (3,3), activation='relu'),\n    layers.MaxPooling2D(),\n    layers.Flatten(),\n    layers.Dense(128, activation='relu'),\n    layers.Dense(104, activation='softmax')\n])\n\nmodel.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n\n# === Train briefly (1 epoch just for submission file) ===\nmodel.fit(train_ds, validation_data=val_ds, epochs=1)\n\n# === Predict on test set ===\npredictions, ids = [], []\nfor imgs, image_ids in test_ds:\n    probs = model.predict(imgs)\n    preds = np.argmax(probs, axis=1)\n    predictions.extend(preds)\n    ids.extend(image_ids.numpy())\n\n# === Create submission.csv ===\nsubmission = pd.DataFrame({'id': [i.decode() for i in ids], 'label': predictions})\nsubmission.to_csv('/kaggle/working/submission.csv', index=False)\nprint(\"✅ submission.csv created successfully at /kaggle/working/submission.csv\")\n","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}