def forward(self, inputs, drop_connect_rate=None): """ :param inputs: input tensor :param drop_connect_rate: drop connect rate (float, between 0 and 1) :return: output of block """ # Expansion and Depthwise Convolution x = inputs if self._block_args.expand_ratio != 1: x = relu_fn(self._bn0(self._expand_conv(inputs))) x = relu_fn(self._bn1(self._depthwise_conv(x))) # Squeeze and Excitation if self.has_se: x_squeezed = F.adaptive_avg_pool2d(x, 1) x_squeezed = self._se_expand(relu_fn(self._se_reduce(x_squeezed))) x = torch.sigmoid(x_squeezed) * x x = self._bn2(self._project_conv(x)) # Skip connection and drop connect input_filters, output_filters = self._block_args.input_filters, self._block_args.output_filters if self.id_skip and self._block_args.stride == 1 and input_filters == output_filters: if drop_connect_rate: x = drop_connect(x, p=drop_connect_rate, training=self.training) x = x + inputs # skip connection return x
def extract_features(self, inputs): """ Returns output of the final convolution layer """ # Stem ###count 21, 29 x = relu_fn(self._bn0(self._conv_stem(inputs))) #print ("Extract_features fun:: begining", x.shape) # Blocks flag = 0 pointer = 0 for idx, block in enumerate(self._blocks): drop_connect_rate = self._global_params.drop_connect_rate if drop_connect_rate: drop_connect_rate *= float(idx) / len(self._blocks) x = block(x, drop_connect_rate=drop_connect_rate) #print ("Extract_features fun:: for loop count::", idx , x.shape) if idx == self.source_layer_indexes[pointer] and flag == 0: C3 = x flag = 1 pointer += 1 if idx == self.source_layer_indexes[pointer]: C4 = x #if idx==31: # C5 = x # Head x = relu_fn(self._bn1(self._conv_head(x))) #print ("Extract_features fun:: ending", x.shape) #return x return x, C3, C4