Image-Captioning / src /train.py
shgyg99's picture
Sync from GitHub via hub-sync
c7fb78c verified
Raw
History Blame Contribute Delete
2.28 kB
import torch
import tqdm
from utils.common_functions import AverageMeter
from utils.config_manager import ConfigManager
# -----------------------------------------------------------------------------------------------
# ------------------------------------ TRAIN ----------------------------------------------------
# -----------------------------------------------------------------------------------------------
def train_one_epoch(model, train_loader, loss_fn, optimizer, metric=None, epoch=None, device='cpu'):
model.train()
loss_train = AverageMeter()
if metric:
metric.reset()
with tqdm.tqdm(train_loader, unit='batch') as tepoch:
for inputs, targets in tepoch:
if epoch:
tepoch.set_description(f'Epoch {epoch}')
inputs = inputs.to(device)
targets = targets.to(device)
outputs = model(inputs, targets)
loss = loss_fn(outputs.reshape(-1, outputs.shape[-1]), targets.flatten())
loss.backward()
optimizer.step()
optimizer.zero_grad()
loss_train.update(loss.item(), n=len(targets))
if metric:
metric.update(outputs.reshape(-1, outputs.shape[-1]), targets.flatten())
tepoch.set_postfix(loss=loss_train.avg, metric=metric.compute().item() if metric else None)
return model, loss_train.avg, metric.compute().item() if metric else None
# -----------------------------------------------------------------------------------------------
# ------------------------------------ EVALUATION -----------------------------------------------
# -----------------------------------------------------------------------------------------------
def evaluate(model, test_loader, loss_fn, metric=None, device="cpu"):
model.eval()
loss_eval = AverageMeter()
if metric:
metric.reset()
with torch.inference_mode():
for inputs, targets in test_loader:
inputs = inputs.to(device)
targets = targets.to(device)
outputs = model(inputs, targets)
loss = loss_fn(outputs.reshape(-1, outputs.shape[-1]), targets.flatten())
loss_eval.update(loss.item(), n=len(targets))
if metric:
metric.update(outputs.reshape(-1, outputs.shape[-1]), targets.flatten())
return loss_eval.avg, metric.compute().item() if metric else None