| 12 | |
| 13 | |
| 14 | class ResidualBlock(nn.Module): |
| 15 | def __init__(self, dims, in_channels, out_channels): |
| 16 | super(ResidualBlock, self).__init__() |
| 17 | self.conv1 = conv_nd(dims, in_channels, out_channels, kernel_size=3, stride=1, padding=1) |
| 18 | self.silu = nn.SiLU() |
| 19 | self.conv2 = conv_nd(dims, out_channels, out_channels, kernel_size=3, stride=1, padding=1) |
| 20 | |
| 21 | if in_channels != out_channels: |
| 22 | self.residual = conv_nd(dims, in_channels, out_channels, kernel_size=1, stride=1) |
| 23 | else: |
| 24 | self.residual = nn.Identity() |
| 25 | |
| 26 | def forward(self, x): |
| 27 | residual = self.residual(x) |
| 28 | out = self.conv1(x) |
| 29 | out = self.silu(out) |
| 30 | out = self.conv2(out) |
| 31 | out += residual |
| 32 | out = self.silu(out) |
| 33 | return out |
| 34 | |
| 35 | |
| 36 | class PatchMerging(nn.Module): |