pep*_*epe 9 python neural-network deep-learning conv-neural-network 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'])
Run Code Online (Sandbox Code Playgroud)
我也可以使用预测图像类
y_pred = model.predict_classes(img, 1, verbose=0)
Run Code Online (Sandbox Code Playgroud)
但是输出y_pred总是二进制的.使用predict_proba和时似乎也是如此predict.我的输出是这种形式
[[ 1. 0. 0. 0.]]
[[ 0. 1. 0. 0.]]
Run Code Online (Sandbox Code Playgroud)
这样可行,但我希望每个分类都有一个概率百分比
[[ 0.8 0.1 0.1 0.4]]
Run Code Online (Sandbox Code Playgroud)
我如何在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
Run Code Online (Sandbox Code Playgroud)
由于指数函数增长非常快,因此softmax从数量级 1 开始,开始产生类似 one-hot 的输出。在函数的 Keras 实现softmax中,将从输入中减去最大值,但在上述情况下,它不会产生任何差异。
解决此问题的可能方法:
确保重新缩放输入图像,以便像素值介于0和之间1。
向您的模型添加一些正则化器。