Args: None, initializes weights for conv/linear/batchnorm layers following weight init methods from `official Tensorflow EfficientNet implementation <https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/efficientnet_model
(self)
| 449 | return x |
| 450 | |
| 451 | def _initialize_weights(self) -> None: |
| 452 | """ |
| 453 | Args: |
| 454 | None, initializes weights for conv/linear/batchnorm layers |
| 455 | following weight init methods from |
| 456 | `official Tensorflow EfficientNet implementation |
| 457 | <https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/efficientnet_model.py#L61>`_. |
| 458 | Adapted from `EfficientNet-PyTorch's init method |
| 459 | <https://github.com/rwightman/gen-efficientnet-pytorch/blob/master/geffnet/efficientnet_builder.py>`_. |
| 460 | """ |
| 461 | for _, m in self.named_modules(): |
| 462 | if isinstance(m, (nn.Conv1d, nn.Conv2d, nn.Conv3d)): |
| 463 | fan_out = reduce(operator.mul, m.kernel_size, 1) * m.out_channels |
| 464 | m.weight.data.normal_(0, math.sqrt(2.0 / fan_out)) |
| 465 | if m.bias is not None: |
| 466 | m.bias.data.zero_() |
| 467 | elif isinstance(m, (nn.BatchNorm1d, nn.BatchNorm2d, nn.BatchNorm3d)): |
| 468 | m.weight.data.fill_(1.0) |
| 469 | m.bias.data.zero_() |
| 470 | elif isinstance(m, nn.Linear): |
| 471 | fan_out = m.weight.size(0) |
| 472 | fan_in = 0 |
| 473 | init_range = 1.0 / math.sqrt(fan_in + fan_out) |
| 474 | m.weight.data.uniform_(-init_range, init_range) |
| 475 | m.bias.data.zero_() |
| 476 | |
| 477 | |
| 478 | class EfficientNetBN(EfficientNet): |