这是我关于堆栈溢出的第一个问题。我将尽可能多地提供上下文。谢谢你花时间阅读我的问题!
我目前正在使用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])