顺序 VGG16 模型,图形断开错误

Sequential VGG16 model, graph disconnected error

我有一个顶部带有 VGG16 的顺序模型。:

def rescale(x):
    return x/65535.

base_model = tf.keras.applications.VGG16(
            include_top=True, weights=None, input_tensor=None, input_shape=(224,224,1),
            pooling=None, classes=102, classifier_activation='softmax')

model = tf.keras.Sequential([
        tf.keras.Input(shape=(None, None, 1)),
        tf.keras.layers.Lambda(rescale),
        tf.keras.layers.experimental.preprocessing.Resizing(224, 224),
        tf.keras.layers.experimental.preprocessing.RandomFlip(mode='horizontal_and_vertical', seed=42),
        base_model
    ])

输出model.summary()

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lambda (Lambda)              (None, None, None, 1)     0         
_________________________________________________________________
resizing (Resizing)          (None, 224, 224, 1)       0         
_________________________________________________________________
random_flip (RandomFlip)     (None, 224, 224, 1)       0         
_________________________________________________________________
vgg16 (Functional)           (None, 102)               134677286 
=================================================================
Total params: 134,677,286
Trainable params: 134,677,286
Non-trainable params: 0

现在我想创建一个有两个输出的新模型:

vgg_model = model.layers[3]
last_conv_layer = vgg_model.get_layer('block5_conv3')
new_model = tf.keras.models.Model(inputs=[model.inputs], outputs=[last_conv_layer.output, model.output])

但是我得到这个错误:

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_1_6:0", shape=(None, 224, 224, 1), dtype=float32) at layer "block1_conv1". The following previous layers were accessed without issue: []

我在这里错过了什么?

给定一个这种形式的拟合模型:

def rescale(x):
    return x/65535.

base_model = tf.keras.applications.VGG16(
            include_top=True, weights=None, input_tensor=None, input_shape=(224,224,1),
            pooling=None, classes=102, classifier_activation='softmax')

model = tf.keras.Sequential([
        tf.keras.Input(shape=(None, None, 1)),
        tf.keras.layers.Lambda(rescale),
        tf.keras.layers.experimental.preprocessing.Resizing(224, 224),
        tf.keras.layers.experimental.preprocessing.RandomFlip(mode='horizontal_and_vertical', seed=42),
        base_model
    ])

### model.fit(...)

您可以将 vgg 包装在一个模型中,该模型 returns 您需要的所有输出

new_model = Model(inputs=model.layers[3].input, 
                  outputs=[model.layers[3].output, 
                           model.layers[3].get_layer('block5_conv3').output])

inp = tf.keras.Input(shape=(None, None, 1))
x = tf.keras.layers.Lambda(rescale)(inp)
x = tf.keras.layers.experimental.preprocessing.Resizing(224, 224)(x)
outputs = new_model(x)
new_model = Model(inp, outputs)

new_model的总结:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_49 (InputLayer)        [(None, None, None, 1)]   0         
_________________________________________________________________
lambda_25 (Lambda)           (None, None, None, 1)     0         
_________________________________________________________________
resizing_25 (Resizing)       (None, 224, 224, 1)       0         
_________________________________________________________________
functional_47 (Functional)   [(None, 102), (None, 14,  134677286 
=================================================================
Total params: 134,677,286
Trainable params: 134,677,286
Non-trainable params: 0