def GetFlopsAndParams()

in c2/lib/utils/model_helper.py [0:0]


def GetFlopsAndParams(model, gpu_id=0):
    model_ops = model.net.Proto().op
    master_gpu = 'gpu_{}'.format(gpu_id)
    param_ops = []
    for idx in range(len(model_ops)):
        op_type = model.net.Proto().op[idx].type
        op_input = model.net.Proto().op[idx].input[0]
        if op_type in ['Conv', 'FC'] and op_input.find(master_gpu) >= 0:
            param_ops.append(model.net.Proto().op[idx])

    num_flops = 0
    num_params = 0
    num_interactions = 0
    for idx in range(len(param_ops)):
        op = param_ops[idx]
        op_type = op.type
        op_inputs = param_ops[idx].input
        op_output = param_ops[idx].output[0]
        layer_flops = 0
        layer_params = 0
        if op_type == 'Conv':
            for op_input in op_inputs:
                if '_w' in op_input and 'bias' not in op_input:
                    param_blob = op_input
                    param_shape = np.array(
                        workspace.FetchBlob(str(param_blob))).shape
                    layer_params = (
                        np.prod(param_shape)
                    )
                    output_shape = np.array(
                        workspace.FetchBlob(str(op_output))).shape
                    layer_flops = layer_params * np.prod(output_shape[2:])
                    layer_interactions = 0.5 * param_shape[0] * param_shape[1] * (param_shape[1] - 1)
                    # log.info('{} size {}x{}x{} FLOPs {} params {} inters {}'.format(
                    #     str(param_blob),
                    #     (param_shape[2] if len(param_shape) == 5 else 1),
                    #     (param_shape[3] if len(param_shape) == 5 else param_shape[2]),
                    #     (param_shape[4] if len(param_shape) == 5 else param_shape[3]),
                    #     layer_flops,
                    #     layer_params,
                    #     layer_interactions))
        elif op_type == 'FC':
            for op_input in op_inputs:
                if '_w' in op_input:
                    param_blob = op_input
                    param_shape = np.array(
                        workspace.FetchBlob(str(param_blob))).shape
                    layer_params = param_shape[0] * param_shape[1]
                    layer_flops = layer_params
                    layer_interactions = 0  # not count interactions on FC
        layer_params /= 1000000
        layer_flops /= 1000000000
        layer_interactions /= 1000000000
        num_flops += layer_flops
        num_params += layer_params
        num_interactions += layer_interactions
    return num_flops, num_params, num_interactions