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
相关产品推荐
相关产品推荐

