&引用;盲目的;Keras CNN,100%准确,无预测能力
我是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 即使在所有原始标记图像、更改标记图像(通过生成器)或任何内容上,预测也始终是“干净”的,且百分比很高 有什么建议吗?我是否做出了错误的假设/我是否错过了什么 提前通知 安迪&引用;盲目的;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
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压缩位。。。。这在模型中重要吗?