Понимание того, почему в моей модели CNN говорится, что формы несовместимы.fit()

#python #tensorflow #keras #conv-neural-network

Вопрос:

Я постоянно сталкиваюсь со следующей ошибкой, независимо от того, какой набор данных я использую или слои, которые я вставляю:

Ошибка значения: Фигуры (Нет, Нет) и (Нет, 246, 336, 5) несовместимы

Это был всего лишь пример, очевидно, что цифры меняются в каждом сценарии. Я хотел бы понять, как исправить этот код, но я также был бы признателен за любое объяснение того, как избежать этого в будущем, и знаю, как это исправить, если проблема возникнет в другом сценарии.

Мой соответствующий код:

 train_path=data_dir '/train'
test_path=data_dir '/val'
img_shape=(250,340,3)
Preprocessing

from tensorflow.keras.preprocessing.image import ImageDataGenerator
image_gen=ImageDataGenerator(rescale=1/255,
                            rotation_range=360,
                            width_shift_range=0.2,
                            height_shift_range=0.2,
                            shear_range=0.2,
                            zoom_range=0.5,
                            horizontal_flip=True,
                            vertical_flip=True,
                            fill_mode='nearest')
image_gen.flow_from_directory(train_path)
Found 3452 images belonging to 5 classes.
<tensorflow.python.keras.preprocessing.image.DirectoryIterator at 0x7f82838f8970>
Model

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Conv2D, MaxPool2D, Flatten
batch_size=32
model=Sequential()

model.add(Conv2D(filters=32, kernel_size=(3,3), input_shape=img_shape, activation='relu'))
model.add(Conv2D(filters=32, kernel_size=(3,3), input_shape=img_shape, activation='relu'))

model.add(Dense(5, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
Model: "sequential_7"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_5 (Conv2D)            (None, 248, 338, 32)      896       
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 124, 169, 32)      0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 122, 167, 32)      9248      
_________________________________________________________________
dense (Dense)                (None, 122, 167, 5)       165       
=================================================================
Total params: 10,309
Trainable params: 10,309
Non-trainable params: 0
_________________________________________________________________
train_image_gen=image_gen.flow_from_directory(train_path,
                                             target_size=img_shape[:2],
                                             color_mode='rgb',
                                             batch_size=batch_size,
                                             class_mode='categorical')
Found 3452 images belonging to 5 classes.
test_image_gen=image_gen.flow_from_directory(test_path,
                                            target_size=img_shape[:2],
                                            color_mode='rgb',
                                            batch_size=batch_size,
                                            class_mode='categorical',
                                            shuffle=False)
Found 865 images belonging to 5 classes.
test_image_gen.class_indices
{'daisy': 0, 'dandelion': 1, 'rose': 2, 'sunflower': 3, 'tulip': 4}
results=model.fit(train_image_gen,
                           epochs=5,
                           validation_data=test_image_gen)
 

Когда я запускаю model.fit(), именно тогда я сталкиваюсь с ошибкой, как показано выше.
Заранее спасибо!

Комментарии:

1. Ваша сеть состоит из двух сверточных слоев, за которыми следует плотный слой; однако вам необходимо flatten вывести свой сверточный слой, прежде чем вы сможете использовать плотный слой. Видишь keras.io/api/layers/reshaping_layers/flatten