如何将辅助头添加到预训练的keras模型的中间层



这是我关于堆栈溢出的第一个问题。我将尽可能多地提供上下文。谢谢你花时间阅读我的问题!

我目前正在使用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

有人知道什么能在这里做这份工作吗?

此错误表明,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])

相关内容

  • 没有找到相关文章

最新更新