{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# **Libarary Download**","metadata":{}},{"cell_type":"code","source":"!pip install py7zr","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Copy files from Input directory to Working directory**","metadata":{}},{"cell_type":"code","source":"import py7zr\nimport os\n\n# Define paths to the .7z files\ntrain_7z_path = '/kaggle/input/cifar-10/train.7z'\ntest_7z_path = '/kaggle/input/cifar-10/test.7z'\n\n# Define extraction directory\nextract_dir = '/kaggle/working'\n\n# Function to extract .7z files\ndef extract_7z(archive_path, output_dir):\n    with py7zr.SevenZipFile(archive_path, mode='r') as archive:\n        archive.extractall(path=output_dir)\n\n# Extract train.7z and test.7z\nextract_7z(train_7z_path, extract_dir)\nextract_7z(test_7z_path, extract_dir)\n\nprint(\"Extraction complete.\")\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Show some sample images from Datasets**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt\nimport os\nfrom PIL import Image\n\n# Define paths\ntrain_labels_path = '/kaggle/input/cifar-10/trainLabels.csv'\ntrain_images_dir = '/kaggle/working/train'\n\n# Load train labels\ntrain_labels = pd.read_csv(train_labels_path)\n\n# Display first 10 images (2 rows, 5 columns)\nfig, axes = plt.subplots(2, 5, figsize=(15, 6))\n\n# Iterate over the first 10 images\nfor i, ax in enumerate(axes.flat):\n    img_name = train_labels.iloc[i]['id']  # Get image id from CSV\n    img_label = train_labels.iloc[i]['label']  # Get corresponding label\n    img_path = os.path.join(train_images_dir, f\"{img_name}.png\")  # Image file path\n\n    # Load and display the image\n    img = Image.open(img_path)\n    ax.imshow(img)\n    ax.set_title(f\"{img_label}\")\n    ax.axis('off')  # Hide the axes\n\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Libarary Download**","metadata":{}},{"cell_type":"code","source":"!pip install tensorflow","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Organizing Images**","metadata":{}},{"cell_type":"code","source":"import os\nimport shutil\nimport pandas as pd\n\n# Define paths\ntrain_images_dir = '/kaggle/working/train'  # Update if using a different path\ntrain_labels_path = '/kaggle/input/cifar-10/trainLabels.csv'  # Update with the correct path\n\n# Function to organize images into class directories\ndef organize_images(base_dir, labels_file):\n    labels = pd.read_csv(labels_file)\n    for _, row in labels.iterrows():\n        class_dir = os.path.join(base_dir, row['label'])\n        if not os.path.exists(class_dir):\n            os.makedirs(class_dir)\n        img_file = os.path.join(base_dir, f\"{row['id']}.png\")\n        if os.path.exists(img_file):\n            shutil.move(img_file, os.path.join(class_dir, f\"{row['id']}.png\"))\n\n# Organize images into directories\norganize_images(train_images_dir, train_labels_path)\n\n# Verify directory structure\nprint(\"Directory structure:\")\nfor root, dirs, files in os.walk(train_images_dir):\n    if dirs:\n        for d in dirs:\n            print(f\"Class directory {d} contains {len(os.listdir(os.path.join(root, d)))} images\")\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Data Augmentation and Model Definition**","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, GlobalAveragePooling2D\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.applications import ResNet50\n\n# Set up MirroredStrategy\nstrategy = tf.distribute.MirroredStrategy()\n\n# Data Augmentation and Normalization\ndef create_datagen():\n    datagen = ImageDataGenerator(\n        rescale=1./255,  # Normalize pixel values\n        rotation_range=20,  # Data Augmentation\n        width_shift_range=0.2,\n        height_shift_range=0.2,\n        shear_range=0.2,\n        zoom_range=0.2,\n        horizontal_flip=True,\n        fill_mode='nearest',\n        validation_split=0.2  # Split for validation\n    )\n    return datagen\n\n# Create Data Generators\ndatagen = create_datagen()\ntrain_generator = datagen.flow_from_directory(\n    directory=train_images_dir,\n    target_size=(224, 224),  # Adjust size according to model\n    batch_size=32,\n    class_mode='categorical',\n    shuffle=True,\n    subset='training'  # Training set\n)\nvalidation_generator = datagen.flow_from_directory(\n    directory=train_images_dir,\n    target_size=(224, 224),\n    batch_size=32,\n    class_mode='categorical',\n    subset='validation'  # Validation set\n)\n\n# Define and compile the model within the strategy scope\nwith strategy.scope():\n    base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))\n    model = Sequential([\n        base_model,\n        GlobalAveragePooling2D(),\n        Dense(train_generator.num_classes, activation='softmax')\n    ])\n    \n    model.compile(optimizer=Adam(learning_rate=1e-4), loss='categorical_crossentropy', metrics=['accuracy'])\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Training the Model**","metadata":{}},{"cell_type":"code","source":"# Train the model\nhistory = model.fit(\n    train_generator,\n    epochs=10,\n    steps_per_epoch=train_generator.samples // train_generator.batch_size,\n    validation_data=validation_generator,\n    validation_steps=validation_generator.samples // validation_generator.batch_size\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Save the trained model","metadata":{}},{"cell_type":"code","source":"model.save('/kaggle/working/model.keras')  # Save in Keras format\nprint(\"Model saved to /kaggle/working/model.keras\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Plot Training and Validation Loss/Accuracy**","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# Plot training & validation accuracy/loss graphs\ndef plot_training(history):\n    # Plot the training and validation accuracy and loss at each epoch\n    acc = history.history['accuracy']\n    val_acc = history.history['val_accuracy']\n    loss = history.history['loss']\n    val_loss = history.history['val_loss']\n\n    epochs = range(1, len(acc) + 1)\n\n    plt.figure(figsize=(14, 5))\n    \n    plt.subplot(1, 2, 1)\n    plt.plot(epochs, acc, 'b', label='Training accuracy')\n    plt.plot(epochs, val_acc, 'r', label='Validation accuracy')\n    plt.title('Training and validation accuracy')\n    plt.legend()\n\n    plt.subplot(1, 2, 2)\n    plt.plot(epochs, loss, 'b', label='Training loss')\n    plt.plot(epochs, val_loss, 'r', label='Validation loss')\n    plt.title('Training and validation loss')\n    plt.legend()\n\n    plt.show()\n\nplot_training(history)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Predict on Test Set and Create Submission File**","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom tensorflow.keras.preprocessing import image\n\n# Define paths\ntest_images_dir = '/kaggle/working/test'  # Update with the correct path\nsample_submission_path = '/kaggle/input/cifar-10/sampleSubmission.csv'  # Update with the correct path\n\n# Load images manually\ntest_image_paths = [os.path.join(test_images_dir, f) for f in os.listdir(test_images_dir) if f.endswith('.png')]\n\ntest_images = []\nfor img_path in test_image_paths:\n    img = image.load_img(img_path, target_size=(224, 224))\n    img = image.img_to_array(img)\n    img = np.expand_dims(img, axis=0)\n    img = img / 255.0  # Normalize\n    test_images.append(img)\n\ntest_images = np.vstack(test_images)\n\n# Predict classes\npredictions = model.predict(test_images)\npredicted_class_indices = np.argmax(predictions, axis=1)\n\n# Map indices to class labels\nlabels = (train_generator.class_indices)\nlabels = dict((v,k) for k,v in labels.items())\npredicted_labels = [labels[k] for k in predicted_class_indices]\n\n# Create the submission file\nids = [int(os.path.splitext(os.path.basename(f))[0]) for f in test_image_paths]\nsubmission_df = pd.DataFrame({\"id\": ids, \"label\": predicted_labels})\nsubmission_df.to_csv(\"sampleSubmission.csv\", index=False)\nprint(\"Submission file created: sampleSubmission.csv\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Display Test Images with Predictions**","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# Display 10 test images with predictions\nplt.figure(figsize=(20, 10))\nfor i, img_path in enumerate(test_image_paths[:10]):\n    img = image.load_img(img_path, target_size=(224, 224))\n    plt.subplot(2, 5, i+1)\n    plt.imshow(img)\n    plt.title(f\"Pred: {predicted_labels[i]}\")\n    plt.axis('off')\nplt.show()","metadata":{},"execution_count":null,"outputs":[]}]}