繁体   English   中英

ValueError:检查时出错:预期conv2d_1_input具有形状(28,28,1),但数组的形状为(58000,28,28)

[英]ValueError: Error when checking : expected conv2d_1_input to have shape (28, 28, 1) but got array with shape (58000, 28, 28)

我已经成功构建了一个二进制分类器,并且正在使用它来预测一些数据。 所有数据都是大小为(28,28)的MNIST灰度数字,我有58000张图像。 我的代码如下:

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',color_mode = 'grayscale')

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',color_mode = 'grayscale')

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)

filelist = glob.glob('/Binary Classifier/data/image_data/*.png')
x = np.array([np.array(Image.open(fname)) for fname in filelist])
ones=model.predict(x)

我在ones = model.predict(x)处出错:

ValueError:检查错误:预期conv2d_1_input具有4个维,但数组的形状为(58000,28,28)

为了解决这个问题,我添加:

x = np.expand_dims(x, axis=0)

在执行最后一行之前。 但是现在我收到另一个错误:

ValueError:检查时出错:预期conv2d_1_input具有形状(28,28,1),但数组的形状为(58000,28,28)

我有两个困惑:

  1. 为什么np.expand_dims()不按原样更改我的数组尺寸?
  2. 为什么model.predict()有时要求输入4D,而有时要求3D(在我的情况下为(28,28,1))? 该功能实际寻找什么?

提前致谢!

在堆叠图像之前,将图像从(28,28)调整为(28,28,1)。 这样便得到了最终的形状数组(5800、28、28、1)。

或者也许你应该做

x = np.expand_dims(x, axis=3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM