| 322 | |
| 323 | |
| 324 | class ConvLayer(nn.Sequential): |
| 325 | def __init__( |
| 326 | self, |
| 327 | in_channel, |
| 328 | out_channel, |
| 329 | kernel_size, |
| 330 | downsample=False, |
| 331 | blur_kernel=[1, 3, 3, 1], |
| 332 | bias=True, |
| 333 | activate=True, |
| 334 | ): |
| 335 | layers = [] |
| 336 | |
| 337 | if downsample: |
| 338 | factor = 2 |
| 339 | p = (len(blur_kernel) - factor) + (kernel_size - 1) |
| 340 | pad0 = (p + 1) // 2 |
| 341 | pad1 = p // 2 |
| 342 | |
| 343 | layers.append(Blur(blur_kernel, pad=(pad0, pad1))) |
| 344 | |
| 345 | stride = 2 |
| 346 | self.padding = 0 |
| 347 | |
| 348 | else: |
| 349 | stride = 1 |
| 350 | self.padding = kernel_size // 2 |
| 351 | |
| 352 | layers.append(EqualConv2d(in_channel, out_channel, kernel_size, padding=self.padding, stride=stride, |
| 353 | bias=bias and not activate)) |
| 354 | |
| 355 | if activate: |
| 356 | if bias: |
| 357 | layers.append(FusedLeakyReLU(out_channel)) |
| 358 | else: |
| 359 | layers.append(ScaledLeakyReLU(0.2)) |
| 360 | |
| 361 | super().__init__(*layers) |
| 362 | |
| 363 | |
| 364 | class ToRGB(nn.Module): |