Untitled
Anonymous
plain_text
08/10/2024 1:03 PM
3.9 KB
23
Indexable
Certainly! Below is the pseudo code for calculating the Earth Mover's Distance (EMD) loss using PyTorch. This is based on the provided description and algorithm.
```python
import torch
import torch.nn.functional as F
def compute_emd_loss(X, Y, vx, vy, lambda_reg=0.01, num_iters=10):
"""
Compute the EMD loss between two feature maps X and Y.
Args:
- X: Feature map of shape (1, 1024, 7, 7)
- Y: Feature map of shape (1, 1024, 7, 7)
- vx: Embedding vector of shape (1024, 1)
- vy: Embedding vector of shape (1024, 1)
- lambda_reg: Regularization parameter for Sinkhorn-Knopp algorithm
- num_iters: Number of iterations for Sinkhorn-Knopp algorithm
Returns:
- LEMD: EMD loss
"""
# Flatten the feature maps
X = X.view(1, 1024, -1).squeeze(0).T # Shape: (49, 1024)
Y = Y.view(1, 1024, -1).squeeze(0).T # Shape: (49, 1024)
# Compute the cost matrix M
X_norm = X / X.norm(dim=1, keepdim=True)
Y_norm = Y / Y.norm(dim=1, keepdim=True)
M = 1 - torch.mm(X_norm, Y_norm.T) # Shape: (49, 49)
# Compute marginal weights r and c
r = torch.clamp(torch.mm(X, vy), min=0).squeeze() # Shape: (49,)
c = torch.clamp(torch.mm(Y, vx), min=0).squeeze() # Shape: (49,)
# Initialize u and v for Sinkhorn-Knopp iteration
u = torch.ones_like(r)
v = torch.ones_like(c)
# Sinkhorn-Knopp iteration
K = torch.exp(-lambda_reg * M) # Shape: (49, 49)
for _ in range(num_iters):
u = r / (K @ v)
v = c / (K.T @ u)
# Compute the optimal transport plan pi*
pi_star = torch.diag(u) @ K @ torch.diag(v)
# Compute the similarity score S
S = torch.sum(pi_star * (1 - M))
# Compute the EMD loss
LEMD = 2 - 2 * S
return LEMD
# Example usage:
X = torch.rand(1, 1024, 7, 7) # Example feature map
Y = torch.rand(1, 1024, 7, 7) # Example feature map
vx = torch.rand(1024, 1) # Example embedding vector
vy = torch.rand(1024, 1) # Example embedding vector
emd_loss = compute_emd_loss(X, Y, vx, vy)
print('EMD Loss:', emd_loss.item())
```
Explanation:
1. **Flatten the feature maps**: The input feature maps `X` and `Y` of shape `(1, 1024, 7, 7)` are flattened into a shape of `(49, 1024)` to obtain local feature vectors.
2. **Compute the cost matrix `M`**: The cosine similarity between each pair of local feature vectors is computed to form the cost matrix `M`.
3. **Compute marginal weights `r` and `c`**: These are calculated using the provided equations.
4. **Sinkhorn-Knopp iteration**: The optimal transport plan `π*` is computed iteratively.
5. **Compute the similarity score `S`**: The dot-product between the optimal transport plan and the similarity matrix `(1 - M)` is calculated.
6. **Compute the EMD loss**: Finally, the EMD loss is computed using the similarity score.
This PyTorch implementation should capture the essence of the EMD loss calculation as described in the provided text.Editor is loading...
Leave a Comment