我已经成功地在Keras中训练了一个简单的模型来对图像进行分类:

model = Sequential()

model.add(Convolution2D(32, 3, 3, border_mode='valid', input_shape=(img_channels, img_rows, img_cols),
                        activation='relu', name='conv1_1'))
model.add(Convolution2D(32, 3, 3, activation='relu', name='conv1_2'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, 3, 3, border_mode='valid', activation='relu', name='conv2_1'))
model.add(Convolution2D(64, 3, 3, activation='relu', name='conv2_2'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))

model.add(Dense(nb_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

我也可以使用以下方法预测图像类别
y_pred = model.predict_classes(img, 1, verbose=0)

但是,y_pred的输出始终是二进制的。使用predict_probapredict时似乎也是如此。我的输出是这种形式
[[ 1.  0.  0.  0.]]
[[ 0.  1.  0.  0.]]

这样就可以了,但是例如,我希望每个分类都有一个概率百分比
[[ 0.8  0.1  0.1  0.4]]

我如何在Keras上获得这个?

最佳答案

Softmax可能会产生类似“one-hot”的输出。考虑以下示例:

# Input; Exponent; Softmax value
20    485165195  0.99994
 9         8103  0.00002
 5          148  0.00000
10        22026  0.00005
------------------------
# Sum 485195473  1

由于指数函数的增长非常快,因此softmax从数量级1开始开始产生类似一热的输出。在Keras implementation of the softmax function中,从输入中减去最大值,但在上述情况下不会有任何区别。

解决此问题的可能方法:
  • 确保重新缩放输入图像,以使像素值介于01之间。
  • 向模型添加一些regularizers
  • 关于python - 在Keras中获得预测,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38192354/

    10-12 19:34