web-dev-qa-db-ja.com

Keras機能モデルからクラスラベルを取得する

Kerasに機能モデルがあります(リポジトリの例のResnet50)。 ImageDataGeneratorおよびflow_from_directoryデータでトレーニングし、モデルを.h5ファイルに保存しました。 model.predictを呼び出すと、クラス確率の配列を取得します。しかし、私はそれらをクラスラベル(私の場合はフォルダー名)に関連付けたいと思います。どうすれば入手できますか? model.predict_classesmodel.predict_probaを使用できることがわかりましたが、これらの関数は機能モデルにはなく、シーケンシャルにしかありません。

45
Ledzz
y_prob = model.predict(x) 
y_classes = y_prob.argmax(axis=-1)

こちら のように。

44

Flow_from_directoryを使用する場合、問題は確率出力の解釈方法です。同様に、flow_from_directoryがワンホットベクトルを作成する方法として確率出力とクラスラベルをマップする方法は、以前は知られていませんでした。

クラスラベルを、使用時に出力として取得する予測ベクトルのインデックスにマップする辞書を取得できます。

generator= train_datagen.flow_from_directory("train", batch_size=batch_size)
label_map = (generator.class_indices)

Label_map変数はこのような辞書です

{'class_14': 5, 'class_10': 1, 'class_11': 2, 'class_12': 3, 'class_13': 4, 'class_2': 6, 'class_3': 7, 'class_1': 0, 'class_6': 10, 'class_7': 11, 'class_4': 8, 'class_5': 9, 'class_8': 12, 'class_9': 13}

次に、これから、確率スコアとクラス名の間の関係を導出できます。

基本的に、このコードでこの辞書を作成できます。

from glob import glob
class_names = glob("*") # Reads all the folders in which images are present
class_names = sorted(class_names) # Sorting them
name_id_map = dict(Zip(class_names, range(len(class_names))))

上記のコードの変数name_id_mapには、flow_from_directoryのclass_indices関数から取得したものと同じ辞書も含まれています。

お役に立てれば!

24
Lokesh Kumar

更新:これは、新しいKerasバージョンでは無効になりました。 Emilia Apostolovaからの回答のようにargmax()を使用してください。

機能的APIモデルには、分類のためにクラス確率を返すpredict()関数のみがあります。その後、probas_to_classes()ユーティリティ関数を使用して、最も可能性の高いクラスを選択できます。例:

y_proba = model.predict(x)
y_classes = keras.np_utils.probas_to_classes(y_proba)

これは、シーケンシャルモデルのmodel.predict_classes(x)と同等です。

これは、機能APIが、predict_classes()が意味をなさない、より一般的なクラスのタスクをサポートするためです。

詳細: https://github.com/fchollet/keras/issues/2524

8

@Emilia Apostolovaに加えて、グラウンドトゥルースラベルを取得するための回答

generator = train_datagen.flow_from_directory("train", batch_size=batch_size)

ただ電話する

y_true_labels = generator.classes
2
Hemerson Tacon

Kerasモデルにラベルの「リスト」を直接保存することができます。このようにして、予測にモデルを使用し、他の情報源を持たないユーザーが自分で検索を実行できます。ラベルの「インジェクション」を実行する方法のダミーの例を次に示します

# assume we get labels as list
labels = ["cat","dog","horse","tomato"]
# here we start building our model with input image 299x299 and one output layer
xx = Input(shape=(299,299,3))
flat = Flatten()(xx)
output = Dense(shape=(4))(flat)
# here we perform injection of labels
tf_labels = tf.constant([labels],dtype="string")
tf_labels = tf.tile(labels,[tf.shape(xx)[0],1])
output_labels = Lambda(lambda x: tf_labels,name="label_injection")(xx)
#and finaly creating a model
model=tf.keras.Model(xx,[output,output_labels])

予測に使用すると、このモデルはスコアのテンソルとストリングラベルのテンソを返します。このようなモデルはh5に保存できます。この場合、ファイルにはラベルが含まれます。このモデルはsaved_modelにエクスポートして、クラウドでの提供に使用することもできます。

1
Fedor Petrov

ラベルインデックスを使用する必要があります。ここでは、テキスト分類のために何をするかを示します。

# data labels = [1, 2, 1...]
labels_index = { "website" : 0, "money" : 1 ....} 
# to feed model
label_categories = to_categorical(np.asarray(labels)) 

次に、予測のために:

texts = ["hello, rejoins moi sur skype", "bonjour comment ça va ?", "tu me donnes de l'argent"]

sequences = tokenizer.texts_to_sequences(texts)

data = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)

predictions = model.predict(data)

t = 0

for text in texts:
    i = 0
    print("Prediction for \"%s\": " % (text))
    for label in labels_index:
        print("\t%s ==> %f" % (label, predictions[t][i]))
        i = i + 1
    t = t + 1

これは与える:

Prediction for "hello, rejoins moi sur skype": 
    website ==> 0.759483
    money ==> 0.037091
    under ==> 0.010587
    camsite ==> 0.114436
    email ==> 0.075975
    abuse ==> 0.002428
Prediction for "bonjour comment ça va ?": 
    website ==> 0.433079
    money ==> 0.084878
    under ==> 0.048375
    camsite ==> 0.036674
    email ==> 0.369197
    abuse ==> 0.027798
Prediction for "tu me donnes de l'argent": 
    website ==> 0.006223
    money ==> 0.095308
    under ==> 0.003586
    camsite ==> 0.003115
    email ==> 0.884112
    abuse ==> 0.007655
1
Thomas Decaux

ImageDataGeneratorを使用して予測クラスとファイル名をマッピングするには、次を使用します。

# Data generator and prediction
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
        inputpath,
        target_size=(150, 150),
        batch_size=20,
        class_mode='categorical',
        shuffle=False)
pred = model.predict_generator(test_generator, steps=len(test_generator), verbose=0)
# Get classes by max element in np (as a list)
classes = list(np.argmax(pred, axis=1))
# Get filenames (set shuffle=false in generator is important)
filenames = test_generator.filenames

次を使用して、予測されたクラスと関連するファイル名をループできます。

for f in Zip(classes, filenames):
    ...
0
Peter