| | |
| | | from functools import partial |
| | | |
| | | |
| | | def drop_path(x, drop_prob: float = 0., training: bool = False, scale_by_keep: bool = True): |
| | | def drop_path(x, drop_prob: float = 0.0, training: bool = False, scale_by_keep: bool = True): |
| | | """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). |
| | | |
| | | This is the same as the DropConnect impl I created for EfficientNet, etc networks, however, |
| | |
| | | 'survival rate' as the argument. |
| | | |
| | | """ |
| | | if drop_prob == 0. or not training: |
| | | if drop_prob == 0.0 or not training: |
| | | return x |
| | | keep_prob = 1 - drop_prob |
| | | shape = (x.shape[0],) + (1,) * (x.ndim - 1) # work with diff dim tensors, not just 2D ConvNets |
| | |
| | | random_tensor.div_(keep_prob) |
| | | return x * random_tensor |
| | | |
| | | |
| | | class DropPath(nn.Module): |
| | | """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). |
| | | """ |
| | | def __init__(self, drop_prob: float = 0., scale_by_keep: bool = True): |
| | | """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).""" |
| | | |
| | | def __init__(self, drop_prob: float = 0.0, scale_by_keep: bool = True): |
| | | super(DropPath, self).__init__() |
| | | self.drop_prob = drop_prob |
| | | self.scale_by_keep = scale_by_keep |
| | |
| | | return drop_path(x, self.drop_prob, self.training, self.scale_by_keep) |
| | | |
| | | def extra_repr(self): |
| | | return f'drop_prob={round(self.drop_prob,3):0.3f}' |
| | | |
| | | |
| | | |
| | | return f"drop_prob={round(self.drop_prob,3):0.3f}" |
| | | |
| | | |
| | | # From PyTorch internals |
| | |
| | | if isinstance(x, collections.abc.Iterable) and not isinstance(x, str): |
| | | return tuple(x) |
| | | return tuple(repeat(x, n)) |
| | | |
| | | return parse |
| | | |
| | | |
| | |
| | | to_4tuple = _ntuple(4) |
| | | to_ntuple = _ntuple |
| | | |
| | | |
| | | class Mlp(nn.Module): |
| | | """ MLP as used in Vision Transformer, MLP-Mixer and related networks |
| | | """ |
| | | """MLP as used in Vision Transformer, MLP-Mixer and related networks""" |
| | | |
| | | def __init__( |
| | | self, |
| | | in_features, |
| | | hidden_features=None, |
| | | out_features=None, |
| | | act_layer=nn.GELU, |
| | | norm_layer=None, |
| | | bias=True, |
| | | drop=0., |
| | | use_conv=False, |
| | | self, |
| | | in_features, |
| | | hidden_features=None, |
| | | out_features=None, |
| | | act_layer=nn.GELU, |
| | | norm_layer=None, |
| | | bias=True, |
| | | drop=0.0, |
| | | use_conv=False, |
| | | ): |
| | | super().__init__() |
| | | out_features = out_features or in_features |
| | |
| | | x = self.fc2(x) |
| | | x = self.drop2(x) |
| | | return x |
| | | |
| | | |