Spaces:
Sleeping
Sleeping
from torchvision.datasets.cifar import CIFAR10 | |
import torch | |
from torch.optim.lr_scheduler import OneCycleLR | |
from torch_lr_finder import LRFinder | |
import torch.nn as nn | |
import torch.nn.functional as F | |
import os | |
import pytorch_lightning as pl | |
import albumentations as A | |
from torchvision.datasets import CIFAR10 | |
from torchvision import transforms | |
from albumentations.pytorch.transforms import ToTensorV2 | |
import numpy as np | |
from pytorch_lightning import LightningModule, Trainer | |
from torch.utils.data import DataLoader, random_split | |
from torchmetrics import Accuracy | |
from torchvision import transforms | |
PATH_DATASETS = os.environ.get("PATH_DATASETS", ".") | |
class CustomResNet(LightningModule): | |
def __init__(self, num_classes=10, data_dir=PATH_DATASETS, hidden_size=16, learning_rate=0.05): | |
super(CustomResNet, self).__init__() | |
self.save_hyperparameters() | |
#self.custom_block = CustomBlock(in_channels=64, out_channels=128) | |
# Set our init args as class attributes | |
# loading the dataset | |
self.EPOCHS = 24 | |
self.num_classes=num_classes | |
self.data_dir = data_dir | |
self.hidden_size = hidden_size | |
self.learning_rate = learning_rate | |
self.prep_layer = nn.Sequential( | |
nn.Conv2d( | |
in_channels=3, | |
out_channels=64, | |
kernel_size=3, | |
stride=1, | |
padding=1, | |
bias=False, | |
), | |
nn.BatchNorm2d(64), | |
nn.ReLU(), | |
) | |
self.layer_1 = nn.Sequential( | |
nn.Conv2d( | |
in_channels=64, | |
out_channels=128, | |
kernel_size=3, | |
stride=1, | |
padding=1, | |
bias=False, | |
), | |
nn.MaxPool2d(kernel_size=2), | |
nn.BatchNorm2d(128), | |
nn.ReLU(), | |
) | |
self.resblock1 = nn.Sequential( | |
nn.Conv2d(128, 128, kernel_size=3, stride=1, bias=False, padding=1), | |
nn.BatchNorm2d(128), | |
nn.ReLU(), | |
nn.Conv2d(128, 128, kernel_size=3, stride=1, bias=False, padding=1), | |
nn.BatchNorm2d(128), | |
nn.ReLU() | |
) | |
self.layer_2 = nn.Sequential( | |
nn.Conv2d( | |
in_channels=128, | |
out_channels=256, | |
kernel_size=3, | |
stride=1, | |
padding=1, | |
bias=False, | |
), | |
nn.MaxPool2d(kernel_size=2), | |
nn.BatchNorm2d(256), | |
nn.ReLU(), | |
) | |
self.layer_3 = nn.Sequential( | |
nn.Conv2d(256, 512, kernel_size=3, stride=1, bias=False, padding=1), | |
nn.MaxPool2d(kernel_size = 2, stride = 2), | |
nn.BatchNorm2d(512), | |
nn.ReLU() | |
) | |
self.resblock2 = nn.Sequential( | |
nn.Conv2d(512, 512, kernel_size=3, stride=1, bias=False, padding=1), | |
nn.BatchNorm2d(512), | |
nn.ReLU(), | |
nn.Conv2d(512, 512, kernel_size=3, stride=1, bias=False, padding=1), | |
nn.BatchNorm2d(512), | |
nn.ReLU() | |
) | |
self.maxpoollayer = nn.Sequential(nn.MaxPool2d(kernel_size=4,stride = 4)) | |
self.fclayer = nn.Linear(512, self.num_classes) | |
# def loss_function(self, pred, target): | |
# criterion = torch.nn.CrossEntropyLoss() | |
# return criterion(pred, target) | |
def forward(self, x): | |
x = self.prep_layer(x) | |
x = self.layer_1(x) | |
r1 = self.resblock1(x) | |
x = x + r1 | |
x = self.layer_2(x) | |
x = self.layer_3(x) | |
r2 = self.resblock2(x) | |
x = x + r2 | |
x = self.maxpoollayer(x) | |
x = x.view((x.shape[0],-1)) | |
x = self.fclayer(x) | |
return F.log_softmax(x,dim=-1) | |
# def get_loss_accuracy(self, batch): | |
# images, labels = batch | |
# predictions = self(images) | |
# predicted_classes = torch.argmax(predictions, dim=1) | |
# accuracy = (predicted_classes == labels).float().mean() | |
# loss = self.loss_function(predictions, labels) | |
# return loss, accuracy * 100 | |
# def training_step(self, batch, batch_idx): | |
# loss, accuracy = self.get_loss_accuracy(batch) | |
# self.log("loss/train", loss, on_epoch=True, prog_bar=True, logger=True) | |
# self.log("acc/train", accuracy, on_epoch=True, prog_bar=True, logger=True) | |
# return loss | |
# def validation_step(self, batch, batch_idx): | |
# loss, accuracy = self.get_loss_accuracy(batch) | |
# self.log("loss/val", loss, on_epoch=True, prog_bar=True, logger=True) | |
# self.log("acc/val", accuracy, on_epoch=True, prog_bar=True, logger=True) | |
# return loss | |
# def test_step(self, batch, batch_idx): | |
# loss = self.validation_step(batch, batch_idx) | |
# return loss | |
# def configure_optimizers(self): | |
# LEARNING_RATE=0.03 | |
# WEIGHT_DECAY=0 | |
# optimizer = torch.optim.Adam(self.parameters(), lr=LEARNING_RATE, weight_decay=WEIGHT_DECAY) | |
# self.trainer.fit_loop.setup_data() | |
# dataloader = self.trainer.train_dataloader | |
# lr_scheduler = OneCycleLR( | |
# optimizer, | |
# max_lr=4.79E-02, | |
# steps_per_epoch=len(dataloader), | |
# epochs=24, | |
# pct_start=5/24, | |
# div_factor=100, | |
# three_phase=False, | |
# final_div_factor=100, | |
# anneal_strategy='linear' | |
# ) | |
# scheduler = {"scheduler": lr_scheduler, "interval" : "step"} | |
# return [optimizer], [scheduler] |