原始代码太过冗长,因此我将尝试用一个简化的例子来解释这个问题。
首先,导入我们需要的库:
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吗?
蛊毒传说
相关分类