Small adaptation layers.
| 26 | } |
| 27 | |
| 28 | class AdaptLayers(nn.Module): |
| 29 | """Small adaptation layers. |
| 30 | """ |
| 31 | |
| 32 | def __init__(self, hypercolumn_layers: List[str], output_dim: int = 128): |
| 33 | """Initialize one adaptation layer for every extraction point. |
| 34 | |
| 35 | Args: |
| 36 | hypercolumn_layers: The list of the hypercolumn layer names. |
| 37 | output_dim: The output channel dimension. |
| 38 | """ |
| 39 | super(AdaptLayers, self).__init__() |
| 40 | self.layers = [] |
| 41 | channel_sizes = [EB3_layers[name] for name in hypercolumn_layers] |
| 42 | for i, l in enumerate(channel_sizes): |
| 43 | layer = nn.Sequential( |
| 44 | nn.Conv2d(l, 64, kernel_size=1, stride=1, padding=0), |
| 45 | nn.ReLU(), |
| 46 | nn.Conv2d(64, output_dim, kernel_size=5, stride=1, padding=2), |
| 47 | nn.BatchNorm2d(output_dim), |
| 48 | ) |
| 49 | self.layers.append(layer) |
| 50 | self.add_module("adapt_layer_{}".format(i), layer) # ex: adapt_layer_0 |
| 51 | |
| 52 | def forward(self, features: List[torch.tensor]): |
| 53 | """Apply adaptation layers. # here is list of three levels of features |
| 54 | """ |
| 55 | |
| 56 | for i, _ in enumerate(features): |
| 57 | features[i] = getattr(self, "adapt_layer_{}".format(i))(features[i]) |
| 58 | return features |
| 59 | |
| 60 | class EfficientNetB3(nn.Module): |
| 61 | ''' DFNet with EB3 backbone ''' |