[FEATURE] Add euclidean_similarity
and margin_loss
This commit is contained in:
parent
6e8a52e371
commit
42eb53d73a
@ -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)
|
||||||
|
@ -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`.
|
||||||
|
Loading…
Reference in New Issue
Block a user