【问题标题】:How to add an auxiliary head to an intermediary layer of a pretrained keras model?如何在预训练的 keras 模型的中间层添加辅助头?
【发布时间】:2021-06-26 20:50:27
【问题描述】:

这是我关于堆栈溢出的第一个问题。我将尝试提供尽可能多的背景信息。感谢您花时间阅读我的问题!

我目前正在使用efficentnet 来解决分类问题。我想在中间层上添加一个辅助头。辅助头是指另一组层,它们将产生第二个输出(2 个最终输出)。

目前我设法使用以下代码在模型末尾添加了一个额外的头部:

inputs = tf.keras.Input(shape=(img_size, img_size, 3), name='input')
    
x =  efn.EfficientNetB7(input_shape=(img_size, img_size, 3), include_top=False)(inputs)

classification_head = tf.keras.layers.GlobalAveragePooling2D()(x)
classification_head = tf.keras.layers.Dense(4, activation='softmax', name = 'classification')(classification_head)
    

aux_head = tf.keras.layers.Conv2D(128, kernel_size = 3, padding='same')(x)
aux_head = tf.keras.layers.BatchNormalization()(aux_head)
aux_head = tf.keras.layers.ReLU()(aux_head)
aux_head = tf.keras.layers.Conv2D(1, kernel_size=1, padding= 'valid', name = 'aux_head')(aux_head)
    
model = tf.keras.Model(inputs, [classification_head,aux_head])

我想做一个类似的过程,但是通过将aux_head直接添加到中间层(这里它被命名为block5a_expand_conv),我尝试过的是:

inputs = tf.keras.Input(shape=(img_size, img_size, 3), name='input')
    
x = efn.EfficientNetB7(input_shape=(img_size, img_size, 3), include_top=False)(inputs)

classification_head = tf.keras.layers.GlobalAveragePooling2D()(x)
classification_head = tf.keras.layers.Dense(4, activation='softmax', name = 'classification')(classification_head)
    
intermediary_layer = x(
                input_shape=(img_sisze, img_sisze, 3),
                include_top=False).get_layer(name = 'block5a_expand_conv')

aux_head = tf.keras.layers.Conv2D(128, kernel_size = 3, padding='same')(intermediary_layer.output)
aux_head = tf.keras.layers.BatchNormalization()(aux_head)
aux_head = tf.keras.layers.ReLU()(aux_head)
aux_head = tf.keras.layers.Conv2D(1, kernel_size=1, padding= 'valid', name = 'aux_head')(aux_head)
    
model = tf.keras.Model(inputs, [classification_head,aux_head])

但是这段代码产生了一个错误,名为:

Graph disconnected

有没有人知道在这里可以做什么工作?

【问题讨论】:

    标签: keras layer efficientnet


    【解决方案1】:

    此错误表明,tensorflow 无法在定义为输入和输出的层之间创建图形(模型)。在您的模型中的某处,通过层的路径断开连接。因此,请检查输入和输出层之间的路径。

    在您的情况下,您已将一个输入层定义为inputs。您通过efficientnet 提供此输入,然后一些您自己定义的层将输出作为classification_head。我们仍然没有问题。作为下一条路径,您希望获得一个名为 block5a_expand_conv 的隐藏层输出,并将其馈送到其他一些层,并获得另一个输出为 aux_head

    那么,问题是,这条路径的输入在哪里?它找不到输入,因为您将中间层定义为层,而不是层的输出,并且它无法通过中间层连接到输入,因为您没有正确定义它。这是图表断开连接的地方。

    这里是修改后的代码:

    en_model = efn.EfficientNetB7(input_shape=(img_size, img_size, 3), include_top=False)
     
    classification_head = tf.keras.layers.GlobalAveragePooling2D()(en_model.output)
    classification_head = tf.keras.layers.Dense(4, activation='softmax', name = 'classification')(classification_head)
     
    intermediary_layer = en_model.get_layer('block5a_expand_conv').output
     
    aux_head = tf.keras.layers.Conv2D(128, kernel_size = 3, padding='same')(intermediary_layer)
    aux_head = tf.keras.layers.BatchNormalization()(aux_head)
    aux_head = tf.keras.layers.ReLU()(aux_head)
    aux_head = tf.keras.layers.Conv2D(1, kernel_size=1, padding= 'valid', name = 'aux_head')(aux_head)
        
    model = tf.keras.Model(en_model.input, [classification_head,aux_head])
    

    【讨论】:

    • 您好,您的回答非常清楚。非常感谢这解决了我的问题:)
    猜你喜欢
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2022-08-10
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多