获取Keras预测函数的类标签顺序

时间:2017-04-19 06:37:04

标签: python classification deep-learning keras

我在SO中遇到与this question相同的问题。但是,当我尝试使用 probas_to_classes()实用程序函数时,**它已在当前代码中丢失:

"""Numpy-related utilities."""
from __future__ import absolute_import

import numpy as np


def to_categorical(y, num_classes=None):
    """Converts a class vector (integers) to binary class matrix.

    E.g. for use with categorical_crossentropy.

    # Arguments
        y: class vector to be converted into a matrix
            (integers from 0 to num_classes).
        num_classes: total number of classes.

    # Returns
        A binary matrix representation of the input.
    """
    y = np.array(y, dtype='int').ravel()
    if not num_classes:
        num_classes = np.max(y) + 1
    n = y.shape[0]
    categorical = np.zeros((n, num_classes))
    categorical[np.arange(n), y] = 1
    return categorical


def normalize(x, axis=-1, order=2):
    """Normalizes a Numpy array.

    # Arguments
        x: Numpy array to normalize.
        axis: axis along which to normalize.
        order: Normalization order (e.g. 2 for L2 norm).

    # Returns
        A normalized copy of the array.
    """
    l2 = np.atleast_1d(np.linalg.norm(x, order, axis))
    l2[l2 == 0] = 1
    return x / np.expand_dims(l2, axis)

为了获得与模型输出相关的类,您还有其他选择吗?

4 个答案:

答案 0 :(得分:3)

正如matias正确呈现的那样,你应该使用np.argmax函数

但由于您通常处理批次中的输入,因此您的预测输出很可能是一个矩阵。您可以通过单独应用argmax来处理它,但我认为最好使用axis参数。

简而言之:

predictions = model.predict(Input)
classes = np.argmax(predictions, axis=1)

在不那么短的时间内,你可以测试一个可运行的代码:

from __future__ import print_function
import keras
import numpy as np
from keras.datasets import mnist



(x_train, y_train), (x_test, y_test) = mnist.load_data()
num_classes = 10
y_test_cat = keras.utils.to_categorical(y_test, num_classes)
print(y_test)
print(np.argmax(y_test_cat,axis=1))

error = y_test-np.argmax(y_test_cat,axis=1)

all_zero = not np.any(error)

print (all_zero)

说明:

首先是所有那些keras和numpy导入和打印功能(因为为什么不)

from __future__ import print_function
import keras
import numpy as np
from keras.datasets import mnist

然后加载mnist数据

(x_train, y_train), (x_test, y_test) = mnist.load_data()

之后,使用to_categorical

将目标类更改为一个热编码
y_test_cat = keras.utils.to_categorical(y_test, num_classes)

然后回到你需要的课程:

print(np.argmax(y_test_cat,axis=1))

在这个例子中,y_test_cat将是你的model.predict()函数的输出,这就是你如何将它传递给argmax以从最高概率预测中恢复你的类。

现在,只是为了确保我们的类“预测”完全是原始类(因为它们应该是“预测”已经是正确的类),计算错误。并打印

error = y_test-np.argmax(y_test_cat,axis=1)

all_zero = not np.any(error)

print (all_zero)

答案 1 :(得分:2)

更好的选择是使用sklearn标签编码器,专门用于此目的。

>>> from sklearn.preprocessing import LabelEncoder()
>>> le = LabelEncoder()
>>> le.fit_tranform([1, 2, 2, 6])
array([0, 0, 1, 2])
>>> le.inverse_transform([0, 0, 1, 2])
[1, 2, 2, 6]

基本上,这可以用于将任何集合(包括那些包含非数字的集合)映射到整数映射中,这种方式可以在训练过程之后反转,以便与类标签干净地关联。

请注意,在keras模型中,您可以使用predict_class函数直接获取转换后的类标签(此时您可以执行inverse_transform),或者如果您想从多类中获取直接输出向量 - 这是你调用预测并为输出层激活softmax时得到的结果,例如,你可以使用Numpy的argmax,如其他人与编码器一起提到的那样:

true_labels = le.inverse_transform(list(map(lambda x: np.argmax(x))))

答案 2 :(得分:1)

noobalert,要获得前2个预测,如您在评论部分对Matias Valdenegro的问题的要求一样,您可以执行以下代码:

prediction1 = model.predict(your_data)
# sorting the predictions in descending order
sorting = (-prediction1).argsort()

# getting the top 2 predictions
sorted_ = sorting[0][:2]

for value in sorted_:
    # you can get your classes from the encoder(your_classes = encoder.classes_) 
    # or from a dictionary that you created before.
    # And then we access them with the predicted index.
    predicted_label = your_classes[value]

    # just some rounding steps
    prob = (prediction1[0][value]) * 100
    prob = "%.2f" % round(prob,2)
    print("I have %s%% sure that it belongs to %s." % (prob, predicted_label)

答案 3 :(得分:0)

只需在softmax函数的输出上使用numpy的argmax即可获得最大概率的类。这将返回[0,N-1]范围内的类ID,其中N是类的数量。

pred = model.predict(data here)[0]
classes = np.argmax(pred)