Как преобразовать размеры изображения, которые направлены через model.flow_from_directory? - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь построить классификатор изображений, используя Keras 2.2.0 и tensorflow 1.9.0

Я получаю ошибку такого рода:

str(data_shape))
ValueError: Error when checking input: expected conv2d_1_input to have shape (1, 224, 224) but got array with shape (224, 224, 3)

Вот код:

train_datagen=ImageDataGenerator(rotation_range=40,
            width_shift_range=0.2,
            height_shift_range=0.2,
            rescale=1./255,
            shear_range=0.2,
            zoom_range=0.2,
            horizontal_flip=True,
            fill_mode='nearest')

validation_datagen=ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory('/media/centura/DANISH/mobile backup/moles/train/',class_mode='binary',target_size=(224, 224),batch_size=batch_size)

validation_generator = validation_datagen.flow_from_directory('/media/centura/DANISH/mobile backup/moles/test/',class_mode='binary',target_size=(224, 224),batch_size=batch_size)

#Data Dimensions
img_rows,img_cols=224,224

input_shape1=(1,img_rows,img_cols)

#initialising the model

model=Sequential()

#layer 1
model.add(Conv2D(filters=32, kernel_size=(3,3), strides=(1, 1), padding='same',input_shape=input_shape1,data_format="channels_last"))
model.add(BatchNormalization())
model.add(Activation('relu'))
#model.add(AveragePooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))


#fully connected first layer

model.add(Flatten())
model.add(Dense(500,use_bias=False))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.25))      


#Fully connected final layer
model.add(Dense(1)) 
model.add(Activation('sigmoid')) 

tensorboard=TensorBoard(log_dir='logs/{}'.format(name))


model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
#model.summary()
model.fit_generator(train_generator,epochs=50,validation_data=validation_generator,callbacks=[tensorboard])

Я считаю, что ошибка исходит от train_generator.Я искал в переполнении стека для подобных проблем.Я нашел определенные решения, но это не сработало для меня.Как я могу изменить размеры изображения, если оно вызывается из .flow_from_directory?

1 Ответ

0 голосов
/ 23 ноября 2018

Давайте разберем ошибку шаг за шагом, чтобы выяснить, что она говорит нам:

Ошибка при проверке ввода:

Так что это связано свходные данные и входной слой модели.

ожидается, что conv2d_1_input будет иметь форму (1, 224, 224)

Если мы посмотрим на код для первой сверткиВ слое мы видим, что:

Conv2D(..., input_shape=input_shape1, ...)

И значение input_shape1, как вы определили, это (1,img_rows,img_cols), что составляет (1, 224, 224).Но:

, но получил массив с формой (224, 224, 3)

Это означает, что изображения, сгенерированные train_generator, имеют форму (224, 224, 3) (что является правильным и ожидаемым).

В результате мы видим, что эти две фигуры, форма генерируемых изображений и заданная форма для аргумента input_shape, должны быть одинаковыми.Поэтому вам нужно изменить значение input_shape1 следующим образом:

input_shape1=(img_rows, img_cols, 3)

, что именно то, что слой свертки ожидает в качестве входной формы (т. Е. (image_height, image_width, image_channels)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...