Tensorflow 如何冻结一个模型的子模型,而不影响其他模型?

Tensorflow 如何冻结一个模型的子模型,而不影响其他模型?,tensorflow,keras,Tensorflow,Keras,我想做一个像甘这样的模特。但我不知道如何正确地将一个模型的trainable设置为False。似乎所有使用子模型的模型都会受到影响 代码: 输出: Model: "model_10" _________________________________________________________________ Layer (type) Output Shape Param # ==========================

我想做一个像甘这样的模特。但我不知道如何正确地将一个模型的trainable设置为False。似乎所有使用子模型的模型都会受到影响

代码:

输出:

Model: "model_10"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_11 (InputLayer)        [(None, 3)]               0         
_________________________________________________________________
model_9 (Model)              (None, 5)                 20        
_________________________________________________________________
dense_10 (Dense)             (None, 7)                 42        
=================================================================
Total params: 62
Trainable params: 62
Non-trainable params: 0
_________________________________________________________________
Model: "model_11"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_12 (InputLayer)        [(None, 11)]              0         
_________________________________________________________________
dense_11 (Dense)             (None, 3)                 36        
_________________________________________________________________
model_9 (Model)              (None, 5)                 20        
=================================================================
Total params: 56
Trainable params: 36
Non-trainable params: 20
_________________________________________________________________
Model: "model_10"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_11 (InputLayer)        [(None, 3)]               0         
_________________________________________________________________
model_9 (Model)              (None, 5)                 20        
_________________________________________________________________
dense_10 (Dense)             (None, 7)                 42        
=================================================================
Total params: 62
Trainable params: 42
Non-trainable params: 20
_________________________________________________________________
首先,模型A没有不可训练的重量。但是在建立了模型B之后,模型A有一些不可训练的权重


此外,摘要没有显示哪些层是不可训练的,只是显示了总的不可训练参数计数。有没有更好的方法来检查模型中冻结了哪些层?

您可以使用此功能来显示哪些层是可训练的或不可训练的

def打印参数(型号):
def计数参数(重量):
“”“计算组成权重的标量总数。
#论据
权重:包含要计算参数的权重的iterable
#返回
构成权重的标量总数
"""
重量=设置()
总数=0
对于重量中的w:
如果id(w)不在重量\u id中:
重量_id.添加(id(w))
总计+=int(K.count_参数(w))
返回总数
可培训数量=数量参数(模型可培训重量)
非可训练计数=计数参数(模型非可训练重量)
打印('id\t可打印:图层名称')
打印(“---------------------------------------”)
对于i,枚举中的层(model.layers):
打印(i,'\t',layer.trainable,'\t:',layer.name)
打印(“---------------------------------------”)
打印('Total params:{:,}'。格式(可训练计数+不可训练计数))
打印('Trainable params:{:,}'。格式(Trainable_count))
打印('不可训练参数:{:,}'。格式(不可训练计数))
它将像这样输出

id  trainable : layer name
-------------------------------
0    False    : input_1
1    False    : block1_conv1
2    False    : block1_conv2
3    False    : block1_pool
4    False    : block2_conv1
5    False    : block2_conv2
6    False    : block2_pool
7    False    : block3_conv1
8    False    : block3_conv2
9    False    : block3_conv3
10   False    : block3_pool
11   False    : block4_conv1
12   False    : block4_conv2
13   False    : block4_conv3
14   False    : block4_pool
15   False    : block5_conv1
16   False    : block5_conv2
17   False    : block5_conv3
18   False    : block5_pool
19   True     : global_average_pooling2d
20   True     : dense
21   True     : dense_1
22   True     : dense_2
-------------------------------
Total params: 15,245,130
Trainable params: 530,442
Non-trainable params: 14,714,688

您的代码将打印
层。可培训的
。根据、、和,在
模型编译后更改可培训内容无效。然而,我上面的代码与这个假设相矛盾,这就是我提出这个问题的原因。
id  trainable : layer name
-------------------------------
0    False    : input_1
1    False    : block1_conv1
2    False    : block1_conv2
3    False    : block1_pool
4    False    : block2_conv1
5    False    : block2_conv2
6    False    : block2_pool
7    False    : block3_conv1
8    False    : block3_conv2
9    False    : block3_conv3
10   False    : block3_pool
11   False    : block4_conv1
12   False    : block4_conv2
13   False    : block4_conv3
14   False    : block4_pool
15   False    : block5_conv1
16   False    : block5_conv2
17   False    : block5_conv3
18   False    : block5_pool
19   True     : global_average_pooling2d
20   True     : dense
21   True     : dense_1
22   True     : dense_2
-------------------------------
Total params: 15,245,130
Trainable params: 530,442
Non-trainable params: 14,714,688