首页 > 解决方案 > 从 TensorFlow 2.x 中的特定层中删除层/提取特征

问题描述

我有一个训练有素的 CNN 模型,我在其中应用了一个密集层作为顶层模型来进行预测。但是,现在我想使用倒数第二层来提取特征,但我无法删除最后一层。

我已经尝试过 .pop 但这似乎不再起作用了。

我的模型如下:

input_1 (InputLayer) [(None, 256, 256, 3)] 0
_________________________________________________________________efficientnet-b6 (Functional) (None, 8, 8, 2304) 40960136
_________________________________________________________________ global_average_pooling2d (Gl (None, 2304) 0
_________________________________________________________________ 密集 (Dense) (None , 1) 2305
=============================================== =================== 总参数:40,962,441 可训练参数:0 不可训练参数:40,962,441

我想删除密集的部分。

标签: pythonpython-3.xtensorflowtensorflow2.0

解决方案


您可以采取以下步骤:

  1. 提取模型的层
  2. 获取输入层和所需的新输出层(在您的情况下,您需要的功能)
  3. 重建模型

一个强调它的例子是:

import tensorflow as tf
from tensorflow.keras import layers, models


def simpleMLP(in_size, hidden_sizes, num_classes, dropout_prob=0.5):
    in_x = layers.Input(shape=(in_size,))
    hidden_x = models.Sequential(name="hidden_layers")
    for i, num_h in enumerate(hidden_sizes):
        hidden_x.add(layers.Dense(num_h, input_shape=(in_size,) if i == 0 else []))
        hidden_x.add(layers.Activation('relu'))
        hidden_x.add(layers.Dropout(dropout_prob))
    out_x1 = layers.Dense(num_classes, activation='softmax', name='baseline1')
    out_x2 = layers.Dense(3, activation='softmax', name='baseline2')
    return models.Model(inputs=in_x, outputs=out_x2(out_x1((hidden_x(in_x)))))

baseline_mdl = simpleMLP(28*28, [500, 300], 10)
print(baseline_mdl.summary())

模型:“functional_1” _________________________________________________________________ 层(类型)输出形状参数#
==================================== ============================= input_1 (InputLayer) [(None, 784)] 0
__________________________________________________________________ hidden_​​layers (Sequential) (None, 300 ) 542800
_________________________________________________________________ 基线1(密集)(无,10) 3010
_________________________________________________________________基线2(密集)(无,3)33
==================================================== =============== 总参数:545,843 可训练参数:545,843 不可训练参数:0 _________________________________________________________________

baseline_in = baseline_mdl.layers[0].input
baseline_out = baseline_mdl.layers[-2].output
new_baseline = models.Model(inputs=baseline_in,
                            outputs=baseline_out)
print(new_baseline.summary())

型号:“functional_3” _________________________________________________________________ 层(类型)输出形状参数 #
==================================== ============================= input_1 (InputLayer) [(None, 784)] 0
__________________________________________________________________ hidden_​​layers (Sequential) (None, 300 ) 542800
_________________________________________________________________ 基线1(密集)(无,10)3010
===================================== ============================ 总参数:545,810 可训练参数:545,810 不可训练参数:0


如您所见,我删除了最后一层,仍然可以使用训练后的权重。

请注意,根据您的型号,它可能会略有不同,但这是您应该遵循和调整的一般原则。


推荐阅读