【问题标题】:How can I expose the layers of a child model from the summary of the parent model in keras?如何从 keras 中父模型的摘要中公开子模型的层?
【发布时间】:2018-09-15 06:48:14
【问题描述】:

现在我有一个名为 model1 的模型:

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_3 (InputLayer)            (None, 101, 101, 1)  0                                            
__________________________________________________________________________________________________
up_sampling2d_2 (UpSampling2D)  (None, 202, 202, 1)  0           input_3[0][0]                    
__________________________________________________________________________________________________
zero_padding2d_36 (ZeroPadding2 (None, 256, 256, 1)  0           up_sampling2d_2[0][0]            
__________________________________________________________________________________________________
conv2d_3 (Conv2D)               (None, 256, 256, 3)  6           zero_padding2d_36[0][0]          
__________________________________________________________________________________________________
u-resnet34 (Model)              (None, 256, 256, 1)  24453178    conv2d_3[0][0]                   
__________________________________________________________________________________________________
input_4 (InputLayer)            (None, 1, 1, 1)      0                                            
__________________________________________________________________________________________________
cropping2d_2 (Cropping2D)       (None, 202, 202, 1)  0           u-resnet34[1][0]                 
__________________________________________________________________________________________________
lambda_3 (Lambda)               (None, 1, 1, 1)      0           input_4[0][0]                    
__________________________________________________________________________________________________
max_pooling2d_2 (MaxPooling2D)  (None, 101, 101, 1)  0           cropping2d_2[0][0]               
__________________________________________________________________________________________________
lambda_4 (Lambda)               (None, 101, 101, 1)  0           lambda_3[0][0]                   
__________________________________________________________________________________________________
concatenate_10 (Concatenate)    (None, 101, 101, 2)  0           max_pooling2d_2[0][0]            
                                                                 lambda_4[0][0]                   
__________________________________________________________________________________________________
conv2d_14 (Conv2D)              (None, 101, 101, 1)  3           concatenate_10[0][0]             
==================================================================================================
Total params: 24,453,187
Trainable params: 24,437,821
Non-trainable params: 15,366
_____________________________________

u-resnet34 层是另一个模型,其中包含更多层。我可以打印它的摘要,我可以冻结我想要的任何图层。 当我冻结 u-resnet34 层并打印摘要时,我可以看到可训练参数相应减少。

但是,即使我在模型 1 中冻结模型的层,模型 1 的可训练参数也不会减少。

如何冻结 u-resnet34 层并使其反映在模型 1 的可训练参数上?


编辑: 下面是我的代码

# https://github.com/qubvel/segmentation_models
from segmentation_models import Unet
from keras.models import Model
from keras.layers import Input, Cropping2D, Conv2D

inputs = Input((256, 256, 3))
resnetmodel = Unet(backbone_name='resnet34', encoder_weights='imagenet', input_shape=(256, 256, 3), activation=None)
outputs = resnetmodel(inputs)
outputs = Cropping2D(cropping=((27, 27), (27, 27)) ) (outputs)
outputs = Conv2D(1, (1, 1), activation='sigmoid') (outputs)

model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='adam', loss='binary_crossentropy')
model.summary()

输出:

Total params: 24,453,180
Trainable params: 24,437,814
Non-trainable params: 15,366

然后:

for layer in resnetmodel.layers:
    layer.trainable = False
resnetmodel.summary()

哪些输出:

Total params: 24,453,178
Trainable params: 0
Non-trainable params: 24,453,178

最后是这样的:

model.summary()

哪个输出这个:

Total params: 48,890,992
Trainable params: 24,437,814
Non-trainable params: 24,453,178

【问题讨论】:

  • 首先你提到当你冻结u-resnet34的层时,它会反映在模型摘要中。然后你提到它没有反映。哪一个是正确的?还是我错过了什么?
  • 有两个总结。一个用于u-resnet34模型,另一个用于model1,里面有u-resnet34。
  • 在这两种情况下可以添加用于冻结图层的代码吗?
  • 第一个和最后一个摘要都属于model,但参数总数不同。怎么样?
  • 我自己也想知道,但我认为您也可以在那里重现问题。

标签: python keras


【解决方案1】:

我们以ResNet50 为例。

from keras.models import Model
from keras.layers import Input, Dense
from keras.applications.resnet50 import ResNet50

res = ResNet50()
res.summary()
#....
#Total params: 25,636,712
#Trainable params: 25,583,592
#Non-trainable params: 53,120

Resn​​et 模型有很多参数需要训练。

让我们把它作为模型的一层。

x = Input((224,224,3))
y = res(x)
y = Dense(10)(y)
model = Model(x, y)
model.summary()
#.....
#Total params: 25,646,722
#Trainable params: 25,593,602
#Non-trainable params: 53,120

冻结 resnet 的层。

for layer in res.layers:
    layer.trainable = False
res.summary()
# ....
#Total params: 25,636,712
#Trainable params: 0
#Non-trainable params: 25,636,712

这也反映在使用 resnet 的模型上。

model.summary()
#.....
#Total params: 25,646,722
#Trainable params: 10,010
#Non-trainable params: 25,636,712

因此,内部模型的冻结层应该反映到外部模型。

编辑

如果在冻结模型之前编译模型,则需要重新编译。

【讨论】:

  • 感谢您的回答。您的代码在这里工作,但我的代码仍然没有。我在问题中发布了我的代码,以便您更好地理解它。
  • 我的代码和你的代码之间的一个重要区别是编译方法。编译模型后,它会停止工作。 model.compile(optimizer='adam', loss='binary_crossentropy')
  • 我明白了,感谢您的代码。您需要再次编译它以更新摘要。我将您的答案标记为正确,但请稍后提及。
猜你喜欢
  • 2020-12-28
  • 2020-08-16
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多