关于model.trainable_variables及VGG19微调后其长度为4的疑问
问题背景
我拥有VGG19模型并想要进行微调,执行以下操作:
# fine tuning the vgg19 model # let's take a look to see how many layers are in the base model print("Number of layers in the base model: ", len(vgg_model.layers)) # fine-tune from this layer onwards fine_tune_at = 100 # freeze all the layers before the `fine_tune_at` layer for layer in vgg_model.layers[:fine_tune_at]: layer.trainable = False
输出显示基础模型层数为22。查看模型汇总:
Total params: 20,090,177 Trainable params: 65,793 Non-trainable params: 20,024,384
编译模型:
# compiling the model model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
执行len(model.trainable_variables)得到结果4。我想了解什么是model.trainable_variables,以及为何此处结果为4?
解答
什么是model.trainable_variables
model.trainable_variables是TensorFlow/Keras模型中,所有可被优化器更新的参数对应的变量集合。只要层的trainable属性设为True,该层内的参数就会被纳入这个集合,训练时会通过反向传播计算梯度并调整这些参数的数值。
为什么此处结果为4
结合你的操作和模型结构分析:
- 你设置的
fine_tune_at = 100,但VGG19基础模型仅有22层,因此vgg_model.layers[:100]会将VGG19的所有层都冻结(trainable=False),这部分参数不会出现在trainable_variables中。 - 从模型参数汇总的可训练参数(65793)来看,你应该在VGG19基础上新增了两个全连接层用于二分类任务:
- 第一个Dense层(通常设为128维度):包含权重矩阵和偏置向量两个可训练变量,参数总数为
512×128 + 128 = 65664 - 第二个Dense层(维度1,对应二分类输出):包含权重向量和偏置值两个可训练变量,参数总数为
128×1 + 1 = 129 - 两者参数总和
65664+129=65793,与你给出的可训练参数数完全匹配。
- 第一个Dense层(通常设为128维度):包含权重矩阵和偏置向量两个可训练变量,参数总数为
- 这两个Dense层每层贡献2个可训练变量,加起来共4个,因此
len(model.trainable_variables)的结果为4。
内容的提问来源于stack exchange,提问作者Roseanne
相关产品推荐
相关产品推荐

