Loss¶
Image Loss¶
Module provides different loss functions for calculating the dissimilarities between images.
-
deepreg.model.loss.image.
dissimilarity_fn
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor, name: str, **kwargs) → tensorflow.Tensor¶ Returns the calculated dissimilarity for each batch.
- Parameters
y_true – fixed_image, shape = (batch, f_dim1, f_dim2, f_dim3)
y_pred – warped_moving_image, shape = (batch, f_dim1, f_dim2, f_dim3)
name – name of the dissimilarity function
kwargs – absorb additional parameters
- Returns
shape = (batch,)
-
deepreg.model.loss.image.
global_mutual_information
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor, num_bins: int = 23, sigma_ratio: float = 0.5) → tensorflow.Tensor¶ Differentiable global mutual information loss via Parzen windowing method.
Reference: https://dspace.mit.edu/handle/1721.1/123142, Section 3.1, equation 3.1-3.5, Algorithm 1
- Parameters
y_true – shape = (batch, dim1, dim2, dim3, ch)
y_pred – shape = (batch, dim1, dim2, dim3, ch)
num_bins – int, number of bins for intensity
sigma_ratio – float, a hyper param for gaussian function
- Returns
shape = (batch,)
-
deepreg.model.loss.image.
local_normalized_cross_correlation
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor, kernel_size: int = 9, **kwargs) → tensorflow.Tensor¶ Local squared zero-normalized cross-correlation. The loss is based on a moving kernel/window over the y_true/y_pred, within the window the square of zncc is calculated. The final loss is the averaged loss over all windows.
Reference:
Zero-normalized cross-correlation (ZNCC): https://en.wikipedia.org/wiki/Cross-correlation
Code: https://github.com/voxelmorph/voxelmorph/blob/legacy/src/losses.py
- Parameters
y_true – shape = (batch, dim1, dim2, dim3, ch)
y_pred – shape = (batch, dim1, dim2, dim3, ch)
kernel_size – int
kwargs – absorb additional parameters
- Returns
shape = (batch,)
-
deepreg.model.loss.image.
ssd
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor) → tensorflow.Tensor¶ Sum of squared distance between y_true and y_pred.
- Parameters
y_true – shape = (batch, dim1, dim2, dim3, ch)
y_pred – shape = (batch, dim1, dim2, dim3, ch)
- Returns
shape = (batch,)
Label Loss¶
Module provides different loss functions for calculating the dissimilarities between labels.
-
deepreg.model.loss.label.
cauchy_kernel1d
(sigma: int) → tensorflow.Tensor¶ Approximating cauchy kernel in 1d.
- Parameters
sigma – int, defining standard deviation of kernel.
- Returns
shape = (dim, ) or ()
-
deepreg.model.loss.label.
compute_centroid
(mask: tensorflow.Tensor, grid: tensorflow.Tensor) → tensorflow.Tensor¶ Calculate the centroid of the mask.
- Parameters
mask – shape = (batch, dim1, dim2, dim3)
grid – shape = (dim1, dim2, dim3, 3)
- Returns
shape = (batch, 3), batch of vectors denoting location of centroids.
-
deepreg.model.loss.label.
compute_centroid_distance
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor, grid: tensorflow.Tensor) → tensorflow.Tensor¶ Calculate the L2-distance between two tensors’ centroids.
- Parameters
y_true – tensor, shape = (batch, dim1, dim2, dim3)
y_pred – tensor, shape = (batch, dim1, dim2, dim3)
grid – tensor, shape = (dim1, dim2, dim3, 3)
- Returns
shape = (batch,)
-
deepreg.model.loss.label.
dice_score
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor, binary: bool = False) → tensorflow.Tensor¶ Calculates dice score:
num = 2 * y_true * y_pred
denom = y_true + y_pred
dice score = num / denom
where num and denom are summed over the entire image first.
- Parameters
y_true – shape = (batch, dim1, dim2, dim3)
y_pred – shape = (batch, dim1, dim2, dim3)
binary – True if the y should be projected to 0 or 1
- Returns
shape = (batch,)
-
deepreg.model.loss.label.
dice_score_generalized
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor, pos_weight: float = 1, neg_weight: float = 0) → tensorflow.Tensor¶ Calculates weighted dice score:
let y_prod = y_true * y_pred and y_sum = y_true + y_pred
num = 2 * (pos_w * y_true * y_pred + neg_w * (1−y_true) * (1−y_pred))
= 2 * ((pos_w+neg_w) * y_prod - neg_w * y_sum + neg_w)
denom = (pos_w * (y_true + y_pred) + neg_w * (1−y_true + 1−y_pred))
= (pos_w-neg_w) * y_sum + 2 * neg_w
dice score = num / denom
where num and denom are summed over the entire image first.
- Parameters
y_true – shape = (batch, dim1, dim2, dim3)
y_pred – shape = (batch, dim1, dim2, dim3)
pos_weight – weight of positive class, default = 1
neg_weight – weight of negative class, default = 0
- Returns
shape = (batch,)
-
deepreg.model.loss.label.
foreground_proportion
(y: tensorflow.Tensor) → tensorflow.Tensor¶ Calculating the percentage of foreground vs background per 3d volume.
- Parameters
y – shape = (batch, dim1, dim2, dim3), a 3D label tensor
- Returns
shape = (batch,)
-
deepreg.model.loss.label.
gauss_kernel1d
(sigma: int) → tensorflow.Tensor¶ Calculates a gaussian kernel.
- Parameters
sigma – number defining standard deviation for gaussian kernel.
- Returns
shape = (dim, ) or ()
-
deepreg.model.loss.label.
get_dissimilarity_fn
(config: dict) → Callable¶ Parse arguments from a configuration dictionary and return the loss by averaging batch loss returned by multi- or single-scale loss functions.
- Parameters
config – dict, containing configuration for training.
- Returns
loss function, to calculate float
-
deepreg.model.loss.label.
jaccard_index
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor) → tensorflow.Tensor¶ Calculates jaccard index:
num = y_true * y_pred
denom = y_true + y_pred - y_true * y_pred
jaccard index = num / denom
- Parameters
y_true – shape = (batch, dim1, dim2, dim3)
y_pred – shape = (batch, dim1, dim2, dim3)
- Returns
shape = (batch,)
-
deepreg.model.loss.label.
multi_scale_loss
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor, loss_type: str, loss_scales: list) → tensorflow.Tensor¶ Apply the loss at different scales (gaussian smoothing). It is assumed that loss values are between 0 and 1.
- Parameters
y_true – tensor, shape = (batch, dim1, dim2, dim3)
y_pred – tensor, shape = (batch, dim1, dim2, dim3)
loss_type –
string, indicating which loss to pass to function single_scale_loss.
Supported:
cross-entropy
mean-squared
dice
dice_generalized
jaccard
loss_scales – list, values of sigma to pass to func gauss_kernel_1d.
- Returns
(batch,)
-
deepreg.model.loss.label.
separable_filter3d
(tensor: tensorflow.Tensor, kernel: tensorflow.Tensor) → tensorflow.Tensor¶ Creates a 3d separable filter.
- Parameters
tensor – shape = (batch, dim1, dim2, dim3)
kernel – shape = (dim4,)
- Returns
shape = (batch, dim1, dim2, dim3)
-
deepreg.model.loss.label.
single_scale_loss
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor, loss_type: str) → tensorflow.Tensor¶ Calculate the loss on two tensors based on defined loss.
- Parameters
y_true – tensor, shape = (batch, dim1, dim2, dim3)
y_pred – tensor, shape = (batch, dim1, dim2, dim3)
loss_type –
string, indicating which loss to pass to function single_scale_loss.
Supported:
cross-entropy
mean-squared
dice
dice_generalized
jaccard
- Returns
shape = (batch,)
-
deepreg.model.loss.label.
squared_error
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor) → tensorflow.Tensor¶ Calculates the mean squared difference between y_true, y_pred.
mean((y_true - y_pred)(y_true - y_pred))
- Parameters
y_true – tensor, shape = (batch, dim1, dim2, dim3)
y_pred – shape = (batch, dim1, dim2, dim3)
- Returns
shape = (batch,)
-
deepreg.model.loss.label.
weighted_binary_cross_entropy
(y_true: tensorflow.Tensor, y_pred: tensorflow.Tensor, pos_weight: float = 1) → tensorflow.Tensor¶ Calculates weighted binary cross- entropy:
-loss = − pos_w * y_true log(y_pred) - (1−y_true) log(1−y_pred)
- Parameters
y_true – shape = (batch, dim1, dim2, dim3)
y_pred – shape = (batch, dim1, dim2, dim3)
pos_weight – weight of positive class, scalar. Default value is 1
- Returns
shape = (batch,)
Deformation Loss¶
Module provides regularization energy functions for ddf.
-
deepreg.model.loss.deform.
compute_bending_energy
(ddf: tensorflow.Tensor) → tensorflow.Tensor¶ Calculate the bending energy based on second-order differentiation of ddf using central finite difference.
- Parameters
ddf – shape = (batch, m_dim1, m_dim2, m_dim3, 3)
- Returns
shape = (batch, )
-
deepreg.model.loss.deform.
compute_gradient_norm
(ddf: tensorflow.Tensor, l1: bool = False) → tensorflow.Tensor¶ Calculate the L1/L2 norm of the first-order differentiation of ddf using central finite difference.
- Parameters
ddf – shape = (batch, m_dim1, m_dim2, m_dim3, 3)
l1 – bool true if calculate L1 norm, otherwise L2 norm
- Returns
shape = (batch, )
-
deepreg.model.loss.deform.
gradient_dx
(fx: tensorflow.Tensor) → tensorflow.Tensor¶ Calculate gradients on x-axis of a 3D tensor using central finite difference. It moves the tensor along axis 1 to calculate the approximate gradient, the x axis, dx[i] = (x[i+1] - x[i-1]) / 2.
- Parameters
fx – shape = (batch, m_dim1, m_dim2, m_dim3)
- Returns
shape = (batch, m_dim1-2, m_dim2-2, m_dim3-2)
-
deepreg.model.loss.deform.
gradient_dxyz
(fxyz: tensorflow.Tensor, fn: Callable) → tensorflow.Tensor¶ Calculate gradients on x,y,z-axis of a tensor using central finite difference. The gradients are calculated along x, y, z separately then stacked together.
- Parameters
fxyz – shape = (…, 3)
fn – function to call
- Returns
shape = (…, 3)
-
deepreg.model.loss.deform.
gradient_dy
(fy: tensorflow.Tensor) → tensorflow.Tensor¶ Calculate gradients on y-axis of a 3D tensor using central finite difference. It moves the tensor along axis 2 to calculate the approximate gradient, the y axis, dy[i] = (y[i+1] - y[i-1]) / 2.
- Parameters
fy – shape = (batch, m_dim1, m_dim2, m_dim3)
- Returns
shape = (batch, m_dim1-2, m_dim2-2, m_dim3-2)
-
deepreg.model.loss.deform.
gradient_dz
(fz: tensorflow.Tensor) → tensorflow.Tensor¶ Calculate gradients on z-axis of a 3D tensor using central finite difference. It moves the tensor along axis 3 to calculate the approximate gradient, the z axis, dz[i] = (z[i+1] - z[i-1]) / 2.
- Parameters
fz – shape = (batch, m_dim1, m_dim2, m_dim3)
- Returns
shape = (batch, m_dim1-2, m_dim2-2, m_dim3-2)
-
deepreg.model.loss.deform.
local_displacement_energy
(ddf: tensorflow.Tensor, energy_type: str, **kwargs) → tensorflow.Tensor¶ Calculate the displacement energy of the ddf based on finite difference.
- Parameters
ddf – shape = (batch, m_dim1, m_dim2, m_dim3, 3)
energy_type – type of the energy
kwargs – absorb additional arguments
- Returns
shape = (batch,)