2017-04-19 10 views
1

ここには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) 

あなたはの出力に関連付けられたクラスを得るために、他の選択肢を持っていますかモデル?

答えて

0

softmax関数の出力でnumpyのargmaxを使用すると、最大確率でクラスを取得できます。これは[0、N-1]の範囲のクラスIDを返します。ここでNはクラスの数です。

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

はその答えをいただき、ありがとうございます。しかし、私はクラスが出力にある順番を知らない。また、私の計画は、モデルによってトップ2の推測を得ることです。手伝ってくれませんか? – 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) 

で1つのホットエンコーディングにターゲットクラスを変更します。

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)))) 
関連する問題