模型flops 的计算方法

insightface 里面的计算flops 的方法

在:下面的flops_counter.py

python flops_counter.py 可以得到需要的flops

模型flops 的计算方法_第1张图片

从代码上可以看到 计算两部分的flops

一部分是卷积的flops 另外一部分是fc 层的flops attr 表示有没有偏置

我们打印出来卷积里面的input_shape 和output_shape

cov层的flops 的计算公式为:

-1 是对于没有偏置的情况

kernel 一般是方形的 kernel[0] 和kernel[1] 是一样的 

输入通道对应input_shape[1]  比如3 64 。。。。

输出通道为output_shape[1] 比如 64 128。。。。

def count_conv_flops(input_shape, output_shape, attr):
  kernel = attr['kernel'][1:-1].split(',')
  kernel = [int(x) for x in kernel]

  #print('kernel', kernel)
  if is_no_bias(attr):
    ret = (2*input_shape[1]*kernel[0]*kernel[1]-1)*output_shape[2]*output_shape[3]*output_shape[1]
  else:
    ret = 2*input_shape[1]*kernel[0]*kernel[1]*output_shape[2]*output_shape[3]*output_shape[1]
  num_group = 1
  if 'num_group' in attr:
    num_group = int(attr['num_group'])
  ret /= num_group
  return int(ret)

H 和 W 分别为 输出层的feature map

对于模型flops 的计算方法_第2张图片

对于全连接层:

模型flops 的计算方法_第3张图片

模型flops 的计算方法_第4张图片

 for nodeid, node in enumerate(nodes):
    flops = 0
    if node['op']=='Convolution':
      output_shape = nodeid_shape[nodeid]
      name = node['name']
      attr = node['attrs']
      input_nodeid = node['inputs'][0][0]
      input_shape = nodeid_shape[input_nodeid]
      flops = count_conv_flops(input_shape, output_shape, attr)
    elif node['op']=='FullyConnected':
      attr = node['attrs']
      output_shape = nodeid_shape[nodeid]
      input_nodeid = node['inputs'][0][0]
      input_shape = nodeid_shape[input_nodeid]
      output_filter = output_shape[1]
      input_filter = input_shape[1]*input_shape[2]*input_shape[3]
      #assert len(input_shape)==4 and input_shape[2]==1 and input_shape[3]==1
      flops = count_fc_flops(input_filter, output_filter, attr)
    #print(node, flops)

 

你可能感兴趣的:(python,小程序)