2017-04-19 463 views
1

我在SO中的問題與this question相同。然而,當我嘗試使用probas_to_classes()效用函數,**它已經丟失在當前代碼:獲取Keras預測函數的類標籤訂單

"""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) 

你有沒有爲了得到與輸出相關的類的任何其他替代品該模型?

回答

0

只需在softmax函數的輸出上使用numpy的argmax即可獲得最大概率的類。這將返回範圍[0,N-1]中的類ID,其中N是類的數量。

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

謝謝你的回答。但是,我不知道我的類在輸出中的順序。另外,我的計劃是通過模型獲得前兩名的猜測。你能幫我麼? – noobalert

0

由馬蒂亞斯作爲正確地呈現,你應該使用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來recov呃從最高概率預測開始。

現在,爲了確保我們的類「預測」完全是原始類(因爲它們應該是「預測」已經是正確的類),計算誤差。和印刷

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

all_zero = not np.any(error) 

print (all_zero) 
+0

何時使用argmax軸作爲1和-1?什麼是不同的情況? –

0

一個更好的選擇是使用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),或者如果您想直接從多類輸出向量轉到 - 這就是例如,您可以使用Numpy的argmax,正如其他人與編碼器一起提到的那樣:

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