python - 从功能 API 模型上的 Keras CNN predict() 获取概率
问题描述
我如何从 Keras 获得概率?
我为 3 节课训练了我的 CNN 模型。当我在新的测试图像上使用训练模型的 predict() 方法(使用功能 API)时,我总是得到一个热编码输出 ei [0, 1, 0]
,而我想得到诸如[0.1, 0.95, 0.1]
.
我将softmax
其用作最后一次激活,因此所有概率总和为 1,这是预期的。但是,我制作了一个虚拟模型,只在一个时期训练它,我仍然得到一个热编码输出,而不是概率。
我在这里做错了什么,比如调用错误的方法?否则我怎么能得到最后一层的输出,所以我可以标准化输出?
预测脚本片段:
model = load_model('./model.h5')
model.compile(loss='categorical_crossentropy',
optimizer='adadelta',
metrics=['acc'])
img = image.load_img(path.name,
target_size=(128, 128),
color_mode='grayscale')
img = image.img_to_array(img)
img = np.expand_dims(img, axis=0)
probability = model.predict(img)
print(probability)
训练脚本:
# Creates input shape for theano or tensorflow.
if K.image_data_format() == 'channels_first':
input_shape = (1, 128, 128)
else:
input_shape = (128, 128, 1)
visible = Input(shape=input_shape)
conv1_1 = Conv2D(filters=8,kernel_size=(5, 5),padding='same', strides = 1)(visible)
prelu1_1 = PReLU(alpha_initializer='zeros')(conv1_1)
pool1_1 = MaxPooling2D(pool_size=(2, 2),strides=2)(prelu1_1)
flat1 = Flatten()(pool1_1)
conv2_1 = Conv2D(filters=8,kernel_size=(5, 5),padding='same', strides = 1)(visible)
prelu2_1 = PReLU(alpha_initializer='zeros')(conv2_1)
pool2_1 = MaxPooling2D(pool_size=(2, 2),strides=2)(prelu2_1)
flat2 = Flatten()(pool2_1)
# Merge layers
merge = concatenate([flat1, flat2])
dense = Dense(64)(merge)
prelu3 = PReLU(alpha_initializer='zeros')(dense)
dropout3 = Dropout(rate=0.4)(prelu3)
dense4 = Dense(3)(dropout3)
output = Activation('softmax')(dense4)
model = Model(inputs=visible, outputs=output)
model.compile(loss='categorical_crossentropy',
optimizer='Adadelta',
metrics=['accuracy'])
train_datagen = ImageDataGenerator(
rescale=1. / 255,
shear_range=0.2,
width_shift_range=0.1,
height_shift_range=0.1,
rotation_range=5,
horizontal_flip=True)
test_datagen = ImageDataGenerator(
rescale=1. / 255, )
train_data_dir = r'D:\path\to\train'
validation_data_dir = r'D:\path\to\validation'
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(128, 128),
batch_size=32,
color_mode='grayscale',
class_mode='categorical')
validation_generator = test_datagen.flow_from_directory(
validation_data_dir,
target_size=(128, 128),
batch_size=32,
color_mode='grayscale',
class_mode='categorical')
model_final = model.fit_generator(
train_generator,
steps_per_epoch=11000 // 32,
epochs=1,
validation_data=validation_generator,
validation_steps=3000 // 32)
# Save model
model.save('./model.h5')
Keras 版本:2.1.6
注意:
model
建立在功能 API 之上,即 ( keras.models.Model()
)
解决方案
如果您不使用功能 API,您可以model.predict_proba()
获取概率。
probability = model.predict_proba(img)
希望这可以帮助。
推荐阅读
- python - 在类中使用时关闭 aiohttp ClientSession
- c# - System.IO.DirectoryNotFoundException 怎么解决
- google-cloud-platform - 如何启用/禁用 OAuth 以及请求将如何显示在 Google Cloud Console 中?
- python - 加速 Pandas DataFrame Groupby 应用
- implementation - 在 C++ 中使用 set 实现 Dijkstra 算法
- angular - Angular + OIDC 隐式流静默更新
- linux-kernel - 如果文件系统损坏,使用 kexec --load-panic 重新启动
- ruby-on-rails - Rails - 如何在设计注册表中添加额外的列值?
- javascript - 为什么可以在类定义中调用函数而不在 NodeJS 中创建它的对象?
- angular - 如何在编辑内联并仍处于焦点时为 Kendo-Angular 网格格式化货币?