torchbenchmark/models/Super_SloMo/__init__.py (61 lines of code) (raw):
from .dataloader import SuperSloMo
from .model_wrapper import Model as ModelWrapper
import torch
import torch.nn.functional as F
import torch.optim as optim
import torchvision.transforms as transforms
import random
from typing import Tuple
import numpy as np
from argparse import Namespace
from pathlib import Path
from ...util.model import BenchmarkModel
from torchbenchmark.tasks import COMPUTER_VISION
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
def _prefetch(data, device):
result = []
for item in data:
result.append(item.to(device))
return tuple(result)
class Model(BenchmarkModel):
task = COMPUTER_VISION.OTHER_COMPUTER_VISION
# Original code config:
# train batch size: 6
# eval batch size: 10
# hardware platform: Nvidia GTX 1080 Ti
# Source: https://github.com/avinashpaliwal/Super-SloMo/blob/master/train.ipynb
DEFAULT_TRAIN_BSIZE = 6
DEFAULT_EVAL_BSIZE = 10
def __init__(self, test, device, jit=False, batch_size=None, extra_args=[]):
super().__init__(test=test, device=device, jit=jit, batch_size=batch_size, extra_args=extra_args)
self.model = ModelWrapper(device)
root = str(Path(__file__).parent)
self.args = args = Namespace(**{
'dataset_root': f'{root}/dataset',
'batch_size': self.batch_size,
'init_learning_rate': 0.0001,
})
self.optimizer = optim.Adam(self.model.parameters(),
lr=args.init_learning_rate)
mean = [0.429, 0.431, 0.397]
std = [1, 1, 1]
normalize = transforms.Normalize(mean=mean,
std=std)
transform = transforms.Compose([transforms.ToTensor(), normalize])
trainset = SuperSloMo(root=args.dataset_root + '/train',
transform=transform, train=True)
loader = torch.utils.data.DataLoader(
trainset,
batch_size=self.args.batch_size,
shuffle=False)
data, frameIndex = next(iter(loader))
data = _prefetch(data, self.device)
self.example_inputs = frameIndex.to(self.device), *data
def get_module(self):
return self.model, self.example_inputs
def eval(self, niter=1) -> Tuple[torch.Tensor]:
for _ in range(niter):
out = self.model(*self.example_inputs)
return out
def train(self, niter=1):
for _ in range(niter):
self.optimizer.zero_grad()
Ft_p, loss = self.model(*self.example_inputs)
loss.backward()
self.optimizer.step()