“盲” Keras CNN,准确度100%,无预测能力

时间:2018-10-13 04:47:32

标签: keras

我是Keras的新手,他试图基于所有带有和不带有标记的图像(150 x 150)的图像数据集构建图像检测。 我的代码基于Francois Chollet撰写的《深度学习》一书。 Jupyter NB,Keras 2.2.0,张量流

我创建了两个类(“干净的墙”和“标记的墙”),以便能够显示激活(softmax而不是Sigmoid),如在书中描述的,显示最后一个conv层激活,并使用更多的类以后。

我的问题是(具有〜30000张清晰的图像和〜40个带有标记的图像),全部为150x150,该模型可立即以100%的精度运行,而不会丢失-但是如果我以后再预测一个,则无法标识任何带标记的图像。 (同一模型可以完美地处理100张猫的图像,手动将相同的图片标记为第二类,并附加一个小图像,并将所有图片的尺寸从150x150调整为150x150)。

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

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

有什么建议吗?我是在做错误的假设吗/我在某处错过了东西吗?

提前感谢!

安迪(Andy)

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 ... 

1 个答案:

答案 0 :(得分:1)

似乎开始。 g

主要变化:负片数量相同,更类似于正片。

一层又一层的复杂性。

感谢任何对解决方案 g

有想法的人

BR安迪