如何在串联的keras模型中设置可训练的参数

原始代码太过冗长,因此我将尝试用一个简化的例子来解释这个问题。


首先,导入我们需要的库:


import tensorflow as tf

from keras.applications.resnet50 import ResNet50

from keras.models import Model

from keras.layers import Dense, Input

然后加载预先训练的模型并打印出摘要。


model = ResNet50(weights='imagenet')

model.summary()

(我剪切了summary()函数的输出以节省一些空间。)现在,所有层参数都是可训练的。为了示例,我将一个可训练参数设置False为如下。


model.get_layer('bn5c_branch2c').trainable = False

目前,除bn5c_branch2c层外,所有其他层仍可训练。


接下来,使用此原始模型创建一个新模型,但让它成为串联模型。


in1 = Input(shape=(224, 224, 3), name="in1")

in2 = Input(shape=(224, 224, 3), name="in2")


out1 = model(in1)

out2 = model(in2)


new_model = Model(inputs=[in1, in2], outputs=[out1, out2])

并再次打印摘要:


new_model.summary()

__________________________________________________________________________________________________

Layer (type)                    Output Shape         Param #     Connected to                     


Total params: 25,636,712

Trainable params: 25,583,592

Non-trainable params: 53,120

__________________________________________________________________________________________________

在这一点上,我已经失去了查看哪些层可训练和不可训练的能力,因为原始ResNet50模型的所有层现在都显示为一个层。如果我运行以下代码,它将给我True:


new_model.get_layer('resnet50').trainable    # Returns True

问题1)我确实在模型中将bn5c_branch2c层的可训练参数设置为False 。我可以假设即使在new_model中,bn5c_branch2c的可训练值仍然为False吗?


问题2)如果上述问题的答案为是(意味着new_model中bn5c_branch2c层的可训练参数值仍然为False)...如果我以后保存了此new_model的体系结构和权重,然后再次加载它们以进行进一步训练这个new_model ...我可以相信bn5c_branch2c的可训练参数值将保持为False吗?


Qyouu
浏览 299回答 1
1回答

蛊毒传说

注意:您可以使用.layers[idx]属性访问模型的图层,其中属性idx是模型中图层的索引(从零开始)。另外,如果您为图层设置了名称,则可以使用.get_layer(layer_name)方法访问它们。A1)是的,您可以通过以下方式确认这一点:print(new_model.layers[2].get_layer('bn5c_branch2c').trainable) # output: False另外,您可以通过查看模型摘要中不可训练参数的数量来确认这一点。A2)是的,您可以通过以下方式确认这一点:# save itnew_model.save('my_new_model.hd5')# load it againnew_model = load_model('my_new_model.hd5')print(new_model.layers[2].get_layer('bn5c_branch2c').trainable) # output: False
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python