Ошибка после объединения двух моделей глубокого обучения VGG16 и ResNet50

Вопрос или проблема

Я объединил две разные модели, а именно VGG16 и ResNet50, и использовал выходы этих двух моделей в качестве входных данных для другой модели. Я проверил график слоев и все верно. Перед объединением код работал безупречно и выдавал правильные результаты. Я получаю ошибку:

"ValueError: Shapes (None, None) and (None, 7, 7, 3) are incompatible" на строке 6 

ValueError                                  
Traceback (most recent call last)  
<ipython-input-36-620554d0106f> in <module>()  

4     epochs = 200,  

5     validation_data = validation_generator,  

----> 6     validation_steps=2 

мой код:

inputs_2 = keras.Input(shape=(224, 224, 3), name="img")
vgg = VGG16(input_tensor=inputs_2, weights="imagenet", include_top=False) 
for layer in vgg.layers:
    layer.trainable = False

resnet = ResNet50(input_tensor=inputs_2, weights="imagenet", include_top=False)       
for layer in resnet.layers:
    layer.trainable = False

mergedOutput = Concatenate()([vgg.output, resnet.output])
x = layers.Dense(256, activation="relu")(mergedOutput)
prediction = Dense(3, activation='softmax')(x)
model = Model(inputs=vgg.input, outputs=prediction)


model.compile(loss="categorical_crossentropy",optimizer="adam",metrics=['accuracy'])

keras.utils.plot_model(model, "mini_resnet.png", show_shapes=True)  
train_datagen = image.ImageDataGenerator(
rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True,
)

test_dataset = image.ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
TRAIN_PATH,
color_mode = "rgb",
target_size = (224,224),
batch_size = 32,
class_mode="categorical"
)
print(train_generator.class_indices)

validation_generator = test_dataset.flow_from_directory(
VAL_PATH,
color_mode = "rgb",
target_size = (224,224),
batch_size = 32,
class_mode="categorical")

history = model.fit_generator(
train_generator,
steps_per_epoch=8,
epochs = 200,
validation_data = validation_generator,
validation_steps=2
)

2D карта признаков расширяется до выходного слоя и, следовательно, вызывает ошибки на слое Softmax.

Добавьте Flatten или GlobalAveragePool после Concatenate.

mergedOutput = keras.layers.Concatenate()([vgg.output, resnet.output])

mergedOutput = keras.layers.GlobalAveragePooling2D()(mergedOutput)  # Эта строчка

x = keras.layers.Dense(256, activation="relu")(mergedOutput)

Ответ или решение

При слиянии двух глубоких обучающих моделей, таких как VGG16 и ResNet50, важным моментом является правильное управление формой выходных данных каждой модели. Ошибка, которую вы получаете: ValueError: Shapes (None, None) and (None, 7, 7, 3) are incompatible, указывает на проблему с несовпадением форм выходов при подготовке данных для последующего обучения модели.

1. Анализ проблемы

Когда вы объединяете выходы моделей VGG16 и ResNet50 с помощью слоя Concatenate, на выходе получается ненумерованный многомерный массив (тензор) с формой, которая включает в себя ширину и высоту: (None, None, None). Это происходит из-за того, что выходы обеих моделей сохраняют свои формы изображения, что приводит к несовпадению их форм (например, один может возвращать (None, 7, 7, 512), а другой — (None, 7, 7, 2048)).

2. Решение проблемы

Чтобы корректно интегрировать объединенные выходы, необходимо преобразовать их в одномерный вектор перед подачей в полносвязный слой. Один из распространенных способов — использовать слои глобального усреднения или пластификации. Это позволит нам уменьшить многомерные тензоры до одномерного, что является необходимым для работы с полносвязными слоями.

3. Рекомендованное исправление

Добавьте слой GlobalAveragePooling2D после Concatenate, чтобы превратить выходные данные обеих моделей в более удобные для обработки формы. Вот как это можно сделать:

mergedOutput = keras.layers.Concatenate()([vgg.output, resnet.output])
mergedOutput = keras.layers.GlobalAveragePooling2D()(mergedOutput)  # Преобразование в одномерный вектор

x = keras.layers.Dense(256, activation="relu")(mergedOutput)
prediction = Dense(3, activation='softmax')(x)
model = Model(inputs=vgg.input, outputs=prediction)

4. Заключение

Данное исправление должно устранить ошибку, с которой вы столкнулись, и позволить вашей модели успешно обучаться на объединенных выходах VGG16 и ResNet50. Убедитесь, что вы также протестировали модель с использованием как обучающего, так и валидационного наборов данных, чтобы удостовериться, что выходы корректны и что модель действительно обучается согласно ожиданиям.

Оптимизация SEO

В данной статье мы разобрали типичные ошибки, возникающие при слиянии моделей глубокого обучения, и предложили решения, которые помогут эффективно продолжить работу. Если у вас возникнут дополнительные вопросы по теме глубокого обучения или другим аспектам машинного обучения, не стесняйтесь обращаться за советом или комментариями.

Оцените материал
Добавить комментарий

Капча загружается...