在 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 中加载顺序模型时出现“KeyError:0”
无法在 Keras 2.1.0(使用 Tensorflow 1.3.0)中保存的 Keras 2.4.3(使用 Tensorflow 2.3.0)中加载 Keras 模型