| 5 | # https://openaccess.thecvf.com/content_cvpr_2018/html/Hu_Squeeze-and-Excitation_Networks_CVPR_2018_paper.html |
| 6 | |
| 7 | class SEBlock(nn.Module): |
| 8 | |
| 9 | def __init__(self, input_channels, internal_neurons): |
| 10 | super(SEBlock, self).__init__() |
| 11 | self.down = nn.Conv2d(in_channels=input_channels, out_channels=internal_neurons, kernel_size=1, stride=1, bias=True) |
| 12 | self.up = nn.Conv2d(in_channels=internal_neurons, out_channels=input_channels, kernel_size=1, stride=1, bias=True) |
| 13 | self.input_channels = input_channels |
| 14 | |
| 15 | def forward(self, inputs): |
| 16 | x = F.avg_pool2d(inputs, kernel_size=inputs.size(3)) |
| 17 | x = self.down(x) |
| 18 | x = F.relu(x) |
| 19 | x = self.up(x) |
| 20 | x = torch.sigmoid(x) |
| 21 | x = x.view(-1, self.input_channels, 1, 1) |
| 22 | return inputs * x |