微调预训练模型时,修改base_model为何会影响model2?
问题解答
这本质是Keras中层实例的引用机制在起作用,核心点如下:
- 你通过
base_model = model2.layers[4]获取的不是base_model的副本,而是model2内部那个base_model层的直接引用。也就是说,这个base_model变量和model2里的base_model层是同一个对象,只是名字不同而已。 - 当你对这个
base_model做解冻操作时,比如设置部分层的trainable=True,本质就是在修改model2内部那个base_model层的状态——毕竟它们是同一个东西。 - 后续编译model2的时候,Keras会扫描模型内所有层的
trainable状态,生成对应的参数更新规则。这时候model2里的base_model层已经是部分解冻的状态了,训练时自然会更新这些层的参数,最终带来准确率的提升。
打个通俗的比方:你把一个抽屉(base_model)放进柜子(model2)里,之后你把抽屉从柜子里拉出来(通过model2.layers[4]获取引用),调整了抽屉里的隔板(解冻层),哪怕你没把抽屉推回去,柜子里的那个抽屉已经是调整后的状态了——因为你动的本来就是同一个抽屉。
内容的提问来源于stack exchange,提问作者boulder_ruby
相关产品推荐
相关产品推荐

