You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Keras中计算MobileNet的FLOPs?含代码实现示例

如何在Keras中计算MobileNet的FLOPs?

没问题,我帮你完善这段代码,同时把每个步骤的逻辑讲清楚,这样你就能准确算出MobileNet的FLOPs(浮点运算次数)和可训练参数数量了~

针对TensorFlow 1.x(适配你的原始代码版本)

你的代码已经有了核心框架,主要是补全params统计的部分,同时优化细节避免统计偏差:

import tensorflow as tf
from keras.applications.mobilenet import MobileNet
import keras.backend as K

# 初始化RunMetadata,用于存储统计过程的元数据
run_meta = tf.RunMetadata()

with tf.Session(graph=tf.Graph()) as sess:
    # 将Keras的会话绑定到当前TensorFlow会话
    K.set_session(sess)
    
    # 指定在CPU上构建模型(避免GPU的融合操作干扰FLOPs统计,CPU的计算图更贴近原始逻辑)
    with tf.device('/cpu:0'):
        # 构建MobileNet,input_tensor明确单样本输入形状(batch_size=1),方便统计单样本FLOPs
        base_model = MobileNet(alpha=1, weights=None, input_tensor=tf.placeholder('float32', shape=(1, 224, 224, 3)))
    
    # 配置FLOPs统计选项:只统计浮点运算
    flops_opts = tf.profiler.ProfileOptionBuilder.float_operation()
    # 执行FLOPs统计:cmd='op'按操作类型汇总,也可以用cmd='scope'按模型层级统计
    flops = tf.profiler.profile(sess.graph, run_meta=run_meta, cmd='op', options=flops_opts)
    print(f"总FLOPs: {flops.total_float_ops / 1e9:.2f} GFLOPs")
    
    # 配置可训练参数统计选项
    params_opts = tf.profiler.ProfileOptionBuilder.trainable_variables_parameter()
    # 执行参数统计:cmd='scope'按层展示参数分布,更直观
    params = tf.profiler.profile(sess.graph, run_meta=run_meta, cmd='scope', options=params_opts)
    print(f"可训练参数总数: {params.total_parameters / 1e6:.2f} M")

关键细节说明:

  • 绑定会话与指定CPU:Keras在TF1后端依赖TensorFlow计算图,显式绑定会话+CPU构建模型,能避免GPU优化对统计结果的干扰。
  • 单样本输入:设置shape=(1,224,224,3)是为了统计单样本的FLOPs,如果你的实际batch size更大,直接按倍数换算即可。
  • 单位转换:将FLOPs转为GFLOPs(1e9)、参数转为M(1e6),方便阅读和对比。

针对TensorFlow 2.x(Keras已整合进TF)

如果用的是TF2.x(现在更主流),可以用更简洁的方式,甚至借助第三方库简化操作:

方法1:用原生TF Profiler

import tensorflow as tf
from tensorflow.keras.applications import MobileNet

# 构建MobileNet模型
model = MobileNet(alpha=1, weights=None, input_shape=(224,224,3))

# 生成单样本输入张量
input_tensor = tf.random.normal((1, 224, 224, 3))

# 追踪计算图并统计FLOPs
with tf.profiler.experimental.Profile('./tmp_profile'):
    with tf.profiler.experimental.Trace('forward_pass', step_num=1, _r=1):
        model(input_tensor)

# 直接统计可训练参数
print(f"可训练参数总数: {model.count_params() / 1e6:.2f} M")

执行后可以在TensorBoard中查看详细的FLOPs分布(通过tensorboard --logdir=./tmp_profile启动)。

方法2:用第三方库keras-flops(更便捷)

先安装库:pip install keras-flops

import tensorflow as tf
from tensorflow.keras.applications import MobileNet
from keras_flops import get_flops

model = MobileNet(alpha=1, weights=None, input_shape=(224,224,3))

# 统计单样本FLOPs
flops = get_flops(model, batch_size=1)
print(f"总FLOPs: {flops / 1e9:.2f} GFLOPs")
print(f"可训练参数总数: {model.count_params() / 1e6:.2f} M")

注意事项

  • MobileNet的alpha参数会直接影响模型宽度,不同alpha对应的FLOPs差异很大(比如alpha=0.5的模型FLOPs约为alpha=1的1/4)。
  • FLOPs的定义差异:TF Profiler统计的是所有浮点运算的总数(一次乘加算2次FLOPs),而很多论文中会把乘加算作1次运算,所以如果需要对齐论文数值,记得把统计结果除以2。

内容的提问来源于stack exchange,提问作者Y. Han

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:26:06