首页 > 解决方案 > 给定一个输入并得到两个输出

问题描述

我正在使用 TensorFlow 2.4.0 和 Ubuntu 16.04

鉴于此模型

base_model = tf.keras.applications.EfficientNetB0(weights="imagenet", include_top=False)
base_model.trainable = base_model_trainable
inputs = tf.keras.Input(shape=(IMG_SIZE,IMG_SIZE,3), name="input")
x = tf.keras.applications.efficientnet.preprocess_input(inputs)
# more details - https://www.tensorflow.org/tutorials/images/transfer_learning#important_note_about_batchnormalization_layers

x = base_model(x,
               training=False)  # training=training is needed only if there are layers with different behavior during training versus inference (e.g. Dropout)
x = tf.keras.layers.GlobalAveragePooling2D()(x)
x = tf.keras.layers.Dropout(0.2)(x)
outputs = tf.keras.layers.Dense(len(class_names), name="output")(x)
model = tf.keras.Model(inputs, outputs)

我的目标是输入以获取model.get_layer("efficientnetb0").output, 和model.output

如果我做(a)(它不给model.get_layer("efficientnetb0").output

layer_name="efficientnetb0"

grad_model = tf.keras.models.Model([model.inputs], [model.output])

或(b)(预处理后需要额外的输入)

grad_model = tf.keras.models.Model([model.inputs, model.get_layer(layer_name).input], [model.get_layer(layer_name).output, model.output])

两者都有效

但如果我这样做

grad_model = tf.keras.models.Model([model.inputs], [model.get_layer(layer_name).output, model.output])

它给出了例外:

ValueError: Graph disconnected: cannot obtain value for tensor KerasTensor(type_spec=TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'") at layer "rescaling". The following previous layers were accessed without issue: []

是什么原因,有没有办法让我只传递一个输入并获得两个输出?

标签: tensorflow2.0

解决方案


推荐阅读