python - 从函数式 API 模型上的 Keras CNN Predict() 获取概率

标签 python tensorflow keras

我如何从 Keras 获得概率?

我训练了 3 个类别的 CNN 模型。当我在新的测试图像上使用训练模型的 Predict() 方法(使用功能 API)时,我总是得到一个热编码输出,即 [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 - 从函数式 API 模型上的 Keras CNN Predict() 获取概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55491937/

相关文章:

python - 在python中的一个句子中使用两个或多个关系运算符

python - 比较运算符的正则表达式

python - 使用 Python 匹配和枚举测验结果的直接方法是什么

python - Pyinstaller 无法将我的 dll 复制到 MEIPASS

python - 在 keras 中定义模型(include_top = True)

python - manage.py 是组织/编写 Flask 应用程序的正确方法吗?

python - Tensorflow 中 strided slice 的复杂度是多少?

mysql - 如何使用mysql中存储的任意数据特征训练DNN分类模型?

python - 为什么我在 Keras 中得到负的 false_negative 计数(例如 -10)?

python - 在 for 循环中并行执行模型预测