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

Posted

技术标签:

【中文标题】在 keras 中加载模型时图形断开错误【英文标题】:Graph disconnected error when loading model in keras 【发布时间】:2022-01-03 18:38:59 【问题描述】:

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

ValueError: Graph disconnected: cannot get value for tensor KerasTensor(type_spec=TensorSpec(shape=(None, 256, 256, 3), dtype=tf.float32, name='InputLucaSchifoso'), name='InputLucaSchifoso', description="created by layer 'InputLucaSchifoso'") 在层“conv2d_5LucaSchifoso”。访问以下先前层没有问题:[]

这是模型的创建及其在没有错误的情况下进行的训练

# 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")

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

这是引发错误的行:

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于在 keras 中加载模型时图形断开错误的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试在 Android NDK 中加载冻结模型时,为啥没有注册操作?

在 Keras 中加载数据集时如何修复错误?

Tensorflow 的 K-Means - 图形断开错误

尝试在 Keras 中加载顺序模型时出现“KeyError:0”

无法在 Keras 2.1.0(使用 Tensorflow 1.3.0)中保存的 Keras 2.4.3(使用 Tensorflow 2.3.0)中加载 Keras 模型

CAD从二制流数据中加载图形(com接口)