我正在尝试构建一个模型,使用带有Tensorflow后端的keras来预测图片中是否有文本。
这是我的模特:
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(image_size, image_size, 3))) # 32?
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5)) # 0.5?
model.add(Conv2D(32, (3, 3))) # again, 32?
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5)) # again, 0.5?
model.add(Conv2D(64, (3, 3))) # again, 64?
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5)) # again, 0.5?
model.add(Flatten())
model.add(Dense(96))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1)) # binary
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
我尝试过图像尺寸128,256,384。 我训练了9000张图片,4500只猫1和4500只猫2。 训练精度高达0.90。 但是当我加载模型并使用它来预测我没有训练过的两个类别的图像类别时,它总是给出得分0。
为什么会发生这种情况?
P.S。 cat 1是带有文本的图像,cat 2是没有文本的图像。
这也是我测试模型的代码:
model = load_model(model_path)
test_data_generator = ImageDataGenerator(rescale=1. / 255)
test_generator = test_data_generator.flow_from_directory(
test_data_dir,
target_size=(image_size, image_size),
batch_size=batch_size,
class_mode=None,
shuffle=False)
prediction = model.predict_generator(
test_generator,
use_multiprocessing=True,
verbose=1) # verbose=1 makes it show a progress bar.
dst = []
for pred in prediction:
if int(round(pred)) == 0:
dst += [0]
else:
dst += [1]
dst全是0。
答案 0 :(得分:0)
显然问题是我使用keras的生成器来提供我正在测试的图像并使用shutil迭代它们。所以我得到预测并使用两个不同的东西迭代它们和目录中的文件,它们的顺序不一样。 shutil会以一些随机顺序列出它们,而生成器会按名称按升序列出它们。所以我没有在为它生成的文件上添加标签。