我是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 ...
答案 0 :(得分:1)
似乎开始。 g
主要变化:负片数量相同,更类似于正片。
一层又一层的复杂性。
感谢任何对解决方案 g
有想法的人BR安迪