| 52 | return x + self.proj_out(h_) |
| 53 | |
| 54 | class ResnetBlock: |
| 55 | def __init__(self, in_channels, out_channels=None): |
| 56 | self.norm1 = GroupNorm(32, in_channels) |
| 57 | self.conv1 = Conv2d(in_channels, out_channels, 3, padding=1) |
| 58 | self.norm2 = GroupNorm(32, out_channels) |
| 59 | self.conv2 = Conv2d(out_channels, out_channels, 3, padding=1) |
| 60 | self.nin_shortcut = Conv2d(in_channels, out_channels, 1) if in_channels != out_channels else lambda x: x |
| 61 | |
| 62 | def __call__(self, x): |
| 63 | h = self.conv1(self.norm1(x).swish()) |
| 64 | h = self.conv2(self.norm2(h).swish()) |
| 65 | return self.nin_shortcut(x) + h |
| 66 | |
| 67 | class Mid: |
| 68 | def __init__(self, block_in): |