Python Keras.predict总是给出“预测”;1.“;作为输出

Python Keras.predict总是给出“预测”;1.“;作为输出,python,tensorflow,keras,Python,Tensorflow,Keras,我训练了一个二值分类器来区分清晰的MNIST图像和模糊的图像。所有图像都是28*28*1灰度数字,我有40000个用于培训,10000个用于验证,8000个用于测试。我的代码如下所示: from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img from keras.models import Sequential from keras.layers import C

我训练了一个二值分类器来区分清晰的MNIST图像和模糊的图像。所有图像都是28*28*1灰度数字,我有40000个用于培训,10000个用于验证,8000个用于测试。我的代码如下所示:

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 cv2
import numpy as np
import glob
from PIL import Image

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 = 20
batch_size = 16

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)

#model.save_weights('output.h5')#save the output as HDF5 file
filelist = glob.glob('/Binary Classifier/data/image_data/*.png')
x = np.array([np.array(Image.open(fname)) for fname in filelist])
x = np.expand_dims(x, axis=3)
ones=model.predict(x)
但是我在1[]中的输出预测都是[1],而训练的准确度实际上非常高(几乎完美)。有人知道为什么吗

编辑:如果我能显示我的图像数据,我想我可能会得到更多的帮助。目录中的MNIST图像基本上是(清晰的)或(模糊的)。所有图像均为(28*28*1)灰度图像,格式为.png。培训用的
'/Binary-Classifier/data/train'
中有40000位,验证用的
'/Binary-Classifier/data/val'
中有10000位,测试用的
'/Binary-Classifier/data/image\u-data/
中有58000位

  • 直接从一个生成器中提取数据并进行测试。像对待for循环中的列表一样对待生成器,以获得图像/标签对。这应该可以整理出您获取数据的方式及其格式(例如通道顺序)上的任何差异
  • 检查train/和val/的每个子目录中有多少个示例
  • 将您的度量更改为
    binary\u accurity
    ,因为您将该问题视为二进制分类问题(网络只有一个输出)

您的目标可能存在一些问题。而且,我看不出你在哪里定义它。它在最后第四排。我所做的基本上是导入所有图像数据,将它们转换为numpy数组,并使用经过训练的模型预测输出。我认为您应该查看正在导入的数据。如果你获得了高精度,这意味着你的目标主要包含了一些。神经网络没有问题。@Ahmed Lahlou Mimi您指的是测试数据还是验证数据?也许您应该发布/Binary Classifier/data/train和/Binary Classifier/data/val的结构以及每个子目录下有多少文件。