| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| import torch |
| from torch import nn |
|
|
|
|
| def drop_path(x: torch.Tensor, drop_prob: float = 0.0, training: bool = False) -> torch.Tensor: |
| """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). |
| |
| Parameters |
| ---------- |
| x : torch.Tensor |
| Input tensor of shape (B, *) where B is the batch size and * is any number of additional dimensions. |
| drop_prob : float, optional |
| Probability of dropping a path, by default 0.0 |
| training : bool, optional |
| Whether the model is in training mode, by default False. If False, no paths are dropped. |
| |
| Returns |
| ------- |
| torch.Tensor |
| Output tensor with the same shape as input x, with paths dropped according to drop_prob. |
| """ |
| if drop_prob == 0.0 or not training: |
| return x |
| keep_prob = 1 - drop_prob |
| shape = (x.shape[0],) + (1,) * (x.ndim - 1) |
| random_tensor = x.new_empty(shape).bernoulli_(keep_prob) |
| if keep_prob > 0.0: |
| random_tensor.div_(keep_prob) |
| output = x * random_tensor |
| return output |
|
|
|
|
| class DropPath(nn.Module): |
| """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). |
| |
| Parameters |
| ---------- |
| drop_prob : float, optional |
| Probability of dropping a path, by default None. If None, no paths are dropped. |
| If set to 0.0, it behaves like an identity function. |
| """ |
|
|
| def __init__(self, drop_prob: float = 0.0) -> None: |
| """Inits :class:`DropPath`. |
| |
| Parameters |
| ---------- |
| drop_prob : float, optional |
| Probability of dropping a path, by default 0.0. If None, no paths are dropped. |
| If set to 0.0, it behaves like an identity function. |
| """ |
| super().__init__() |
| self.drop_prob = drop_prob |
|
|
| def forward(self, x: torch.Tensor) -> torch.Tensor: |
| """Forward pass of :class:`DropPath`. |
| |
| Parameters |
| ---------- |
| x : torch.Tensor |
| Input tensor of shape (B, *) where B is the batch size and * is any number of additional dimensions. |
| |
| Returns |
| ------- |
| torch.Tensor |
| Output tensor with the same shape as input x, with paths dropped according to drop_prob. |
| """ |
| return drop_path(x, self.drop_prob, self.training) |
|
|