in trainer/loss.py [0:0]
def forward(self, im, s):
scores = self.sim(im, s)
diagonal = scores.diag().view(im.size(0), 1)
d1 = diagonal.expand_as(scores)
d2 = diagonal.t().expand_as(scores)
cost_s = (self.margin + scores - d1).clamp(min=0)
cost_im = (self.margin + scores - d2).clamp(min=0)
mask = torch.eye(scores.size(0)) > .5
if self.use_cuda:
mask = mask.cuda()
cost_s = cost_s.masked_fill_(mask, 0)
cost_im = cost_im.masked_fill_(mask, 0)
return (cost_s.sum() + cost_im.sum()).div(im.shape[0] * s.shape[0])