Вопрос или проблема
Я объединил две разные модели, а именно 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
В данной статье мы разобрали типичные ошибки, возникающие при слиянии моделей глубокого обучения, и предложили решения, которые помогут эффективно продолжить работу. Если у вас возникнут дополнительные вопросы по теме глубокого обучения или другим аспектам машинного обучения, не стесняйтесь обращаться за советом или комментариями.