8
获得预测

我已经成功地训练在Keras一个简单的模型到图像分类:在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得到这个?

回答

1

Softmax可能会产生“单热”的输出。考虑下面的例子:

# 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最大值从输入中减去起始的输出,但在所陈述的以上情况不会有任何区别。

可能的方法来解决这个问题:

  1. 确保输入图像的重新调整,以便将像素值01之间。

  2. 将一些regularizers添加到您的模型中。