KeyError: '调用Functional.call()时遇到异常

问题描述 投票:0回答:1

我正在尝试构建一个接受两个输入的模型。在这个模型中,我设计了三个块:两个对应于 EfficientNetB0 的第一个块到块 4 (A) 的结构,而第三个块 (B) 反映了 EfficientNetB0 最终块 5、6 和 7 的架构我创建了函数“build_model()”来创建此模型,并且在调用该函数并执行时一切似乎都正常运行

model.summary()
。然而,在应用
model.fit()
函数时,我遇到了以下错误: 有人遇到过这个错误吗?

---------------------------------------------------------------------------
StagingError                              Traceback (most recent call last)
Cell In[50], line 24
     21 with strategy.scope(): 
     22     model = build_model()
---> 24 model.fit(train_gen, verbose=1, validation_data = valid_gen, epochs=10, callbacks = [LR2])
     25 model.save_weights(f'EffNet_v{VER}_f{i}.weights.h5')
     26 oof = model.predict(valid_gen, verbose=1)

File /opt/conda/lib/python3.10/site-packages/keras/src/utils/traceback_utils.py:123, in filter_traceback.<locals>.error_handler(*args, **kwargs)
    120     filtered_tb = _process_traceback_frames(e.__traceback__)
    121     # To get the full stack trace, call:
    122     # `keras.config.disable_traceback_filtering()`
--> 123     raise e.with_traceback(filtered_tb) from None
    124 finally:
    125     del filtered_tb

File /opt/conda/lib/python3.10/site-packages/tensorflow/python/eager/polymorphic_function/autograph_util.py:52, in py_func_from_autograph.<locals>.autograph_handler(*args, **kwargs)
     50 except Exception as e:  # pylint:disable=broad-except
     51   if hasattr(e, "ag_error_metadata"):
---> 52     raise e.ag_error_metadata.to_exception(e)
     53   else:
     54     raise

StagingError: in user code:

    File "/opt/conda/lib/python3.10/site-packages/keras/src/backend/tensorflow/trainer.py", line 105, in one_step_on_data  **
        return self.train_step(data)
    File "/opt/conda/lib/python3.10/site-packages/keras/src/backend/tensorflow/trainer.py", line 56, in train_step
        y_pred = self(x, training=True)
    File "/opt/conda/lib/python3.10/site-packages/keras/src/utils/traceback_utils.py", line 123, in error_handler
        raise e.with_traceback(filtered_tb) from None
    File "/opt/conda/lib/python3.10/site-packages/keras/src/ops/function.py", line 161, in _run_through_graph
        output_tensors.append(tensor_dict[id(x)])

    KeyError: 'Exception encountered when calling Functional.call().\n\n\x1b[1m137598607979904\x1b[0m\n\nArguments received by Functional.call():\n  • inputs=tf.Tensor(shape=(None, 256, 512, 3), dtype=float32)\n  • training=True\n  • mask=None' 

构建模型的函数:

from tensorflow.keras.applications import EfficientNetB0
from tensorflow.keras.layers import Concatenate, GlobalAveragePooling2D, Dense
from tensorflow.keras import Model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import KLDivergence
from tensorflow.keras.layers import Lambda, Concatenate
from tensorflow.keras.layers import Layer


# Define the names of the layers corresponding to blocks A and B
block_a_layers = ['block1a_dwconv', 'block1a_bn', 'block1a_activation', 'block1a_se_squeeze', 'block1a_se_reshape', 'block1a_se_reduce', 'block1a_se_expand', 'block1a_se_excite', 'block1a_project_conv', 'block1a_project_bn', 
                  'block2a_expand_conv', 'block2a_expand_bn', 'block2a_expand_activation', 'block2a_dwconv_pad', 'block2a_dwconv', 'block2a_bn', 'block2a_activation', 'block2a_se_squeeze', 'block2a_se_reshape', 'block2a_se_reduce', 'block2a_se_expand', 'block2a_se_excite', 'block2a_project_conv', 'block2a_project_bn', 'block2b_expand_conv', 'block2b_expand_bn', 'block2b_expand_activation', 'block2b_dwconv', 'block2b_bn', 'block2b_activation', 'block2b_se_squeeze', 'block2b_se_reshape', 'block2b_se_reduce', 'block2b_se_expand', 'block2b_se_excite', 'block2b_project_conv', 'block2b_project_bn', 'block2b_drop', 'block2b_add', 
                  'block3a_expand_conv', 'block3a_expand_bn', 'block3a_expand_activation', 'block3a_dwconv_pad', 'block3a_dwconv', 'block3a_bn', 'block3a_activation', 'block3a_se_squeeze', 'block3a_se_reshape', 'block3a_se_reduce', 'block3a_se_expand', 'block3a_se_excite', 'block3a_project_conv', 'block3a_project_bn', 'block3b_expand_conv', 'block3b_expand_bn', 'block3b_expand_activation', 'block3b_dwconv', 'block3b_bn', 'block3b_activation', 'block3b_se_squeeze', 'block3b_se_reshape', 'block3b_se_reduce', 'block3b_se_expand', 'block3b_se_excite', 'block3b_project_conv', 'block3b_project_bn', 'block3b_drop', 'block3b_add', 
                  'block4a_expand_conv', 'block4a_expand_bn', 'block4a_expand_activation', 'block4a_dwconv_pad', 'block4a_dwconv', 'block4a_bn', 'block4a_activation', 'block4a_se_squeeze', 'block4a_se_reshape', 'block4a_se_reduce', 'block4a_se_expand', 'block4a_se_excite', 'block4a_project_conv', 'block4a_project_bn', 'block4b_expand_conv', 'block4b_expand_bn', 'block4b_expand_activation', 'block4b_dwconv', 'block4b_bn', 'block4b_activation', 'block4b_se_squeeze', 'block4b_se_reshape', 'block4b_se_reduce', 'block4b_se_expand', 'block4b_se_excite', 'block4b_project_conv', 'block4b_project_bn', 'block4b_drop', 'block4b_add', 'block4c_expand_conv', 'block4c_expand_bn', 'block4c_expand_activation', 'block4c_dwconv', 'block4c_bn', 'block4c_activation', 'block4c_se_squeeze', 'block4c_se_reshape', 'block4c_se_reduce', 'block4c_se_expand', 'block4c_se_excite', 'block4c_project_conv', 'block4c_project_bn', 
                  'block4c_drop', 'block4c_add'
]

block_b_layers = [
    'block5a_expand_conv', 'block5a_expand_bn', 'block5a_expand_activation', 'block5a_dwconv', 'block5a_bn', 'block5a_activation', 'block5a_se_squeeze', 'block5a_se_reshape', 'block5a_se_reduce', 'block5a_se_expand', 'block5a_se_excite', 'block5a_project_conv', 'block5a_project_bn', 'block5b_expand_conv', 'block5b_expand_bn', 'block5b_expand_activation', 'block5b_dwconv', 'block5b_bn', 'block5b_activation', 'block5b_se_squeeze', 'block5b_se_reshape', 'block5b_se_reduce', 'block5b_se_expand', 'block5b_se_excite', 'block5b_project_conv', 'block5b_project_bn', 'block5b_drop', 'block5b_add', 'block5c_expand_conv', 'block5c_expand_bn', 'block5c_expand_activation', 'block5c_dwconv', 'block5c_bn', 'block5c_activation', 'block5c_se_squeeze', 'block5c_se_reshape', 'block5c_se_reduce', 'block5c_se_expand', 'block5c_se_excite', 'block5c_project_conv', 'block5c_project_bn', 'block5c_drop', 'block5c_add', 
    'block6a_expand_conv', 'block6a_expand_bn', 'block6a_expand_activation', 'block6a_dwconv_pad', 'block6a_dwconv', 'block6a_bn', 'block6a_activation', 'block6a_se_squeeze', 'block6a_se_reshape', 'block6a_se_reduce', 'block6a_se_expand', 'block6a_se_excite', 'block6a_project_conv', 'block6a_project_bn', 'block6b_expand_conv', 'block6b_expand_bn', 'block6b_expand_activation', 'block6b_dwconv', 'block6b_bn', 'block6b_activation', 'block6b_se_squeeze', 'block6b_se_reshape', 'block6b_se_reduce', 'block6b_se_expand', 'block6b_se_excite', 'block6b_project_conv', 'block6b_project_bn', 'block6b_drop', 'block6b_add', 'block6c_expand_conv', 'block6c_expand_bn', 'block6c_expand_activation', 'block6c_dwconv', 'block6c_bn', 'block6c_activation', 'block6c_se_squeeze', 'block6c_se_reshape', 'block6c_se_reduce', 'block6c_se_expand', 'block6c_se_excite', 'block6c_project_conv', 'block6c_project_bn', 'block6c_drop', 'block6c_add', 'block6d_expand_conv', 'block6d_expand_bn', 'block6d_expand_activation', 'block6d_dwconv', 'block6d_bn', 'block6d_activation', 'block6d_se_squeeze', 'block6d_se_reshape', 'block6d_se_reduce', 'block6d_se_expand', 'block6d_se_excite', 'block6d_project_conv', 'block6d_project_bn', 'block6d_drop', 'block6d_add',
    'block7a_expand_conv', 'block7a_expand_bn', 'block7a_expand_activation', 'block7a_dwconv', 'block7a_bn', 'block7a_activation', 'block7a_se_squeeze', 'block7a_se_reshape', 'block7a_se_reduce', 'block7a_se_expand', 'block7a_se_excite', 'block7a_project_conv', 'block7a_project_bn'
]

def build_model():
    inp1 = tf.keras.Input(shape=(229, 232, 4))
    inp2 = tf.keras.Input(shape=(128, 256, 4))
    
    inp_A1 = tf.keras.Input(shape=(256, 512, 3))
    inp_A2 = tf.keras.Input(shape=(256, 512, 3))
    
    input_B = tf.keras.Input(shape = (None,None,160))
    
    # Load the EfficientNetB0 model pre-trained on ImageNet
    base_model = tf.keras.applications.EfficientNetB0( include_top=False, weights='imagenet', input_shape=None)
    
    # Reshape Input X1 229x232x4 => 458x464x3 Monotone Image => Resize to 256x512x3
    x1 = [inp1[:,:,:,i:i+1] for i in range(2)]
    x1 = tf.keras.layers.Concatenate(axis=1)(x1)
    x2 = [inp1[:,:,:,i+2:i+3] for i in range(2)]
    x2 = tf.keras.layers.Concatenate(axis=1)(x2)
    x_1 = tf.keras.layers.Concatenate(axis=2)([x1,x2])
    x_1 = tf.keras.layers.Concatenate(axis=3)([x_1,x_1,x_1])
    x_1 =  tf.keras.layers.Resizing(height=256, width=512)(x_1)
  
    # Reshape Input X2 128x256x4 => 256x512x3
    x3 = [inp2[:,:,:,i:i+1] for i in range(2)]
    x3 = tf.keras.layers.Concatenate(axis=1)(x3)
    x4 = [inp2[:,:,:,i+2:i+3] for i in range(2)]
    x4 = tf.keras.layers.Concatenate(axis=1)(x4)
    x_2 = tf.keras.layers.Concatenate(axis=2)([x3,x4])
    x_2 = tf.keras.layers.Concatenate(axis=3)([x_2,x_2,x_2])

    # Create the model for block A
    block_a_outputs_1 = [base_model.get_layer(name).output for name in block_a_layers]
    block_a_outputs_2 = [base_model.get_layer(name).output for name in block_a_layers]
    block_a_model_1 = tf.keras.Model(inputs=inp_A1, outputs=block_a_outputs_1)
    block_a_model_2 = tf.keras.Model(inputs=inp_A2, outputs=block_a_outputs_2)
    
    # Create the model for block B
    block_b_outputs = [base_model.get_layer(name1).output for name1 in block_b_layers]
    block_b_model = tf.keras.Model(inputs=input_B, outputs=block_b_outputs)
    
    # Get the outputs from block A for both inputs
    block_a_output_1 = block_a_model_1(x_1)
    block_a_output_2 = block_a_model_2(x_2)

    # Concatenate the outputs from block A
    concatenated_output = tf.keras.layers.Concatenate(axis=-1)([block_a_output_1[-1],block_a_output_2[-1]])

    
    # Get the output from block B using the concatenated features
    block_b_output = block_b_model(concatenated_output)
    #block_b_output = tf.keras.layers.Concatenate(axis=-1)(block_b_output[-1])
    
    # OUTPUT
    x = tf.keras.layers.GlobalAveragePooling2D()(block_b_output[-1])
    x = tf.keras.layers.Dense(6,activation='softmax', dtype='float32')(x)
    
    # COMPILE MODEL
    model = tf.keras.Model(inputs=(inp1, inp2), outputs=x)
    opt = tf.keras.optimizers.Adam(learning_rate = 1e-3)
    loss = tf.keras.losses.KLDivergence()
    model.compile(loss=loss, optimizer = opt) 

        
    return model

训练代码:

from sklearn.model_selection import KFold, GroupKFold
import tensorflow.keras.backend as K, gc
VER = 2
all_oof = []
all_true = []

gkf = GroupKFold(n_splits=5)

for i, (train_index, valid_index) in enumerate(gkf.split(train, train.target, train.patient_id)):
    print('#'*25)
    print(f'### Fold {i+1}')
    
    train_gen = DataGenerator(train.iloc[train_index], shuffle=True, batch_size=32)
    valid_gen = DataGenerator(train.iloc[valid_index], shuffle=False, batch_size=64)
    
    print(f'### train size {len(train_index)}, valid size {len(valid_index)}')
    print('#'*25)
    
    K.clear_session()
    
    with strategy.scope(): 
        model = build_model()
        
    model.fit(train_gen, verbose=1, validation_data = valid_gen, epochs=10, callbacks = [LR2])

一切看起来都很好,除了拟合模型时

python conv-neural-network artificial-intelligence image-classification model-fitting
1个回答
0
投票

尝试安装 TensorFlow==2.10。这对我有用!

© www.soinside.com 2019 - 2024. All rights reserved.