作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Keras 构建一个多类多标签对象识别 CNN,它将给出图像属于哪个类的百分比置信度。不幸的是,当我运行 model.predict() 方法时,我似乎无法让它给出百分比,而只能为每个类提供 0 或 1 值。我的代码是否有问题,或者只是还没有接受足够图像的训练? (是的,我正在使用模型从未见过的新照片进行预测。)
#building the CNN
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 = '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 class
test_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'))
另一个可能的原因可能是数据缩放。请引用Returning probabilities in a classification prediction in Keras?寻求解决方案。
关于python - 我的 CNN 总是得出 0 或 1,而不是百分比。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56119773/
这个问题在这里已经有了答案: Why are these constructs using pre and post-increment undefined behavior? (14 个答案) 关
我是一名优秀的程序员,十分优秀!