| |
| |
|
|
| |
| |
|
|
| import torch |
| import torch.nn as nn |
|
|
| from typing import Type |
|
|
| class Adapter(nn.Module): |
| def __init__(self, D_features, mlp_ratio=0.25, act_layer=nn.GELU, skip_connect=True): |
| super().__init__() |
| self.skip_connect = skip_connect |
| D_hidden_features = int(D_features * mlp_ratio) |
| self.act = act_layer() |
| self.D_fc1 = nn.Linear(D_features, D_hidden_features) |
| self.D_fc2 = nn.Linear(D_hidden_features, D_features) |
| |
| def forward(self, x): |
| |
| xs = self.D_fc1(x) |
| xs = self.act(xs) |
| xs = self.D_fc2(xs) |
| if self.skip_connect: |
| x = x + xs |
| else: |
| x = xs |
| return x |
|
|
|
|
| class AugAdapter(nn.Module): |
| def __init__(self, D_features, mlp_ratio=0.25, num_heads=12, act_layer=nn.GELU, skip_connect=True): |
| super().__init__() |
| self.skip_connect = skip_connect |
| D_hidden_features = int(D_features * mlp_ratio) |
| self.act = act_layer() |
| self.D_fc1 = nn.Linear(D_features, D_hidden_features) |
| self.D_fc2 = nn.Linear(D_hidden_features, D_features) |
| self.aug_fc = nn.Linear(num_heads, D_hidden_features) |
| |
| def forward(self, x, important_key): |
| |
| xs = self.D_fc1(x) |
| aug = self.aug_fc(important_key) |
| xs = self.act(xs * aug) |
| xs = self.D_fc2(xs) |
| if self.skip_connect: |
| x = x + xs |
| else: |
| x = xs |
| return x |
|
|
|
|
| class MLPBlock(nn.Module): |
| def __init__( |
| self, |
| embedding_dim: int, |
| mlp_dim: int, |
| act: Type[nn.Module] = nn.GELU, |
| ) -> None: |
| super().__init__() |
| self.lin1 = nn.Linear(embedding_dim, mlp_dim) |
| self.lin2 = nn.Linear(mlp_dim, embedding_dim) |
| self.act = act() |
|
|
| def forward(self, x: torch.Tensor) -> torch.Tensor: |
| x = self.lin1(x) |
| x = self.act(x) |
| x = self.lin2(x) |
| return x |
| |
|
|
|
|
| |
| |
| class LayerNorm2d(nn.Module): |
| def __init__(self, num_channels: int, eps: float = 1e-6) -> None: |
| super().__init__() |
| self.weight = nn.Parameter(torch.ones(num_channels)) |
| self.bias = nn.Parameter(torch.zeros(num_channels)) |
| self.eps = eps |
|
|
| def forward(self, x: torch.Tensor) -> torch.Tensor: |
| u = x.mean(1, keepdim=True) |
| s = (x - u).pow(2).mean(1, keepdim=True) |
| x = (x - u) / torch.sqrt(s + self.eps) |
| x = self.weight[:, None, None] * x + self.bias[:, None, None] |
| return x |
|
|