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

TensorFlow中model.summary与trainable_weights统计可训练参数为何存在差异?

TensorFlow中model.summary()与trainable_weights统计结果的差异问题

测试代码与输出

冻结/解冻模型的测试代码

import tensorflow as tf
from tensorflow import keras

conv_model = keras.applications.vgg16.VGG16(
    weights='imagenet',
    include_top=False)
conv_model.trainable=False
print("Number of trainable weights after freezing: ", len(conv_model.trainable_weights))
conv_model.trainable=True
print("Number of trainable weights after defreezing: ", len(conv_model.trainable_weights))

运行输出

Number of trainable weights after freezing:  0
Number of trainable weights after defreezing:  26

查看模型摘要的代码

conv_model.trainable=True
conv_model.summary()

摘要输出

Total params: 14,714,688
Trainable params: 14,714,688
Non-trainable params: 0

问题

为什么model.summary()显示的可训练参数总数,和len(conv_model.trainable_weights)的统计结果差异这么大?冻结时两者都为0,但解冻后一个是26,一个是14714688?

原因解析

说白了就是这俩统计的不是一回事:

  • len(conv_model.trainable_weights)数的是可训练的权重张量的数量。VGG16里每个卷积层、全连接层这类组件,会对应1到2个权重张量(比如卷积层的卷积核是一个张量,偏置又是另一个),解冻后整个模型里一共有26个这样的可训练张量。
  • model.summary()里的Trainable params数的是所有可训练参数的总个数。每个权重张量里装着成百上千个参数(比如VGG16第一个卷积层的卷积核是3×3×3×64的尺寸,光这个张量就有333*64=1728个参数,再加上偏置的64个,这一层就有1792个参数),把所有26个可训练张量里的参数加起来,就是14714688这个总数。

冻结模型时,两者都显示0,是因为此时既没有可训练的权重张量,自然也没有可训练的参数,结果一致;解冻后统计维度不同,结果就出现了差异。


内容的提问来源于stack exchange,提问作者roschach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:10:36