{ "cells": [ { "cell_type": "code", "execution_count": 11, "id": "4be470de-020c-4e56-9b8d-1377e2b31e2c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "# %pip install torch pandas torchvision scikit-learn tqdm kaggle torchmetrics -q" ] }, { "cell_type": "code", "execution_count": 1, "id": "e9a6d902-9fe8-47cd-8991-d75f749b6148", "metadata": {}, "outputs": [], "source": [ "# upload kaggle.json first.\n", "!mkdir -p ~/.kaggle\n", "!mv kaggle.json ~/.kaggle/\n", "!chmod 600 ~/.kaggle/kaggle.json" ] }, { "cell_type": "code", "execution_count": 2, "id": "a71ff6d8-54a2-483b-aae2-fdf947305d4a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset URL: https://www.kaggle.com/datasets/nirmalsankalana/sugarcane-leaf-disease-dataset\n", "License(s): CC0-1.0\n" ] } ], "source": [ "# !apt update -qq\n", "# !apt install -qq unzip\n", "!kaggle datasets download nirmalsankalana/sugarcane-leaf-disease-dataset\n", "!unzip -q sugarcane-leaf-disease-dataset.zip -d data" ] }, { "cell_type": "code", "execution_count": 1, "id": "e9a11f4d-c12d-4e5f-aa6e-d37668f4e409", "metadata": {}, "outputs": [], "source": [ "from dataset import get_mean_teacher_dataloaders\n", "\n", "train_loader, test_loader, unlabeled_loader, unlabeled_student_loader = get_mean_teacher_dataloaders('data', 0.2, 16)" ] }, { "cell_type": "code", "execution_count": 2, "id": "1f2be036-3f51-4e18-8b72-e7a7b464f302", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/ubuntu/.local/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from coreplant import Classifier\n", "import torch\n", "\n", "NUM_CLASSES = 5\n", "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", "\n", "student = Classifier(512, 256, NUM_CLASSES).to(device)\n", "teacher = Classifier(512, 256, NUM_CLASSES).to(device)\n", "\n", "# # Synchronize initial weights\n", "teacher.encoder.load_state_dict(student.encoder.state_dict())\n", "teacher.load_state_dict(student.state_dict())" ] }, { "cell_type": "code", "execution_count": 3, "id": "ef1b3cd2-7082-40cb-94ac-a018f39a8463", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 - Train Loss: 0.9669 Acc: 0.5933\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.0751 Acc: 0.7129\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2 - Train Loss: 0.6921 Acc: 0.9534\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.0058 Acc: 0.6337\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3 - Train Loss: 0.5936 Acc: 0.9871\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 0.9520 Acc: 0.7327\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 4 - Train Loss: 0.5735 Acc: 0.9921\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.1093 Acc: 0.7624\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 5 - Train Loss: 0.5805 Acc: 0.9931\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.2088 Acc: 0.6535\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 6 - Train Loss: 0.5997 Acc: 0.9906\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.2791 Acc: 0.6832\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 7 - Train Loss: 0.6033 Acc: 0.9960\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.2851 Acc: 0.7129\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 8 - Train Loss: 0.6383 Acc: 0.9955\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.2957 Acc: 0.7525\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 9 - Train Loss: 0.6469 Acc: 0.9965\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.2491 Acc: 0.7327\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 10 - Train Loss: 0.6597 Acc: 0.9985\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.2907 Acc: 0.7624\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 11 - Train Loss: 0.6739 Acc: 0.9970\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.2727 Acc: 0.7921\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 12 - Train Loss: 0.6986 Acc: 0.9965\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.2876 Acc: 0.8020\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 13 - Train Loss: 0.7012 Acc: 0.9985\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.3070 Acc: 0.6337\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 14 - Train Loss: 0.7089 Acc: 0.9970\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.2998 Acc: 0.7228\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 15 - Train Loss: 0.7142 Acc: 0.9975\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.2990 Acc: 0.7624\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 16 - Train Loss: 0.7181 Acc: 0.9936\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.3175 Acc: 0.7525\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 17 - Train Loss: 0.7199 Acc: 0.9921\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.3741 Acc: 0.6733\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 18 - Train Loss: 0.7261 Acc: 0.9871\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4587 Acc: 0.7525\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 19 - Train Loss: 0.7460 Acc: 0.9856\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.3727 Acc: 0.6931\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 20 - Train Loss: 0.7452 Acc: 0.9851\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4956 Acc: 0.3960\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 21 - Train Loss: 0.7395 Acc: 0.9851\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4490 Acc: 0.5842\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 22 - Train Loss: 0.7491 Acc: 0.9916\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4563 Acc: 0.5347\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 23 - Train Loss: 0.7618 Acc: 0.9921\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.3545 Acc: 0.7525\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 24 - Train Loss: 0.7594 Acc: 0.9896\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4820 Acc: 0.4554\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 25 - Train Loss: 0.7588 Acc: 0.9970\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.5111 Acc: 0.3861\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 26 - Train Loss: 0.7752 Acc: 0.9916\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4428 Acc: 0.5842\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 27 - Train Loss: 0.7753 Acc: 0.9985\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4036 Acc: 0.6931\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 28 - Train Loss: 0.7685 Acc: 0.9965\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4063 Acc: 0.6634\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 29 - Train Loss: 0.7910 Acc: 0.9985\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4430 Acc: 0.4851\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 30 - Train Loss: 0.8158 Acc: 0.9945\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4121 Acc: 0.6634\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 31 - Train Loss: 0.8174 Acc: 0.9975\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4690 Acc: 0.4158\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 32 - Train Loss: 0.8119 Acc: 0.9975\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4666 Acc: 0.4752\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 33 - Train Loss: 0.8281 Acc: 0.9985\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.4412 Acc: 0.6436\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 34 - Train Loss: 0.8392 Acc: 0.9965\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.5037 Acc: 0.3069\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 35 - Train Loss: 0.8356 Acc: 0.9980\n" ] }, { "name": "stderr", "output_type": "stream", "text": [] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Loss: 1.5167 Acc: 0.3168\n", "Best Val Acc: 0.8020\n" ] } ], "source": [ "from train import mean_teacher_train, validate, plot\n", "\n", "student_model, results = mean_teacher_train(student, teacher, train_loader, test_loader, unlabeled_loader,unlabeled_student_loader, NUM_CLASSES)" ] }, { "cell_type": "code", "execution_count": null, "id": "166635ba-574d-40a2-a451-b887d8f7b367", "metadata": {}, "outputs": [], "source": [ "torch.save(student_model.state_dict(), 'models/coreplant_nirmal.pth')" ] }, { "cell_type": "code", "execution_count": 1, "id": "4170e973-bee1-4ad7-83c0-e318bffd2cf3", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/ubuntu/.local/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n", " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "Validation Accuracy: 0.7030\n", "Validation Precision: 0.7306\n", "Validation Recall: 0.7133\n", "Validation F1 Score: 0.7164\n" ] }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from train import validate\n", "from dataset import get_mean_teacher_dataloaders\n", "from coreplant import Classifier\n", "import torch\n", "\n", "NUM_CLASSES = 5\n", "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", "\n", "model = Classifier(512, 256, NUM_CLASSES).to(device)\n", "state_dict = torch.load('models/coreplant_nirmal.pth')\n", "\n", "model.load_state_dict(state_dict)\n", "model.eval()\n", "\n", "train_loader, test_loader, unlabeled_loader, unlabeled_student_loader = get_mean_teacher_dataloaders('data', 0.2, 16)\n", "validate(model, test_loader, NUM_CLASSES)" ] }, { "cell_type": "code", "execution_count": null, "id": "ea16f1e8-4f49-4605-94f1-faba6ca79a5c", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 5 }