如何在 CNN 中计算网络的 FLOPs [关闭]
Posted
技术标签:
【中文标题】如何在 CNN 中计算网络的 FLOPs [关闭]【英文标题】:how to calculate a net's FLOPs in CNN [closed] 【发布时间】:2017-09-15 09:03:58 【问题描述】:我想设计一个占用GPU资源不超过Alexnet的卷积神经网络。我想用FLOPs来测量它但我不知道如何计算它。请问有什么工具可以做到吗?
【问题讨论】:
重复:***.com/q/41996593/1714410 @Shai:这没有回答问题。该链接的解决方案是问题的一半是 TF 中的打开请求。这是 Caffe。 【参考方案1】:有关在线工具,请参阅http://dgschwend.github.io/netscope/#/editor。对于 alexnet,请参阅 http://dgschwend.github.io/netscope/#/preset/alexnet 。这支持最广为人知的层。对于自定义图层,您必须自己计算。
【讨论】:
请问 MACC 代表什么? 乘法和加法 截至发表此评论之日,此网页 (dgschwend.github.io/netscope/#/preset/alexnet) 似乎没有显示 FLOps。所有 macc 条目都有 NaN【参考方案2】:对于未来的访问者,如果您使用 Keras 和 TensorFlow 作为后端,那么您可以尝试以下示例。它计算 MobileNet 的 FLOP。
import tensorflow as tf
import keras.backend as K
from keras.applications.mobilenet import MobileNet
run_meta = tf.RunMetadata()
with tf.Session(graph=tf.Graph()) as sess:
K.set_session(sess)
net = MobileNet(alpha=.75, input_tensor=tf.placeholder('float32', shape=(1,32,32,3)))
opts = tf.profiler.ProfileOptionBuilder.float_operation()
flops = tf.profiler.profile(sess.graph, run_meta=run_meta, cmd='op', options=opts)
opts = tf.profiler.ProfileOptionBuilder.trainable_variables_parameter()
params = tf.profiler.profile(sess.graph, run_meta=run_meta, cmd='op', options=opts)
print(":, --- :,".format(flops.total_float_ops, params.total_parameters))
【讨论】:
和en.wikipedia.org/wiki/Multiply%E2%80%93accumulate_operation有什么关系? 如果我在 Mobilenet V2 上运行它,我会得到 702 万次失败,但在论文中是 3 亿个 MAC?所以 MAC 和 FLOP 值之间应该有一点差异,但差异很大。 我已更改代码以适应 tf 2.0 api。如果我使用实现(gist.github.com/scheckmedia/cadc5eb3d74ed57a4f3d78011a9f6f7c),我会得到 3504872 个总参数和 608625165 个失败。触发器是乘法和加法,要获得 MAC 值,您应该将结果除以 2。【参考方案3】:如果您使用的是 Keras,则可以在此拉取请求中使用补丁:https://github.com/fchollet/keras/pull/6203
然后只需调用 print_summary(),您就会看到每层的失败次数和总数。
即使不使用 Keras,也值得在 Keras 中重新创建您的网络,这样您就可以获得失败次数。
【讨论】:
【参考方案4】:如果您使用的是 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。
【讨论】:
以上是关于如何在 CNN 中计算网络的 FLOPs [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
神经网络学习小记录72——Parameters参数量FLOPs浮点运算次数FPS每秒传输帧数等计算量衡量指标解析