in detector/train.py [0:0]
def validate(model: nn.Module, device: str, loader: DataLoader, votes=1, desc='Validation'):
model.eval()
validation_accuracy = 0
validation_epoch_size = 0
validation_loss = 0
records = [record for v in range(votes) for record in tqdm(loader, desc=f'Preloading data ... {v}',
disable=dist.is_available() and dist.get_rank() > 0)]
records = [[records[v * len(loader) + i] for v in range(votes)] for i in range(len(loader))]
with tqdm(records, desc=desc, disable=distributed() and dist.get_rank() > 0) as loop, torch.no_grad():
for example in loop:
losses = []
logit_votes = []
for texts, masks, labels in example:
texts, masks, labels = texts.to(device), masks.to(device), labels.to(device)
batch_size = texts.shape[0]
loss, logits = model(texts, attention_mask=masks, labels=labels)
losses.append(loss)
logit_votes.append(logits)
loss = torch.stack(losses).mean(dim=0)
logits = torch.stack(logit_votes).mean(dim=0)
batch_accuracy = accuracy_sum(logits, labels)
validation_accuracy += batch_accuracy
validation_epoch_size += batch_size
validation_loss += loss.item() * batch_size
loop.set_postfix(loss=loss.item(), acc=validation_accuracy / validation_epoch_size)
return {
"validation/accuracy": validation_accuracy,
"validation/epoch_size": validation_epoch_size,
"validation/loss": validation_loss
}