{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install tez==0.2.0","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-03-23T09:44:36.708572Z","iopub.execute_input":"2022-03-23T09:44:36.708886Z","iopub.status.idle":"2022-03-23T09:44:45.93797Z","shell.execute_reply.started":"2022-03-23T09:44:36.708835Z","shell.execute_reply":"2022-03-23T09:44:45.937168Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport albumentations\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport numpy as np\n\nimport tez\nfrom tez.datasets import ImageDataset\nfrom tez.callbacks import EarlyStopping\n\nimport torch\nimport torch.nn as nn\n\nimport torchvision\n\nfrom sklearn import metrics, model_selection\n%matplotlib inline","metadata":{"execution":{"iopub.status.busy":"2022-03-23T09:44:45.943532Z","iopub.execute_input":"2022-03-23T09:44:45.944145Z","iopub.status.idle":"2022-03-23T09:44:49.921533Z","shell.execute_reply.started":"2022-03-23T09:44:45.944085Z","shell.execute_reply":"2022-03-23T09:44:49.920821Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"I have used resized(512x512) image of @konradb.\n\nHere is the link:[https://www.kaggle.com/konradb/ultramnist-resized-512](http://) of this dataset.","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv('../input/ultra-mnist/train.csv')","metadata":{"execution":{"iopub.status.busy":"2022-03-23T09:44:49.923208Z","iopub.execute_input":"2022-03-23T09:44:49.923679Z","iopub.status.idle":"2022-03-23T09:44:49.955395Z","shell.execute_reply.started":"2022-03-23T09:44:49.923642Z","shell.execute_reply":"2022-03-23T09:44:49.954725Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.digit_sum.value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-03-23T09:44:49.958174Z","iopub.execute_input":"2022-03-23T09:44:49.95879Z","iopub.status.idle":"2022-03-23T09:44:49.973828Z","shell.execute_reply.started":"2022-03-23T09:44:49.958746Z","shell.execute_reply":"2022-03-23T09:44:49.973152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv(\"../input/ultra-mnist/train.csv\")\ndf[\"kfold\"] = -1    \ndf = df.sample(frac=1).reset_index(drop=True)\ny = df.digit_sum.values\nkf = model_selection.KFold(n_splits=5)\n\nfor f, (t_, v_) in enumerate(kf.split(X=df)):\n    df.loc[v_, 'kfold'] = f\n\ndf.to_csv(\"train_folds.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-03-23T09:44:49.976056Z","iopub.execute_input":"2022-03-23T09:44:49.976302Z","iopub.status.idle":"2022-03-23T09:44:50.060138Z","shell.execute_reply.started":"2022-03-23T09:44:49.976277Z","shell.execute_reply":"2022-03-23T09:44:50.059457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class UmnistModel(tez.Model):\n    def __init__(self, num_classes):\n        super().__init__()\n        \n        self.convnet = torchvision.models.resnet18(pretrained=True)\n        self.convnet.fc = nn.Linear(512, num_classes)\n        self.step_scheduler_after = \"epoch\"\n        \n    def loss(self, outputs, targets):\n        if targets is None:\n            return None\n        return nn.CrossEntropyLoss()(outputs, targets)\n    \n    def monitor_metrics(self, outputs, targets):\n        if targets is None:\n            return {}\n        outputs = torch.argmax(outputs, dim=1).cpu().detach().numpy()\n        targets = targets.cpu().detach().numpy()\n        accuracy = metrics.accuracy_score(targets, outputs)\n        return {\n            \"accuracy\": accuracy\n        }\n    \n    def fetch_optimizer(self):\n        opt = torch.optim.Adam(self.parameters(), lr=1e-3)\n        return opt\n    \n    def fetch_scheduler(self):\n        sch = torch.optim.lr_scheduler.StepLR(self.optimizer, step_size=0.7)\n        return sch\n    \n    def forward(self, image, targets=None):\n        batch_size, _, _, _ = image.shape\n        \n        outputs = self.convnet(image)\n        if targets is not None:\n            loss = self.loss(outputs, targets)\n            mon_metrics = self.monitor_metrics(outputs, targets)\n            return outputs, loss, mon_metrics\n        return outputs, None, None","metadata":{"execution":{"iopub.status.busy":"2022-03-23T09:44:50.061515Z","iopub.execute_input":"2022-03-23T09:44:50.06179Z","iopub.status.idle":"2022-03-23T09:44:50.072359Z","shell.execute_reply.started":"2022-03-23T09:44:50.061753Z","shell.execute_reply":"2022-03-23T09:44:50.071634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = UmnistModel(num_classes=28)","metadata":{"execution":{"iopub.status.busy":"2022-03-23T09:44:50.073578Z","iopub.execute_input":"2022-03-23T09:44:50.073985Z","iopub.status.idle":"2022-03-23T09:44:52.823179Z","shell.execute_reply.started":"2022-03-23T09:44:50.073951Z","shell.execute_reply":"2022-03-23T09:44:52.822277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(fold):\n    training_image_path = \"../input/ultramnist-resized-512/train_img/\"\n    df = pd.read_csv('./train_folds.csv')\n    \n    df_train = df[df.kfold != fold].reset_index(drop=True)\n    df_valid = df[df.kfold == fold].reset_index(drop=True)\n    \n    train_images = df_train.id.values.tolist()\n    train_images = [os.path.join(training_image_path, i + \".jpeg\") for i in train_images]\n    train_targets = df_train.digit_sum.values\n\n    valid_images = df_valid.id.values.tolist()\n    valid_images = [os.path.join(training_image_path, i + \".jpeg\") for i in valid_images]\n    valid_targets = df_valid.digit_sum.values\n    \n    train_aug = albumentations.Compose(\n        [\n           albumentations.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5], max_pixel_value=255.0, always_apply=True),\n        ]\n    )\n\n    valid_aug = albumentations.Compose(\n        [\n           albumentations.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5], max_pixel_value=255.0, always_apply=True),\n        ]\n    )\n\n    train_dataset = ImageDataset(\n        image_paths = train_images,\n        targets = train_targets,\n        augmentations = train_aug\n    )\n\n    valid_dataset = ImageDataset(\n        image_paths = valid_images,\n        targets = valid_targets,\n        augmentations = valid_aug\n    )\n    \n    es = EarlyStopping(monitor=\"valid_accuracy\", model_path=\"model.bin\", patience=2, mode=\"max\")\n    model.fit(\n        train_dataset, \n        valid_dataset=valid_dataset,\n        train_bs=32,\n        valid_bs=64,\n        device=\"cuda\",\n        callbacks=[es],\n        fp16=True,\n        epochs=50\n    )","metadata":{"execution":{"iopub.status.busy":"2022-03-23T09:44:52.826009Z","iopub.execute_input":"2022-03-23T09:44:52.826277Z","iopub.status.idle":"2022-03-23T09:44:52.847534Z","shell.execute_reply.started":"2022-03-23T09:44:52.826245Z","shell.execute_reply":"2022-03-23T09:44:52.846673Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train(0)\ntrain(1)\ntrain(2)\ntrain(3)\ntrain(4)","metadata":{"execution":{"iopub.status.busy":"2022-03-23T09:44:52.851781Z","iopub.execute_input":"2022-03-23T09:44:52.852277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict(fold):\n    df_test = pd.read_csv(\"../input/ultra-mnist/sample_submission.csv\")\n    image_path = \"../input/ultramnist-resized-512/test_img/\"\n    \n    test_image_paths = df_test.id.values.tolist()\n    test_image_paths = [os.path.join(image_path, x + \".jpeg\") for x in df_test.id.values]\n    test_targets = df_test.digit_sum.values\n    \n    test_aug = albumentations.Compose(\n        [\n           albumentations.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5], max_pixel_value=255.0, always_apply=True),\n        ]\n    )\n\n    test_dataset = ImageDataset(\n        image_paths=test_image_paths,\n        targets=test_targets,\n        augmentations=test_aug,\n    )\n    \n    preds = model.predict(test_dataset, batch_size=32, n_jobs=-1)\n    final_preds = None\n    for p in preds:\n        if final_preds is None:\n            final_preds = p\n        else:\n            final_preds = np.vstack((final_preds, p))\n    final_preds = final_preds.argmax(axis=1)\n    \n    return final_preds","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"p1 = predict(0)\np2 = predict(1)\np3 = predict(2)\np4 = predict(3)\np5 = predict(4)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = (p1 + p2 + p3 + p4 + p5) / 5\nss = pd.read_csv('../input/ultra-mnist/sample_submission.csv')\nss['digit_sum'] = predictions.astype(int)\nss.to_csv('submission.csv', index=False)\nss.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}