&引用;盲目的;Keras CNN,100%准确,无预测能力

&引用;盲目的;Keras CNN,100%准确,无预测能力,keras,Keras,我是Keras的新手,尝试基于所有图像(150 x 150)的数据集(有标记和无标记)构建图像检测。 我的代码基于Francois Chollet的深度学习书籍。 Jupyter NB,Keras 2.2.0,tensorflow 我创建了两个类(“clean wall”和“marked wall”),以便能够显示激活(softmax而不是sigmoid),如显示最后一个conv层激活的书中所述,并在以后使用更多的类 我的问题是(有30000张干净的图像和40张标记的图像),全部是150x150

我是Keras的新手,尝试基于所有图像(150 x 150)的数据集(有标记和无标记)构建图像检测。 我的代码基于Francois Chollet的深度学习书籍。 Jupyter NB,Keras 2.2.0,tensorflow

我创建了两个类(“clean wall”和“marked wall”),以便能够显示激活(softmax而不是sigmoid),如显示最后一个conv层激活的书中所述,并在以后使用更多的类

我的问题是(有30000张干净的图像和40张标记的图像),全部是150x150,模型立即运行到100%的准确度,没有损失-但是如果我以后预测的话,没有将任何标记的图像识别为标记的图像。(同一型号可以完美地处理100张cat图片,手动将相同的图片标记为第二类的附加迷你图片,并将所有图片的大小从较大的图片调整为150x150)

总训练图像(1和0):28980和47 验证图像总数(1和0):28980和6

即使在所有原始标记图像、更改标记图像(通过生成器)或任何内容上,预测也始终是“干净”的,且百分比很高

有什么建议吗?我是否做出了错误的假设/我是否错过了什么

提前通知

安迪

from keras import layers
from keras import models
from keras import optimizers

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
                    input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(32, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(2, activation='softmax'))

model.compile(loss='categorical_crossentropy',
          optimizer=optimizers.RMSprop(lr=1e-4),
          metrics=['acc'])

# Preprocess images
from keras.preprocessing.image import ImageDataGenerator

# All images will be rescaled by 1./255
train_datagen = ImageDataGenerator(
  rescale=1./255,
  rotation_range=20, 
  width_shift_range=0.2, 
  height_shift_range=0.2, 
  shear_range=0.2, 
  zoom_range=0.2, 
  vertical_flip=True,
  horizontal_flip=True,
  fill_mode='reflect')
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    # This is the target directory
    train_dir,
    # All images will be resized to 150x150
    target_size=(150, 150),
    batch_size=16,
    # Since we use binary_crossentropy loss, we need binary labels
    class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
    validation_dir,
    target_size=(150, 150),
    batch_size=16,
    class_mode='categorical')

# train the model

for data_batch, labels_batch in train_generator:
  print('data batch shape:', data_batch.shape)
  print('labels batch shape:', labels_batch.shape)
  break

history = model.fit_generator(
  train_generator,
  steps_per_epoch=10,
  epochs=5,
  validation_data=validation_generator,
  validation_steps=10)
输出:

data batch shape: (16, 150, 150, 3)
labels batch shape: (16, 2)
Epoch 1/5
5/5 [==============================] - 17s 3s/step - loss: 0.5646 - acc: 0.8625 - val_loss: 0.3196 - val_acc: 1.0000
Epoch 2/5
5/5 [==============================] - 18s 4s/step - loss: 0.2201 - acc: 1.0000 - val_loss: 0.0823 - val_acc: 1.0000 ... 
看来,开始明白了。g

主要变化:相同数量的负面图片,与正面图片更相似

一个更密集的层的复杂性

Thnx给任何一个对解决方案g有想法的人


BR Andy

我上传了一个示例图像作为我的个人资料图片。如果有必要,图片都是96dpi,位深度24,使用scipy.misc.imsave(pathI,img)创建,加载后,最终拆分,预处理为:x=image.img\u to\u array(img);x=x.重塑((1,)+x.形状);猫有1 dpi,sRGB,分辨率2,每像素2压缩位。。。。这在模型中重要吗?