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