| """ |
| Module for custom loss functions. |
| """ |
|
|
| import torch |
| import torch.nn as nn |
| import torch.nn.functional as F |
|
|
|
|
| class MemAELoss(nn.Module): |
| """MSE reconstruction + entropy regularization on attention weights.""" |
|
|
| def __init__(self, entropy_weight: float = 0.0002): |
| super().__init__() |
| self.entropy_weight = entropy_weight |
| self.mse = nn.MSELoss() |
|
|
| def forward(self, recon, target, attn): |
| """ |
| Args: |
| recon: (B, T, C, H, W) reconstruction |
| target: (B, T, C, H, W) input |
| attn: (B, n_queries, N) attention weights |
| Returns: |
| total_loss, (recon_loss, entropy_loss) # ayrı logla |
| """ |
| eps = 1e-12 |
|
|
| |
| recon_loss = self.mse(recon, target) |
|
|
| |
| |
| entropy = (-(attn * torch.log(attn + eps)).sum(dim=-1)).mean() |
|
|
| |
| total = recon_loss + self.entropy_weight * entropy |
|
|
| return total, (recon_loss, entropy) |
| |
|
|
| class PredictionLoss(nn.Module): |
| """Intensity (L2) + gradient loss for future frame prediction.""" |
|
|
| def __init__(self, grad_weight: float = 1.0): |
| super().__init__() |
| self.grad_weight = grad_weight |
|
|
| def forward(self, pred, target): |
| """ |
| Args: |
| pred: (B, 1, H, W) predicted frame |
| target: (B, 1, H, W) ground truth frame |
| Returns: |
| total, (intensity, gradient) |
| """ |
| |
| intensity = F.mse_loss(pred, target) |
|
|
| |
| |
| pred_dx = torch.abs(pred[:, :, :, 1:] - pred[:, :, :, :-1]) |
| target_dx = torch.abs(target[:, :, :, 1:] - target[:, :, :, :-1]) |
| |
| |
| pred_dy = torch.abs(pred[:, :, 1:, :] - pred[:, :, :-1, :]) |
| target_dy = torch.abs(target[:, :, 1:, :] - target[:, :, :-1, :]) |
| |
| |
| gradient = F.l1_loss(pred_dx, target_dx) + F.l1_loss(pred_dy, target_dy) |
|
|
| |
| total = intensity + self.grad_weight * gradient |
|
|
| return total, (intensity, gradient) |
|
|
|
|
| if __name__ == "__main__": |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| loss_pred = PredictionLoss() |
| pred = torch.randn(2, 1, 128, 128) |
| target = torch.randn(2, 1, 128, 128) |
| total, (inten, grad) = loss_pred(pred, target) |
| print(f"total: {total.item():.4f}, intensity: {inten.item():.4f}, gradient: {grad.item():.4f}") |