【问题标题】:ValueError: Error when checking input: expected conv2d_1_input to have shape (28, 28, 1) but got array with shape (28, 28, 3)ValueError:检查输入时出错:预期 conv2d_1_input 的形状为 (28, 28, 1) 但得到的数组的形状为 (28, 28, 3)
【发布时间】:2018-05-23 08:42:48
【问题描述】:

使用 Tensorflow,我构建了一个二元分类模型:

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import backend as K
import tensorflow
import glob
from PIL import Image
import numpy as np

img_width, img_height = 28, 28#all MNIST images are of size (28*28)

train_data_dir = '/Binary Classifier/data/train'#train directory generated by train_cla
validation_data_dir = '/Binary Classifier/data/val'#validation directory generated by val_cla
train_samples = 40000
validation_samples = 10000
epochs = 2
batch_size = 512

if K.image_data_format() == 'channels_first':
    input_shape = (1, img_width, img_height)
else:
    input_shape = (img_width, img_height, 1)

#build a sequential model to train data
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

train_datagen = ImageDataGenerator(#train data generator
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

val_datagen = ImageDataGenerator(rescale=1. / 255)#validation data generator

train_generator = train_datagen.flow_from_directory(#train generator
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = val_datagen.flow_from_directory(#validation generator
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

model.fit_generator(#fit the generator to train and validate the model
    train_generator,
    steps_per_epoch=train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=validation_samples // batch_size)

但我收到一条错误消息:“ValueError:检查输入时出错:预期 conv2d_1_input 的形状为 (28,28,1) 但数组的形状为 (28,28,3)”,我不明白在哪里这个错误来自。我专门将输入形状定义为 (28,28,1) 或 (28,28,1),并且我所有的输入数据都是 MNIST 数字,其大小也应为 (28,28,1)。生成器如何接收 (28,28,3) 数组?任何帮助表示赞赏!

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    ImageDataGenerator 的flow_from_directory 中默认是加载RGB 格式的彩色图像,这意味着三个通道。您想将图像加载为灰度(一个通道),您可以通过将flow_from_directory 中的color_mode 参数设置为grayscale 来实现。

    train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary', color_mode = 'grayscale')
    
    validation_generator = val_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary', color_mode = 'grayscale')
    

    【讨论】:

      猜你喜欢
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 2019-09-25
      相关资源
      最近更新 更多