{ "cells": [ { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "%config InlineBackend.figure_format = 'retina'\n", "\n", "import os\n", "import matplotlib.pyplot as plt\n", "from pandas.core.common import flatten\n", "import copy\n", "import numpy as np\n", "import random\n", "\n", "import torch\n", "from torch import nn\n", "from torch import optim\n", "import torch.nn.functional as F\n", "from torchvision import datasets, transforms, models\n", "from torch.utils.data import Dataset, DataLoader\n", "import torch.nn as nn\n", "import albumentations as A\n", "from albumentations.pytorch import ToTensorV2\n", "import cv2\n", "\n", "import glob\n", "from tqdm import tqdm\n", "import random" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "#######################################################\n", "# Define Transforms\n", "#######################################################\n", "\n", "#To define an augmentation pipeline, you need to create an instance of the Compose class.\n", "#As an argument to the Compose class, you need to pass a list of augmentations you want to apply. \n", "#A call to Compose will return a transform function that will perform image augmentation.\n", "#(https://albumentations.ai/docs/getting_started/image_augmentation/)\n", "\n", "train_transforms = A.Compose(\n", " [\n", " A.SmallestMaxSize(max_size=350),\n", " A.ShiftScaleRotate(shift_limit=0.05, scale_limit=0.05, rotate_limit=360, p=0.5),\n", " A.RandomCrop(height=256, width=256),\n", " A.RGBShift(r_shift_limit=15, g_shift_limit=15, b_shift_limit=15, p=0.5),\n", " A.RandomBrightnessContrast(p=0.5),\n", " A.MultiplicativeNoise(multiplier=[0.5,2], per_channel=True, p=0.2),\n", " A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),\n", " A.HueSaturationValue(hue_shift_limit=0.2, sat_shift_limit=0.2, val_shift_limit=0.2, p=0.5),\n", " A.RandomBrightnessContrast(brightness_limit=(-0.1,0.1), contrast_limit=(-0.1, 0.1), p=0.5),\n", " ToTensorV2(),\n", " ]\n", ")\n", "\n", "test_transforms = A.Compose(\n", " [\n", " A.SmallestMaxSize(max_size=350),\n", " A.CenterCrop(height=256, width=256),\n", " A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),\n", " ToTensorV2(),\n", " ]\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import os\n", "import matplotlib.pyplot as plt\n", "from pandas.core.common import flatten\n", "import copy\n", "import numpy as np\n", "import random\n", "\n", "import torch\n", "from torch import nn\n", "from torch import optim\n", "import torch.nn.functional as F\n", "from torchvision import datasets, transforms, models\n", "from torch.utils.data import Dataset, DataLoader\n", "import torch.nn as nn\n", "import albumentations as A\n", "from albumentations.pytorch import ToTensorV2\n", "import cv2\n", "\n", "import glob\n", "from tqdm import tqdm\n", "import random\n", "\n", "class MotorbikeDataset(torch.utils.data.Dataset):\n", " def __init__(self, image_paths, transform=None):\n", " self.root = image_paths\n", " self.image_paths = os.listdir(image_paths)\n", " self.transform = transform\n", " \n", " def __len__(self):\n", " return len(self.image_paths)\n", "\n", " def __getitem__(self, idx):\n", " image_filepath = self.image_paths[idx]\n", " \n", " image = cv2.imread(os.path.join(self.root,image_filepath))\n", " image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n", " \n", " label = int('t' in image_filepath)\n", " if self.transform is not None:\n", " image = self.transform(image=image)[\"image\"]\n", " \n", " return image, label\n", " \n", "\n", "class MotorbikeDataset_CV(torch.utils.data.Dataset):\n", " def __init__(self, root, train_transforms, val_transforms, trainval_ratio=0.8) -> None:\n", " self.root = root\n", " self.train_transforms = train_transforms\n", " self.val_transforms = val_transforms\n", " self.trainval_ratio = trainval_ratio\n", " self.train_split, self.val_split = self.gen_split()\n", " \n", " def __len__(self):\n", " return len(self.root)\n", "\n", " def gen_split(self):\n", " img_list = os.listdir(self.root)\n", " n_list = [img for img in img_list if img.startswith('n_')]\n", " t_list = [img for img in img_list if img.startswith('t_')]\n", " \n", " n_train = random.choices(n_list, k=int(len(n_list)*self.trainval_ratio))\n", " t_train = random.choices(t_list, k=int(len(t_list)*self.trainval_ratio))\n", " n_val = [img for img in n_list if img not in n_train]\n", " t_val = [img for img in t_list if img not in t_train]\n", " \n", " train_split = n_train + t_train\n", " val_split = n_val + t_val\n", " return train_split, val_split\n", "\n", " def get_split(self):\n", " train_dataset = Dataset_from_list(self.root, self.train_split, self.train_transforms)\n", " val_dataset = Dataset_from_list(self.root, self.val_split, self.val_transforms)\n", " return train_dataset, val_dataset\n", " \n", "class Dataset_from_list(torch.utils.data.Dataset):\n", " def __init__(self, root, img_list, transform) -> None:\n", " self.root = root\n", " self.img_list = img_list\n", " self.transform = transform\n", " \n", " def __len__(self):\n", " return len(self.img_list)\n", " \n", " def __getitem__(self, idx):\n", " image = cv2.imread(os.path.join(self.root, self.img_list[idx]))\n", " image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n", " \n", " label = int(self.img_list[idx].startswith('t_'))\n", " \n", " if self.transform is not None:\n", " image = self.transform(image=image)[\"image\"]\n", " \n", " return image, label\n", " \n", " \n", " \n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "dataset_CV = MotorbikeDataset_CV(\n", " root='/workspace/data/',\n", " train_transforms=train_transforms,\n", " val_transforms=test_transforms\n", " )" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "train_dataset, val_dataset = dataset_CV.get_split()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "277\n", "166\n" ] } ], "source": [ "print(len(train_dataset))\n", "print(len(val_dataset))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True, drop_last=True)\n", "val_loader = DataLoader(val_dataset,batch_size=64, shuffle=False)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "classes = ('no_trunk', 'trunk')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "device = torch.device(\"cuda:1\") if torch.cuda.is_available() else torch.device(\"cpu\")" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ResNet(\n", " (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", " (layer1): Sequential(\n", " (0): Bottleneck(\n", " (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): Bottleneck(\n", " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " (2): Bottleneck(\n", " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " )\n", " (layer2): Sequential(\n", " (0): Bottleneck(\n", " (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): Bottleneck(\n", " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " (2): Bottleneck(\n", " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " (3): Bottleneck(\n", " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " )\n", " (layer3): Sequential(\n", " (0): Bottleneck(\n", " (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): Bottleneck(\n", " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " (2): Bottleneck(\n", " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " (3): Bottleneck(\n", " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " (4): Bottleneck(\n", " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " (5): Bottleneck(\n", " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " )\n", " (layer4): Sequential(\n", " (0): Bottleneck(\n", " (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): Bottleneck(\n", " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " (2): Bottleneck(\n", " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " )\n", " )\n", " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", " (fc): Sequential(\n", " (0): Linear(in_features=2048, out_features=2, bias=True)\n", " )\n", ")" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = models.resnet50(pretrained=True)\n", "model.fc = nn.Sequential(\n", " # nn.Dropout(0.5),\n", " nn.Linear(model.fc.in_features, 2)\n", ")\n", "\n", "for n, p in model.named_parameters():\n", " if 'fc' in n:\n", " p.requires_grad = True\n", " else:\n", " p.requires_grad = False\n", "\n", "model.to(device)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "import torch.optim as optim\n", "criterion = nn.CrossEntropyLoss()\n", "optimizer = optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=0.1, momentum=0.9)\n", "# optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 4] loss: 0.009\n", "VAL: [1, 3] loss: 0.028\n", "VAL acc = tensor([51.8072, 0.0000], device='cuda:1')\n", "[2, 4] loss: 0.026\n", "VAL: [2, 3] loss: 0.018\n", "VAL acc = tensor([51.8072, 0.0000], device='cuda:1')\n", "[3, 4] loss: 0.014\n", "VAL: [3, 3] loss: 0.003\n", "VAL acc = tensor([50.6024, 33.7349], device='cuda:1')\n", "[4, 4] loss: 0.006\n", "VAL: [4, 3] loss: 0.006\n", "VAL acc = tensor([21.0843, 46.9879], device='cuda:1')\n", "[5, 4] loss: 0.007\n", "VAL: [5, 3] loss: 0.006\n", "VAL acc = tensor([50.6024, 30.1205], device='cuda:1')\n", "[6, 4] loss: 0.005\n", "VAL: [6, 3] loss: 0.003\n", "VAL acc = tensor([50.0000, 38.5542], device='cuda:1')\n", "[7, 4] loss: 0.005\n", "VAL: [7, 3] loss: 0.002\n", "VAL acc = tensor([49.3976, 39.7590], device='cuda:1')\n", "[8, 4] loss: 0.003\n", "VAL: [8, 3] loss: 0.004\n", "VAL acc = tensor([50.6024, 33.1325], device='cuda:1')\n", "[9, 4] loss: 0.005\n", "VAL: [9, 3] loss: 0.002\n", "VAL acc = tensor([48.1928, 41.5663], device='cuda:1')\n", "[10, 4] loss: 0.004\n", "VAL: [10, 3] loss: 0.002\n", "VAL acc = tensor([49.3976, 38.5542], device='cuda:1')\n" ] } ], "source": [ "for epoch in range(10):\n", " model.train()\n", " running_loss = 0.0\n", " for i, data in enumerate(train_loader, 0):\n", " inputs, labels = data[0].to(device), data[1].to(device)\n", " \n", " optimizer.zero_grad()\n", " \n", " outputs = model(inputs)\n", " loss = criterion(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", " running_loss += loss.item()\n", " \n", " print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')\n", " # print(\"TRAIN acc = {}\".format(acc))\n", " # running_loss = 0.0\n", " \n", " with torch.no_grad():\n", " model.eval()\n", " running_loss = 0.0\n", " correct =0\n", " for i, data in enumerate(val_loader, 0):\n", " inputs, labels = data[0].to(device), data[1].to(device)\n", " outputs = model(inputs)\n", " _, preds = outputs.max(1)\n", " loss = criterion(outputs, labels)\n", " running_loss += loss.item()\n", " labels_one_hot = F.one_hot(labels, 2)\n", " outputs_one_hot = F.one_hot(preds, 2)\n", " correct = correct + (labels_one_hot + outputs_one_hot == 2).sum(dim=0).to(torch.float)\n", " \n", " acc = 100 * correct / len(val_dataset)\n", " print(f'VAL: [{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')\n", " print(\"VAL acc = {}\".format(acc))" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "349" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(os.listdir('/workspace//data'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "n_0000000187.jpg\n", "t_0000000182.jpg\n" ] } ], "source": [ "root = '/workspace/data'\n", "for img in os.listdir(root):\n", " try:\n", " image = cv2.imread(os.path.join(root,img))\n", " image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n", " except:\n", " print(img)\n", " \n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "base", "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.7.11" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }