我的CNN总是输出0或1,从不给出百分比。这是为什么?

我正在使用Keras构建一个多类别多标签的对象识别CNN,希望它能给出图像属于哪个(些)类别的百分比置信度。不幸的是,我无法让它输出百分比,只能在运行model.predict()方法时为每个类别得到0或1的值。我的代码有什么问题,还是它只是没有训练足够的图像?(是的,我在用模型从未见过的新照片进行预测。)

#building the CNNclassifier = Sequential()classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))classifier.add(MaxPooling2D(pool_size = (2, 2)))classifier.add(Dropout(0.25))classifier.add(Flatten())classifier.add(Dense(units = 128, activation = 'relu'))classifier.add(Dense(units = 64, activation = 'relu'))classifier.add(Dense(units = 4, activation = 'sigmoid'))classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])datagen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2,zoom_range = 0.2,horizontal_flip = True,validation_split = 0.1)training_set = datagen.flow_from_directory('images',target_size = (64, 64),batch_size = 32,class_mode = 'categorical',subset = 'training')test_set = datagen.flow_from_directory('images',target_size = (64, 64),batch_size = 32,class_mode = 'categorical',subset = 'validation')classifier.fit_generator(training_set,steps_per_epoch = training_set.samples,epochs = 10,validation_data = test_set,validation_steps = test_set.samples)#predicting new image classtest_image = image.load_img(r'XXXX', target_size = (64, 64))test_image = image.img_to_array(test_image)test_image = np.expand_dims(test_image, axis = 0)result = classifier.predict_proba(test_image)print (result)

训练输出:

# Epoch 10/10# 237/237 [==============================] - 14s 58ms/step - loss: 1.3194e-04 - acc: 1.0000 - val_loss: 0.0312 - val_acc: 0.9860

这些是我的损失/准确率。

[[1. 1. 0. 0.]]

这是一个预测新图像的示例结果。我甚至给模型提供了高度不相关的图像,结果仍然相似。

我意识到237张照片是一个非常小的训练集;我会在接下来的几个月里增加图像数据库。


回答:

要获得百分比输出,请在输出层使用softmax激活函数来获取概率。无论如何,你都不应该使用sigmoid激活函数,因为它们会导致梯度消失问题。

classifier = Sequential()classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))classifier.add(MaxPooling2D(pool_size = (2, 2)))classifier.add(Dropout(0.25))classifier.add(Flatten())classifier.add(Dense(units = 128, activation = 'relu'))classifier.add(Dense(units = 64, activation = 'relu'))classifier.add(Dense(units = 4, activation = 'softmax'))

另一个可能的原因是数据缩放。请参考在Keras中分类预测返回概率?以获取解决方案。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注