【问题标题】:Removing layers/extracting features from specific layers in TensorFlow 2.x从 TensorFlow 2.x 中的特定层中删除层/提取特征
【发布时间】:2020-10-06 08:12:25
【问题描述】:

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

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

我的模型如下:

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

我想去除密集的部分。

【问题讨论】:

    标签: python python-3.x tensorflow tensorflow2.0


    【解决方案1】:

    您可以采取以下步骤:

    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) [(无, 784)] 0
    _________________________________________________________________ hidden_​​layers(顺序)(无,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(顺序)(无,300)542800
    _________________________________________________________________ 基线 1(密集)(无,10)3010
    ==================================================== =============== 总参数:545,810 可训练参数:545,810 不可训练参数: 0


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

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

    【讨论】:

    • @Alexandros 当然,很乐意提供帮助!
    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 2018-07-04
    • 2018-08-20
    • 2016-12-21
    • 2014-08-16
    • 2018-09-16
    • 1970-01-01
    • 2019-10-30
    相关资源
    最近更新 更多