【问题标题】:Delete layers of keras pretrained model删除keras预训练模型的层
【发布时间】:2018-04-05 17:36:26
【问题描述】:

我想使用 keras 的 vgg16 预训练模型。尝试更改模型时,我注意到一些奇怪的行为。

1) 我添加了一些经过训练的模型的layers。我的问题是张量板显示了我没有添加到序列模型中的模型层。这很奇怪,因为我还删除了导入的模型。我认为这与层之间的依赖关系有关,所以我想删除这种依赖关系。我该怎么做?

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

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() 正在工作 该问题仅在尝试添加下一层时出现。

感谢您的帮助。

【问题讨论】:

  • 你解决了吗?我面临同样的情况
  • 我也有同样的问题。但有趣的是,当我绘制模型时,尽管 TensorBoard 仍然显示丢弃的层,但它们并没有出现。使用from tensorflow.keras.utils import plot_modelplot_model(model, to_file = 'model_plot.png', show_shapes = True, show_layer_names = True) 绘制模型并查看。我唯一担心的是,我不希望不必要的层增加计算成本。

标签: python tensorflow keras


【解决方案1】:

您可以尝试使用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

【讨论】:

  • 它没有用。我仍然有我认为del vgg16_model 不起作用的并行层。
  • 如果你这样做cnnModel.summary(),你会看到什么?
  • 我看到了正确的图层。它无法显示并行层,因为它们与 vgg16_model 相关。我还在循环中尝试了 del layer 我应该删除的两层,但这不起作用
  • 谢谢 .. 模型而不是 Sequential 可以解决 Layer block4_conv2 有多个入站节点,因此“层输出”的概念是不明确的。请改用get_output_at(node_index)
  • 如果其中一层需要多个输入,这是否可行?
猜你喜欢
  • 2018-12-11
  • 2017-07-07
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2018-12-21
  • 1970-01-01
相关资源
最近更新 更多