## FLOPs

paddleslim.analysis.flops(program, detail=False) 源代码

  获得指定网络的浮点运算次数(FLOPs)。

参数：

- program(paddle.fluid.Program) - 待分析的目标网络。更多关于Program的介绍请参考：Program概念介绍。

- detail(bool) - 是否返回每个卷积层的FLOPs。默认为False。

- only_conv(bool) - 如果设置为True，则仅计算卷积层和全连接层的FLOPs，即浮点数的乘加（multiplication-adds）操作次数。如果设置为False，则也会计算卷积和全连接层之外的操作的FLOPs。

返回值：

- flops(float) - 整个网络的FLOPs。

- params2flops(dict) - 每层卷积对应的FLOPs，其中key为卷积层参数名称，value为FLOPs值。

示例：

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53

    import paddle.fluid as fluid
    from paddle.fluid.param_attr import ParamAttr
    from paddleslim.analysis import flops

    def conv_bn_layer(input,
                      num_filters,
                      filter_size,
                      name,
                      stride=1,
                      groups=1,
                      act=None):
        conv = fluid.layers.conv2d(
            input=input,
            num_filters=num_filters,
            filter_size=filter_size,
            stride=stride,
            padding=(filter_size - 1) // 2,
            groups=groups,
            act=None,
            param_attr=ParamAttr(name=name + "_weights"),
            bias_attr=False,
            name=name + "_out")
        bn_name = name + "_bn"
        return fluid.layers.batch_norm(
            input=conv,
            act=act,
            name=bn_name + '_output',
            param_attr=ParamAttr(name=bn_name + '_scale'),
            bias_attr=ParamAttr(bn_name + '_offset'),
            moving_mean_name=bn_name + '_mean',
            moving_variance_name=bn_name + '_variance', )

    main_program = fluid.Program()
    startup_program = fluid.Program()
    #   X       X              O       X              O
    # conv1-->conv2-->sum1-->conv3-->conv4-->sum2-->conv5-->conv6
    #     |            ^ |                    ^
    #     |____________| |____________________|
    #
    # X: prune output channels
    # O: prune input channels
    with fluid.program_guard(main_program, startup_program):
        input = fluid.data(name="image", shape=[None, 3, 16, 16])
        conv1 = conv_bn_layer(input, 8, 3, "conv1")
        conv2 = conv_bn_layer(conv1, 8, 3, "conv2")
        sum1 = conv1 + conv2
        conv3 = conv_bn_layer(sum1, 8, 3, "conv3")
        conv4 = conv_bn_layer(conv3, 8, 3, "conv4")
        sum2 = conv4 + sum1
        conv5 = conv_bn_layer(sum2, 8, 3, "conv5")
        conv6 = conv_bn_layer(conv5, 8, 3, "conv6")

    print("FLOPs: {}".format(flops(main_program)))

## model_size

paddleslim.analysis.model_size(program) 源代码

获得指定网络的参数数量。

参数：

- program(paddle.fluid.Program) - 待分析的目标网络。更多关于Program的介绍请参考：Program概念介绍。

返回值：

- model_size(int) - 整个网络的参数数量。

示例：

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45

    import paddle.fluid as fluid
    from paddle.fluid.param_attr import ParamAttr
    from paddleslim.analysis import model_size

    def conv_layer(input,
                      num_filters,
                      filter_size,
                      name,
                      stride=1,
                      groups=1,
                      act=None):
        conv = fluid.layers.conv2d(
            input=input,
            num_filters=num_filters,
            filter_size=filter_size,
            stride=stride,
            padding=(filter_size - 1) // 2,
            groups=groups,
            act=None,
            param_attr=ParamAttr(name=name + "_weights"),
            bias_attr=False,
            name=name + "_out")
        return conv

    main_program = fluid.Program()
    startup_program = fluid.Program()
    #   X       X              O       X              O
    # conv1-->conv2-->sum1-->conv3-->conv4-->sum2-->conv5-->conv6
    #     |            ^ |                    ^
    #     |____________| |____________________|
    #
    # X: prune output channels
    # O: prune input channels
    with fluid.program_guard(main_program, startup_program):
        input = fluid.data(name="image", shape=[None, 3, 16, 16])
        conv1 = conv_layer(input, 8, 3, "conv1")
        conv2 = conv_layer(conv1, 8, 3, "conv2")
        sum1 = conv1 + conv2
        conv3 = conv_layer(sum1, 8, 3, "conv3")
        conv4 = conv_layer(conv3, 8, 3, "conv4")
        sum2 = conv4 + sum1
        conv5 = conv_layer(sum2, 8, 3, "conv5")
        conv6 = conv_layer(conv5, 8, 3, "conv6")

    print("FLOPs: {}".format(model_size(main_program)))

## TableLatencyEvaluator

paddleslim.analysis.TableLatencyEvaluator(table_file, delimiter=",") 源代码

  基于硬件延时表的模型延时评估器。

参数：

- table_file(str) - 所使用的延时评估表的绝对路径。关于演示评估表格式请参考：PaddleSlim硬件延时评估表格式

- delimiter(str) - 硬件延时评估表中，操作信息之前所使用的分割符，默认为英文字符逗号。

返回值：

- Evaluator - 硬件延时评估器的实例。

paddleslim.analysis.TableLatencyEvaluator.latency(graph) 源代码

  获得指定网络的预估延时。

参数：

- graph(Program) - 待预估的目标网络。

返回值：

- latency - 目标网络的预估延时。

GitHub « Previous Next »