Keras: ошибка при проверке ввода модели cnn - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь создать модель CNN для классификации изображений, однако у меня появляется ошибка с формой ввода, и я не понимаю, почему. Пожалуйста, посмотрите ниже код:

import pandas as pd
from keras_preprocessing.image import ImageDataGenerator
import numpy as np

#CREATING 3 DATAFRAMES FROM 3 .TXT FILES
trainingfile = pd.read_table('data/training.txt', delim_whitespace=True, names=('class', 'image'))
testingfile = pd.read_table('data/testing.txt', delim_whitespace=True, names=('class', 'image'))
validationfile = pd.read_table('data/validation.txt', delim_whitespace=True, names=('class', 'image'))
# CHANGING TYPE OF TARGET ATTRIBUTE
trainingfile = trainingfile.replace([0, 1, 2], ['class0', 'class1', 'class2'])
testingfile = testingfile.replace([0, 1, 2], ['class0', 'class1', 'class2'])
validationfile = validationfile.replace([0, 1, 2], ['class0', 'class1', 'class2'])

#DATA AUGMENTATION
datagen=ImageDataGenerator()
train_datagen = ImageDataGenerator( 
    rotation_range=5,
    zoom_range=0.1)

#Generating train, test and validation datasets with RGB, Batch = 32.
train=train_datagen.flow_from_dataframe(dataframe=trainingfile, directory="data/", x_col="image", y_col="class", class_mode="categorical", target_size=(256,256),color_mode='rgb',batch_size=32)
test=datagen.flow_from_dataframe(dataframe=testingfile, directory="data/", x_col="image", y_col="class", class_mode="categorical", target_size=(256,256),color_mode='rgb',batch_size=32)
#No data augmentation to the validation set
validation=datagen.flow_from_dataframe(dataframe=validationfile, directory="data/", x_col="image", y_col="class", class_mode="categorical", target_size=(256,256),color_mode='rgb', batch_size=32)

И вот, когда я начинаю проектировать модель CNN:

from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten, Activation, Dropout, MaxPooling2D, BatchNormalization
from keras.constraints import maxnorm

#CNN model
model = Sequential()
model.add(Conv2D(32, kernel_size = (3, 3), activation='relu', input_shape=(32, 250, 250, 3)))

Как вы можете видеть, input_shape равно 32 (пакет), 250 x Размер изображения 250 и 3 канала из-за RGB. Однако я получаю следующую ошибку:

ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=5

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Проблема в input_shape слоя Conv2D, вам не нужно устанавливать размер пакета. Измените input_shape=(32, 250, 250, 3) на input_shape=(250, 250, 3).

1 голос
/ 29 мая 2020

input_shape в сверточном слое не должно включать размер партии. Вот отрывок из документации Keras :

При использовании [Conv2D] в качестве первого уровня в модели укажите аргумент ключевого слова input_shape (кортеж целых чисел, не включая ось образца), например, input_shape=(128, 128, 3) для изображений 128x128 RGB в data_format="channels_last".

Таким образом, решением было бы изменить определение вашей модели, как показано ниже. У вас была другая ошибка в input_shape - это должно быть 256x256x3, а не 250x250x3.

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(256, 256, 3)))

Вам не нужно явно указывать размер партии в определении модели, потому что он может варьироваться.

...