在keras中加载模型时图形断开连接错误

Graph disconnected error when loading model in keras

我有一个模型可以正常工作并且适合。但是如果我在训练后保存模型,当我尝试加载它时,它会抛出这个错误:

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

这是模型的创建及其无错误的训练

# These models are loaded previously
model_dict = {
    "InceptionV3": model_InceptionV3,
    "LucaSchifoso": model_LucaSchifoso,
    "MobileNetV2": model_MobileNetV2, 
    "Resnet50": model_Resnet50
}

# Every layer's name must be unique
for model_name in model_dict.keys():
    for layer in model_dict[model_name].layers:
        layer._name += model_name

# Create Model
proc_layer_dict = {}

input_layer = tfk.layers.Input(shape=input_shape, name="input_layer")

layers_dict = {}

for model_name in preprocessing_function_dict:
    proc_layer_dict[model_name] = tfk.layers.Lambda(
        preprocessing_function_dict[model_name], name="lambda_" + model_name
    )(input_layer)
    
    layers_dict[model_name] = []
    layers_dict[model_name].append(proc_layer_dict[model_name])
    for layer in model_dict[model_name].layers:
        layers_dict[model_name].append(layer(layers_dict[model_name][-1]))

maxpool_LucaSchifoso1 = tfkl.MaxPooling2D(
        name='maxpool_LucaSchifoso1',
        pool_size = (3, 3)
    )(layers_dict["LucaSchifoso"][10])

flatten_LucaSchifoso1 = tfkl.Flatten(name='flatten_LucaSchifoso1')(maxpool_LucaSchifoso1)

concatenate_layer = tfkl.Concatenate()([layers_dict["InceptionV3"][2],
                                        layers_dict["MobileNetV2"][2],
                                        flatten_LucaSchifoso1, 
                                        layers_dict["Resnet50"][2]])

dropout_mergione1 = tfkl.Dropout(0.3, name='dropout_mergione1', seed=seed)(concatenate_layer)
dense_mergione1 = tfkl.Dense(units=512, name='dense_mergione1', kernel_initializer=tfk.initializers.GlorotUniform(seed), activation='relu')(dropout_mergione1)
dropout_mergione2 = tfkl.Dropout(0.3, name='dropout_mergione2', seed=seed)(dense_mergione1)
output_mergione = tfkl.Dense(name='output_mergione', units=14, activation='softmax', kernel_initializer=tfk.initializers.GlorotUniform(seed))(dropout_mergione2)

modellone = tfk.Model(inputs=input_layer, outputs=output_mergione, name='model')

modellone.compile(loss=tfk.losses.CategoricalCrossentropy(), optimizer=tfk.optimizers.Adam(), metrics='loss')

# Fit the Model
history = modellone.fit(
        x = train_gen,
        epochs = epochs,
        validation_data = valid_gen,
    ).history

# Save trained model
modellone.save("best")

加载的四个模型在独立的时候保存和加载都正确,所以我认为问题不存在。

这是抛出错误的行:

# Load model
model = tf.keras.models.load_model('best')

这是tfk.utils.plot_model(modellone)的结果

如果代码不足以测试问题,我深表歉意,但我不知道如何在不添加所有代码的情况下使其重现。无论如何,我希望你能帮助我。

问题是由模型内部的输入层产生的,出于某种原因,它们在模型的编译和训练过程中不会产生任何问题,但在加载过程中会产生问题。