Hi,
I have implemented a custom Adaptive pooling layer which is meant to learn the best weighting between MaxPooling and AvgPooling but for some reason the gradient of the weight is always zero. What am I missing?
class HybridPooling2d(nn.Module):
def __init__(self, output_size):
super(HybridPooling2d, self).__init__()
self.output_size = output_size
self.weight = nn.Parameter( torch.Tensor(1, 1) )
self.weight.data.uniform_()
def forward(self, x):
return self.weight * F.adaptive_avg_pool2d(x, self.output_size) + (1 - self.weight) * F.adaptive_max_pool2d(x, self.output_size)
I am using this in the last layer of my network as follows:
def forward(self, x):
out = self.features(x)
# out = F.max_pool2d(out, kernel_size=out.size()[2:])
out = self.ghp(out)
out = F.dropout2d(out, 0.1, training=True)
out = out.view(out.size(0), -1)
out = self.classifier(out)
return out
where self.features = nn.Sequential(...)
and self.ghp = HybridPooling2d(..)