如何将层添加到keras功能对象中(例如InceptionResNetV2)



我正在尝试将层添加到InceptionResNetV2(或任何其他可以通过tf.keras.applications导入的预训练网络(中。我知道我可以将对象添加到序列模型或函数模型中。然而,当我这样做时,我将无法访问层中的单个输出,以便在Grad CAM或类似应用程序中使用它们

我现在正在使用以下模型结构。它有效,可以训练。然而,它不允许我访问关于特定输入和特定输出的InceptionResNetV2的最后一个卷积层的输出。

from tensorflow.keras import layers, models
InceptionResNetV2 = tf.keras.applications.inception_resnet_v2.InceptionResNetV2
def get_base():
conv_base = InceptionResNetV2(weights=None, include_top=False, input_shape=(224, 224, 3))
conv_base.trainable = False
return(conv_base)

def get_model():
base = get_base()
inputs = tf.keras.Input(shape=(224, 224, 3))
x = base(inputs, training=False)
x = layers.Flatten()(x)
x = layers.Dense(512, "relu")(x)
x = layers.Dropout(0.25)(x)
x = layers.Dense(256, "relu")(x)
x = layers.Dropout(0.25)(x)
dims = layers.Dense(2, name="Valence_Arousal")(x)
expression = layers.Dense(2, name="Emotion_Category")(x)

model = models.Model(inputs=[inputs], outputs=[expression, dims])
return(model)
print(get_model().summary())

创建嵌套模型后,很难扩展它们。将input_tensor参数传递给预训练的模型会得到预期的结果。

def get_model():
inputs = tf.keras.Input(shape=(224, 224, 3))

conv_base = InceptionResNetV2(weights=None, include_top=False, input_tensor = inputs)
conv_base.trainable = False

x = layers.Flatten()(conv_base.output)
x = layers.Dense(512, "relu")(x)
x = layers.Dropout(0.25)(x)
x = layers.Dense(256, "relu")(x)
x = layers.Dropout(0.25)(x)

dims = layers.Dense(2, name="Valence_Arousal")(x)
expression = layers.Dense(2, name="Emotion_Category")(x)

model = models.Model(inputs=[inputs], outputs=[expression, dims])
return(model)

型号摘要:

input_1 (InputLayer)           [(None, 224, 224, 3  0           []                               
)]                                                                
                            
conv2d (Conv2D)                (None, 111, 111, 32  864         ['input_1[0][0]']                
)  
...

相关内容

最新更新