def METHOD_NAME(self, inputs):
    bottom_up_features = self.bottom_up(inputs)
    assert len(bottom_up_features) == len(self.in_features)
    inputs = [bottom_up_features[f] for f in self.in_features]
    outs = []
    for i in range(len(inputs)):
        outs.append(self.interp_conv[i](inputs[i]))
    shape_2 = min(o.shape[2] for o in outs)
    shape_3 = min(o.shape[3] for o in outs)
    out = torch.cat([o[:, :, :shape_2, :shape_3] for o in outs], dim=1)
    outs = []
    for i in range(self.n_out_features):
        outs.append(self.reduction_pooling_conv[i](out))
    for i in range(len(outs)):  # Make shapes consistent
        outs[-1 - i] = outs[-1 - i][
            :, :, : outs[-1].shape[2] * 2**i, : outs[-1].shape[3] * 2**i
        ]
    outputs = []
    for i in range(len(outs)):
        if self.share_conv:
            outputs.append(self.fpn_conv(outs[i]))
        else:
            outputs.append(self.fpn_conv[i](outs[i]))
    assert len(self._out_features) == len(outputs)
    return dict(zip(self._out_features, outputs))