首页 文章

删除keras预训练模型的图层

提问于
浏览
1

我想使用vgg16预训练的keras模型 . 我在尝试更改模型时发现了一些奇怪的行为 .

1)我已经添加了一些每个训练模型的 layers . 我的问题是,张量板显示的模型层没有添加到序列模型中 . 这很奇怪,因为我也删除了导入的模型 . 我认为这与层之间的依赖关系有关,所以我想删除这些依赖项 . 我怎样才能做到这一点?

enter image description here

例如,在这张图片中有两层我没有添加,但它们在图表中显示

vgg16_model = keras.applications.vgg16.VGG16()


cnnModel = keras.models.Sequential()

for layer in vgg16_model.layers[0:13]:
    cnnModel.add(layer)

for layer in vgg16_model.layers[14:16]:
    cnnModel.add(layer)

for layer in vgg16_model.layers[17:21]:
    cnnModel.add(layer)

cnnModel.add(keras.layers.Dense(2048, name="compress_1"))
cnnModel.add(keras.layers.Dense(1024, name="compress_2"))
cnnModel.add(keras.layers.Dense(512, name="compress_3"))


for layer in cnnModel.layers[0:4]:
    layer.trainable = False

del vgg16_model

2)使用 cnnModel.pop() 时出现第二个问题 . 事实上我已经添加了所有图层,但是在添加下一个图层之前,我会对我不想要的图层进行弹出,这是我得到的错误 .

Layer block4_conv2 has multiple inbound nodes, hence the notion of "layer output" is ill-defined. Use `get_output_at(node_index)` instead.

这是我正在使用的代码:

for layer in vgg16_model.layers[0:14]:
    cnnModel.add(layer)

cnnModel.pop()

for layer in vgg16_model.layers[14:17]:
    cnnModel.add(layer)

cnnModel.pop()

for layer in vgg16_model.layers[17:21]:
    cnnModel.add(layer)

cnnModel.pop() 工作问题仅在尝试添加下一层时发生 .

谢谢您的帮助 .

1 回答

  • 2

    您可以尝试使用 Model 而不是 Sequential ,例如:

    vgg16_model = keras.applications.vgg16.VGG16()
    
    drop_layers = [13, 16]
    
    input_layer = x = vgg16_model.input
    
    for i, layer in enumerate(vgg16_model.layers[1:], 1):
        if i not in drop_layers:
            x = layer(x)
    
    x = keras.layers.Dense(2048, name="compress_1")(x)
    x = keras.layers.Dense(1024, name="compress_2")(x)
    x = keras.layers.Dense(512, name="compress_3")(x)
    
    cnnModel = keras.models.Model(inputs = input_layer, outputs = x)
    
    for layer in cnnModel.layers[0:4]:
        layer.trainable = False
    
    del vgg16_model
    

相关问题