在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)
的结果
如果代码不足以测试问题,我深表歉意,但我不知道如何在不添加所有代码的情况下使其重现。无论如何,我希望你能帮助我。
问题是由模型内部的输入层产生的,出于某种原因,它们在模型的编译和训练过程中不会产生任何问题,但在加载过程中会产生问题。
我有一个模型可以正常工作并且适合。但是如果我在训练后保存模型,当我尝试加载它时,它会抛出这个错误:
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)
的结果
如果代码不足以测试问题,我深表歉意,但我不知道如何在不添加所有代码的情况下使其重现。无论如何,我希望你能帮助我。
问题是由模型内部的输入层产生的,出于某种原因,它们在模型的编译和训练过程中不会产生任何问题,但在加载过程中会产生问题。