KeyError: 'Исключение, возникшее при вызове Functional.call()Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 KeyError: 'Исключение, возникшее при вызове Functional.call()

Сообщение Anonymous »

Я пытаюсь построить модель, которая принимает два входных параметра. В рамках этой модели я разработал три блока: два соответствуют структуре первых блоков 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..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..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])
Кажется, все в порядке, кроме подгонки модели

Подробнее здесь: https://stackoverflow.com/questions/782 ... ional-call
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»