{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"dockerImageVersionId":30775,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install py7zr timm optuna\n\nimport numpy as np\nimport pandas as pd\nfrom py7zr import unpack_7zarchive\nimport shutil\nimport os\n\nfrom fastai.vision.all import *\nimport timm  # To use EfficientNet or other advanced models from the TIMM library\nfrom functools import partial  # Required to create a customized optimizer function\nimport optuna\n\n# Register the .7z format with shutil\ntry:\n    shutil.register_unpack_format('7zip', ['.7z'], unpack_7zarchive)\nexcept shutil.RegistryError:\n    pass  # Ignore if already registered\n\n# Unpack the training data using py7zr\nshutil.unpack_archive('../input/cifar-10/train.7z', '/kaggle/temp/')\n\n# Load the labels\ntrain_labels = pd.read_csv('../input/cifar-10/trainLabels.csv')\nclasses = train_labels['label'].unique()\n\n# Preparing directories for training and validation\ntrain_path = \"/kaggle/temp/train\"\nvalid_path = \"/kaggle/temp/valid\"\n\nos.makedirs(valid_path, exist_ok=True)\nfor class_name in classes:\n    os.makedirs(os.path.join(train_path, class_name), exist_ok=True)\n    os.makedirs(os.path.join(valid_path, class_name), exist_ok=True)\n\n# Split data into training and validation (90/10 split)\nfor _, row in train_labels.iterrows():\n    id = f\"{row['id']}.png\"\n    source_path = os.path.join(train_path, id)\n    if np.random.random() <= 0.9:\n        target_path = os.path.join(train_path, row[\"label\"], id)\n    else:\n        target_path = os.path.join(valid_path, row[\"label\"], id)\n\n    if os.path.exists(source_path):\n        os.replace(source_path, target_path)\n\n# Create the data loaders\ndls = ImageDataLoaders.from_folder(\n    path='/kaggle/temp',\n    train='train',\n    valid='valid',\n    item_tfms=Resize(96),  # Resize images to 96x96 for a balance between efficiency and detail\n    batch_tfms=[*aug_transforms(size=96), Normalize.from_stats(*imagenet_stats)],\n    bs=80  # Set an appropriate batch size\n)\n\n# Define the objective function for hyperparameter tuning\ndef objective(trial):\n    # Suggest hyperparameters for tuning\n    wd = trial.suggest_loguniform('wd', 1e-4, 1e-2)\n    lr = trial.suggest_loguniform('lr', 1e-4, 1e-2)\n    n_epochs = trial.suggest_int('n_epochs', 5, 15)\n\n    # Define the model with sampled hyperparameters\n    learn = vision_learner(\n        dls,\n        \"tf_efficientnet_lite0\",\n        pretrained=False,\n        metrics=accuracy,\n        wd=wd,\n        opt_func=partial(Adam, wd=wd)\n    )\n    learn.loss_func = LabelSmoothingCrossEntropy()\n    learn.to_fp16()  # Enable mixed precision for faster training\n\n    # Train the model and return validation loss\n    learn.fit_one_cycle(n_epochs, lr_max=lr)\n    return learn.validate()[1]  # Return validation loss\n\n\n# Adjusted hyperparameters\nbest_lr = 5e-3  # Increased learning rate for faster convergence\nbest_epochs = 70  # Reduced epochs to finish in less than 6 hours\nbest_wd = 1e-4  # Slightly higher weight decay for better regularization\n\n# Train the final model with the best parameters\nlearn = vision_learner(\n    dls,\n    \"tf_efficientnet_lite0\",\n    pretrained=False,\n    metrics=accuracy,\n    wd=best_wd,\n    opt_func=partial(Adam, wd=best_wd)\n)\nlearn.loss_func = LabelSmoothingCrossEntropy()\nlearn.to_fp16()  # Enable mixed precision for faster training\n\n# Add Early Stopping Callback to avoid overfitting and speed up training if convergence is reached early\nearly_stopping_cb = EarlyStoppingCallback(monitor='valid_loss', patience=3)\n\n# Train with best parameters\nlearn.fit_one_cycle(best_epochs, lr_max=best_lr, cbs=[early_stopping_cb])\n\n# Save the model\nlearn.save('/kaggle/working/final_model')\n\n# Unpack the test dataset using py7zr\nshutil.unpack_archive('../input/cifar-10/test.7z', '/kaggle/temp/test')\n\n# Make predictions on the test set\ntest_path = '/kaggle/temp/test/test'\nf = os.listdir(test_path)\ntest_images = [os.path.join(test_path, s) for s in f]\ntest_dl = learn.dls.test_dl(test_images)\nclass_score, _ = learn.get_preds(dl=test_dl)\n\n# Process predictions\nclass_score = np.argmax(class_score, axis=1)\nclassScore = class_score.tolist()\n\n# Map predictions to class names\nclasses_dict = {0: 'airplane', 1: 'automobile', 2: 'bird', 3: 'cat', 4: 'deer', 5: 'dog', 6: 'frog', 7: 'horse', 8: 'ship', 9: 'truck'}\npredicted_classes = np.array([classes_dict[i] for i in classScore], dtype=np.dtype('U20'))\n\n# Create submission file\ndirectory = '/kaggle/temp/test/test'\nImageId = [''.join(filter(str.isdigit, name)) for name in os.listdir(directory)]\nsubmission = pd.DataFrame({\n    \"id\": ImageId,\n    \"label\": predicted_classes\n})\n\n# Save submission file\nsubmission.to_csv(\"/kaggle/working/submission.csv\", index=False)\n\n# Save the model\nlearn.export('/kaggle/working/vision_model.pkl')","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}