def get_M(self, F, tau=0.05): assert (F.dim() == 4) F_squared_sum = F.pow(2).sum(1, keepdim=True).pow(0.5) F_normalized = self.normalize_0_to_1(F_squared_sum) # all feature normalize ~ [0,1] M = self.Tensor(F_normalized.size()) M.copy_(torch.ge(F_normalized, tau)) # >= tau return M
def stdv_channels(F): assert (F.dim() == 4) F_mean = mean_channels(F) F_variance = (F - F_mean).pow(2).sum(3, keepdim=True).sum( 2, keepdim=True) / (F.size(2) * F.size(3)) x = F_variance.pow(0.5) return x
def rescaled_contrast_layer(F): assert (F.dim() == 4) F_mean = mean_channels(F) F_variance = (F - F_mean).pow(2).sum(3, keepdim=True).sum( 2, keepdim=True) / (F.size(2) * F.size(3)) # return F_mean / F_variance.pow(0.5) # return - F_mean + F_variance return -F_mean / F_variance.pow(0.5) + F_variance.pow(0.5)
def normalize_0_to_1(self, F): assert (F.dim() == 4) max_val = F.max() min_val = F.min() if max_val != min_val: F_normalized = (F - min_val) / (max_val - min_val) else: F_normalized = self.Tensor(F.size()).fill_(0) return F_normalized
def mean_channels(F): assert (F.dim() == 4) spatial_sum = F.sum(3, keepdim=True).sum(2, keepdim=True) return spatial_sum / (F.size(2) * F.size(3))