预测模型仅在保留集的keras上提供一类

时间:2018-11-23 17:47:19

标签: python python-3.x tensorflow machine-learning keras

当前,使用CNN预测一些黑白图像的模型。该模型可以很好地满足我的要求。这是模型:

lr = 0.2
Adam(lr=lr, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.001)
classifier = Sequential()

# Step 1 - Convolution
classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
dropout = 0.3
# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Dropout(rate=dropout))
# Adding a second convolutional layer
classifier.add(Conv2D(32, (3, 3), activation = 'sigmoid'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Dropout(rate=dropout))
classifier.add(Conv2D(32, (3, 3), activation = 'sigmoid'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
# Step 3 - Flattening
classifier.add(Flatten())

# Step 4 - Full connection
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 1, activation = 'sigmoid'))

# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
epoch_number = 40
epochs = 25
steps_validation = 100
history = classifier.fit_generator(training_set,
                         steps_per_epoch = epoch_number,
                         epochs = epochs,
                         validation_data = test_set,
validation_steps = steps_validation)  
classifier.save('epoch40epochs25softmax.h5')

现在,在训练了该模型之后,我想在“现实世界”中使用它,因此我有了一个使用它的保持集。问题是它只在我做错了classifier.predict_classes(test_image)时才预测第1类,所以我试着对测试集中的所有元素都做classifier.predict_classes(test_image),因为我知道我的分数是75%在该集合上的准确性,并且仍然在执行以下操作:

for test_image in test_set_dir:
    classifier.predict_classes(test_image)

我仍然只能得到非常接近[[1]]的数字。我的问题是我是否正确使用了keras,否则,怎么回事?我应该得到一些[[0]]分类。

我绝对确定该模型不会仅预测1类,因为我对这两个类分别进行了50%-50%的分配,并且我获得了75%的准确性。

编辑: 我正在对图像进行归一化

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0,  
                                   zoom_range = 0,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('datasetI/training_set',
                                                 target_size = (64, 64),
                                                 batch_size = 32,
                                                 class_mode = 'binary')

test_set = test_datagen.flow_from_directory('datasetI/test_set',
                                            target_size = (64, 64),
                                            batch_size = 32,
                                            class_mode = 'binary')

如果我想在test_set上获得班级预测,应该怎么做?

0 个答案:

没有答案