如何对三元组损失函数的掩码计算进行矢量化
How to vectorize this computation of a mask for triplet loss function
假设我有一个长度为 N
的数字 lst
列表,以及两个数字 epsilon
和 tau
。我想找到 (N,N,N)
掩码矩阵 mask
使得 mask[i][j][k]=1
当且仅当
abs(lst[i] - lst[j]) <= epsilon and abs(lst[i] - lst[k]) >= tau
这是我试过的:
d_mat = torch.cdist(lst.unsqueeze(0), lst.unsqueeze(0))
within_eps = torch.where(dmat <= eps, 1, 0)
over_tau = torch.where(dmat >= tau, 1, 0)
mask = torch.zeros((N,N,N))
for i in range(N):
for j in range(N):
for k in range(N):
if within_eps[i][j] == 1 and over_tau[i][k] == 1:
mask[i][j][k] = 1
else:
mask[i][j][k] = 0
所以基本上我是天真地做的。你能用步骤告诉我你是如何为此提出矢量化的吗?
您成功创建了成对距离的 2d dmat
。现在您可以使用 torch.logical_and
创建遮罩:
mask = torch.logical_and(dmat[..., None] <= eps, dmat[:, None, :] >= tau)
如果您想明确说明距离计算(并且效率较低),您可以:
mask = torch.logical_and(torch.abs(lst[:, None, None] - lst[None, :, None]) <= eps,
torch.abs(lst[:, None, None] - lst[None, None, :]) >= tau)
假设我有一个长度为 N
的数字 lst
列表,以及两个数字 epsilon
和 tau
。我想找到 (N,N,N)
掩码矩阵 mask
使得 mask[i][j][k]=1
当且仅当
abs(lst[i] - lst[j]) <= epsilon and abs(lst[i] - lst[k]) >= tau
这是我试过的:
d_mat = torch.cdist(lst.unsqueeze(0), lst.unsqueeze(0))
within_eps = torch.where(dmat <= eps, 1, 0)
over_tau = torch.where(dmat >= tau, 1, 0)
mask = torch.zeros((N,N,N))
for i in range(N):
for j in range(N):
for k in range(N):
if within_eps[i][j] == 1 and over_tau[i][k] == 1:
mask[i][j][k] = 1
else:
mask[i][j][k] = 0
所以基本上我是天真地做的。你能用步骤告诉我你是如何为此提出矢量化的吗?
您成功创建了成对距离的 2d dmat
。现在您可以使用 torch.logical_and
创建遮罩:
mask = torch.logical_and(dmat[..., None] <= eps, dmat[:, None, :] >= tau)
如果您想明确说明距离计算(并且效率较低),您可以:
mask = torch.logical_and(torch.abs(lst[:, None, None] - lst[None, :, None]) <= eps,
torch.abs(lst[:, None, None] - lst[None, None, :]) >= tau)