[FEATURE] Add euclidean_similarity and margin_loss

This commit is contained in:
Jensun Ravichandran 2021-06-15 15:57:59 +02:00
parent 6e8a52e371
commit 42eb53d73a
2 changed files with 32 additions and 0 deletions

View File

@ -98,6 +98,13 @@ def rslvq_loss(probabilities, targets, prototype_labels):
return -1.0 * log_likelihood return -1.0 * log_likelihood
def margin_loss(y_pred, y_true, margin=0.3):
"""Compute the margin loss."""
dp = torch.sum(y_true * y_pred, dim=-1)
dm = torch.max(y_pred - y_true, dim=-1).values
return torch.nn.functional.relu(dm - dp + margin)
class GLVQLoss(torch.nn.Module): class GLVQLoss(torch.nn.Module):
def __init__(self, margin=0.0, squashing="identity", beta=10, **kwargs): def __init__(self, margin=0.0, squashing="identity", beta=10, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)
@ -112,6 +119,19 @@ class GLVQLoss(torch.nn.Module):
return torch.sum(batch_loss, dim=0) return torch.sum(batch_loss, dim=0)
class MarginLoss(torch.nn.modules.loss._Loss):
def __init__(self,
margin=0.3,
size_average=None,
reduce=None,
reduction="mean"):
super().__init__(size_average, reduce, reduction)
self.margin = margin
def forward(self, y_pred, y_true):
return margin_loss(y_pred, y_true, self.margin)
class NeuralGasEnergy(torch.nn.Module): class NeuralGasEnergy(torch.nn.Module):
def __init__(self, lm, **kwargs): def __init__(self, lm, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View File

@ -2,6 +2,18 @@
import torch import torch
from .distances import euclidean_distance
def gaussian(x, variance=1.0):
return torch.exp(-(x * x) / (2 * variance))
def euclidean_similarity(x, y, variance=1.0):
distances = euclidean_distance(x, y)
similarities = gaussian(distances, variance)
return similarities
def cosine_similarity(x, y): def cosine_similarity(x, y):
"""Compute the cosine similarity between :math:`x` and :math:`y`. """Compute the cosine similarity between :math:`x` and :math:`y`.