|
- # Copyright (c) Microsoft Corporation.
- # Licensed under the MIT license.
-
- import logging
-
- import torch
- import torch.nn as nn
- import json
-
- INF = 1E10
- EPS = 1E-12
-
- logger = logging.getLogger(__name__)
- logger.setLevel(logging.INFO)
-
- def get_length(mask):
- length = torch.sum(mask, 1)
- length = length.long().cpu()
- return length
-
-
- class GlobalAvgPool(nn.Module):
- def forward(self, x, mask):
- x = torch.sum(x, 2)
- length = torch.sum(mask, 1, keepdim=True).float()
- length += torch.eq(length, 0.0).float() * EPS
- length = length.repeat(1, x.size()[1])
- x /= length
- return x
-
-
- class GlobalMaxPool(nn.Module):
- def forward(self, x, mask):
- mask = torch.eq(mask.float(), 0.0).long()
- mask = torch.unsqueeze(mask, dim=1).repeat(1, x.size()[1], 1)
- mask *= -INF
- x += mask
- x, _ = torch.max(x + mask, 2)
- return x
-
-
- class IteratorWrapper:
- def __init__(self, loader):
- self.loader = loader
- self.iterator = None
-
- def __iter__(self):
- self.iterator = iter(self.loader)
- return self
-
- def __len__(self):
- return len(self.loader)
-
- def __next__(self):
- data = next(self.iterator)
- text, length = data.text
- max_length = text.size(1)
- label = data.label - 1
- bs = label.size(0)
- mask = torch.arange(max_length, device=length.device).unsqueeze(0).repeat(bs, 1)
- mask = mask < length.unsqueeze(-1).repeat(1, max_length)
- return (text, mask), label
-
-
- def accuracy(output, target):
- batch_size = target.size(0)
- _, predicted = torch.max(output.data, 1)
- return (predicted == target).sum().item() / batch_size
-
-
- def dump_global_result(res_path,global_result, sort_keys = False):
- with open(res_path, "w") as ss_file:
- json.dump(global_result, ss_file, sort_keys=sort_keys, indent=2)
|