forked from ccf-ai-infra/GPUCodeForces
45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
|
|
import torch
|
|||
|
|
import torch.nn as nn
|
|||
|
|
|
|||
|
|
class Model(nn.Module):
|
|||
|
|
"""
|
|||
|
|
Hinge Loss implementation - commonly used for maximum-margin classification (SVM).
|
|||
|
|
Computes hinge loss: max(0, margin - y_true * y_pred)
|
|||
|
|
"""
|
|||
|
|
def __init__(self, margin=1.0):
|
|||
|
|
super(Model, self).__init__()
|
|||
|
|
self.margin = margin
|
|||
|
|
|
|||
|
|
def forward(self, input: torch.Tensor, target: torch.Tensor) -> torch.Tensor:
|
|||
|
|
"""
|
|||
|
|
Compute hinge loss between input predictions and target labels.
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
input (torch.Tensor): Predicted values [batch_size, ...]
|
|||
|
|
target (torch.Tensor): Target labels [batch_size, ...] (should be -1 or 1)
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
torch.Tensor: Scalar hinge loss value
|
|||
|
|
"""
|
|||
|
|
# Hinge Loss: max(0, margin - y_true * y_pred)
|
|||
|
|
# 这里假设target是-1或1的标签
|
|||
|
|
hinge_loss = torch.clamp(self.margin - target * input, min=0)
|
|||
|
|
|
|||
|
|
return torch.sum(hinge_loss)
|
|||
|
|
|
|||
|
|
batch_size = 256
|
|||
|
|
feature_dim = 512
|
|||
|
|
margin = 1.0
|
|||
|
|
|
|||
|
|
def get_inputs():
|
|||
|
|
# input: 预测值,可以是任意实数
|
|||
|
|
input = torch.randn(batch_size, feature_dim)
|
|||
|
|
# target: 标签,应该是-1或1,这里随机生成
|
|||
|
|
target = torch.randint(-1, 2, (batch_size, feature_dim)).float()
|
|||
|
|
# 确保没有0值,因为hinge loss通常用-1和1
|
|||
|
|
target[target == 0] = 1
|
|||
|
|
return [input, target]
|
|||
|
|
|
|||
|
|
def get_init_inputs():
|
|||
|
|
return [margin] # margin parameter
|