| |
| from typing import Any, Dict, Optional |
|
|
| import torch |
| import torch.nn as nn |
| from mmengine.registry import MODELS |
|
|
|
|
| def drop_path(x: torch.Tensor, |
| drop_prob: float = 0., |
| training: bool = False) -> torch.Tensor: |
| """Drop paths (Stochastic Depth) per sample (when applied in main path of |
| residual blocks). |
| |
| We follow the implementation |
| https://github.com/rwightman/pytorch-image-models/blob/a2727c1bf78ba0d7b5727f5f95e37fb7f8866b1f/timm/models/layers/drop.py # noqa: E501 |
| """ |
| if drop_prob == 0. or not training: |
| return x |
| keep_prob = 1 - drop_prob |
| |
| shape = (x.shape[0], ) + (1, ) * (x.ndim - 1) |
| random_tensor = keep_prob + torch.rand( |
| shape, dtype=x.dtype, device=x.device) |
| output = x.div(keep_prob) * random_tensor.floor() |
| return output |
|
|
|
|
| @MODELS.register_module() |
| class DropPath(nn.Module): |
| """Drop paths (Stochastic Depth) per sample (when applied in main path of |
| residual blocks). |
| |
| We follow the implementation |
| https://github.com/rwightman/pytorch-image-models/blob/a2727c1bf78ba0d7b5727f5f95e37fb7f8866b1f/timm/models/layers/drop.py # noqa: E501 |
| |
| Args: |
| drop_prob (float): Probability of the path to be zeroed. Default: 0.1 |
| """ |
|
|
| def __init__(self, drop_prob: float = 0.1): |
| super().__init__() |
| self.drop_prob = drop_prob |
|
|
| def forward(self, x: torch.Tensor) -> torch.Tensor: |
| return drop_path(x, self.drop_prob, self.training) |
|
|
|
|
| @MODELS.register_module() |
| class Dropout(nn.Dropout): |
| """A wrapper for ``torch.nn.Dropout``, We rename the ``p`` of |
| ``torch.nn.Dropout`` to ``drop_prob`` so as to be consistent with |
| ``DropPath`` |
| |
| Args: |
| drop_prob (float): Probability of the elements to be |
| zeroed. Default: 0.5. |
| inplace (bool): Do the operation inplace or not. Default: False. |
| """ |
|
|
| def __init__(self, drop_prob: float = 0.5, inplace: bool = False): |
| super().__init__(p=drop_prob, inplace=inplace) |
|
|
|
|
| def build_dropout(cfg: Dict, default_args: Optional[Dict] = None) -> Any: |
| """Builder for drop out layers.""" |
| return MODELS.build(cfg, default_args=default_args) |
|
|