如何获得keras预测模型CNN中的概率百分比

Posted

技术标签:

【中文标题】如何获得keras预测模型CNN中的概率百分比【英文标题】:How to get the probability percentage in keras predicting model CNN 【发布时间】:2019-03-14 22:50:09 【问题描述】:

在这里,我得到的数据是 [0 1 0 0] 或 [0 0 0 1],--- 我知道它告诉我 [0 1 0 0] 是 label2,[0 0 0 1] 是 label4,[1 0 0 0] 是 label1,[0 0 1 0] 是 label3。

import pickle
from keras.preprocessing.sequence import pad_sequences

MAX_SEQUENCE_LENGTH = 1000
MAX_NB_WORDS = 20000

with open ('textsdata', 'rb') as fp:
    texts = pickle.load(fp)

tokenizer = Tokenizer(num_words=MAX_NB_WORDS)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
inputquery = ["Play some music will ya"]
sequences = tokenizer.texts_to_sequences(inputquery)
model = load_model('my_model.h5')
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['acc'])
print("sequences", sequences)

data = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)
classes = model.predict(data)
y_classes = classes.argmax(axis=-1)
print(y_classes)

我需要它的百分比,就像它确信它是 label1 为 0.67 softmax之前的值或者有足够把握告诉它的值是label1 or label2 or label3 or label4--

我需要它的百分比是其中任何一个或所有这些百分比,例如...

如果给定一个输入,输出是这样的

Class1 - 0.87

Class2 - 0.3

Class3 - 0.5

Class4 - 0.5 我怎样才能得到这种输出而不仅仅是 [1 0 0 0] 我应该在上面的代码旁边添加什么请告诉

【问题讨论】:

只打印包含未校准概率的类变量。 现在我只有两个类 0 或 1 “只打印你的类变量,其中包含未校准的概率”——我该怎么做才是准确的问题 【参考方案1】:

有一个名为predict_proba 的方法返回单个类的概率而不是类预测。这可以用作

probabilities = model.predict_proba(data)

在此blog 中查找更多信息。

【讨论】:

根据“keras.io/models/model/”没有这个功能!【参考方案2】:
from keras.models import load_model

from keras.preprocessing import image

model=load_model("/blah/blah/blah")

img = image.load_img(path, color_mode = "grayscale", target_size=(128, 128, 1))

y = image.img_to_array(img)

y = np.expand_dims(y, axis=0)

images = np.vstack([y])

classes = model.predict(images/255.0, batch_size=8, verbose=0)

【讨论】:

可以通过将图像数组除以255.0来强制keras模型显示概率。【参考方案3】:

predict 返回一个包含预测的列表。你可以用这个

results = model.predict(data)
for result in results:
    print(str(result))

这将返回

0.99
0.87
0.75

或者如果你在另一个列表中有这些类,你应该这样做。

res = model.predict(data)
results = [[i,r] for i,r in enumerate(res)]
results.sort(key=lambda x: x[1], reverse=True)
for r in results:
    print(classes[r[0]], str(r[1])))

返回

("classA", 0.99)
("classB", 0.95)

【讨论】:

以上是关于如何获得keras预测模型CNN中的概率百分比的主要内容,如果未能解决你的问题,请参考以下文章

在 keras 中使用 CNN 对图像进行二值分类时正确预测的总数

结合来自不同 CNN 模型的概率

使用 Keras 维度误差的 CNN-1D(Seq2 点)时间序列预测

R - H2O- 如何获得训练有素的模型预测/概率?

在 Keras 中实现 Causal CNN 以进行多变量时间序列预测

TF |训练完成后如何从 CNN 进行预测