如何计算CNN中网络的FLOP

时间:2017-04-19 08:37:11

标签: neural-network deep-learning caffe conv-neural-network

我想设计一个卷积神经网络,占用GPU资源不超过Alexnet。我想用FLOP来测量它但我不知道如何计算它。请问有什么工具吗? / p>

4 个答案:

答案 0 :(得分:7)

有关在线工具,请参阅http://dgschwend.github.io/netscope/#/editor。对于alexnet,请参阅http://dgschwend.github.io/netscope/#/preset/alexnet。这支持大多数广为人知的图层。对于自定义图层,您必须自己计算。

答案 1 :(得分:6)

对于将来的访问者,如果您使用Keras和TensorFlow作为后端,那么您可以尝试以下示例。它计算MobileNet的FLOP。

<project>/public/index.php

答案 2 :(得分:0)

如果你正在使用Keras,你可以在这个拉取请求中使用补丁:https://github.com/fchollet/keras/pull/6203

然后只需调用print_summary(),你就会看到每层的翻转和总数。

即使不使用Keras,在Keras重新创建你的网也许是值得的,这样你就可以获得翻牌数。

答案 3 :(得分:0)

如果使用TensorFlow v1.x,则Tobias Scheck的答案有效,但是如果使用 TensorFlow v2.x ,则可以使用以下代码:

import tensorflow as tf

def get_flops(model_h5_path):
    session = tf.compat.v1.Session()
    graph = tf.compat.v1.get_default_graph()
        

    with graph.as_default():
        with session.as_default():
            model = tf.keras.models.load_model(model_h5_path)

            run_meta = tf.compat.v1.RunMetadata()
            opts = tf.compat.v1.profiler.ProfileOptionBuilder.float_operation()
        
            # We use the Keras session graph in the call to the profiler.
            flops = tf.compat.v1.profiler.profile(graph=graph,
                                                  run_meta=run_meta, cmd='op', options=opts)
        
            return flops.total_float_ops

以上功能采用h5格式保存的模型的路径。您可以通过以下方式保存模型并使用该函数:

model.save('path_to_my_model.h5')
tf.compat.v1.reset_default_graph()
print(get_flops('path_to_my_model.h5'))

请注意,每次调用函数时,我们都使用tf.compat.v1.reset_default_graph()来不累积FLOPS。