web-dev-qa-db-fra.com

Comment obtenir des valeurs prédites dans Keras?

Dans le test Keras, l’évaluation des échantillons se fait comme ceci

score = model.evaluate(testx, testy, verbose=1)

Cela ne renvoie pas les valeurs prévues. Il existe une méthode predict qui renvoie les valeurs prédites

model.predict(testx, verbose=1)

retour

[ 
[.57 .21 .21]
[.19 .15 .64]
[.23 .16 .60] 
.....
]

testy est un encodage à chaud et ses valeurs sont comme ceci

[
[1 0 0]
[0 0 1]
[0 0 1]
]

Comment les valeurs prédites comme testy ou comment convertir les valeurs prédites en une seule encodée à chaud?

note: mon modèle ressemble à ceci

# setup the model, add layers
model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(classes, activation='softmax'))

# compile model
model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy'])

# fit the model
model.fit(trainx, trainy, batch_size=batch_size, epochs=iterations, verbose=1, validation_data=(testx, testy))
9
asdfkjasdfjk

Les valeurs renvoyées sont les probabilités de chaque classe. Ces valeurs peuvent être utiles car elles indiquent le niveau de confiance du modèle.

Si vous êtes uniquement intéressé par la classe avec la plus forte probabilité:

Par exemple[.19 .15 .64] = 2 (car l'index 2 de la liste est le plus grand)

Laissez le modèle à lui

Les modèles Tensorflow ont une méthode intégrée qui renvoie l'indice de la probabilité de classe la plus élevée.

model.predict_classes(testx, verbose=1)

Faites-le manuellement

argmax est une fonction générique pour renvoyer l'index de la valeur la plus élevée d'une séquence.

import tensorflow as tf

# Create a session
sess = tf.InteractiveSession()

# Output Values
output = [[.57, .21, .21], [.19, .15, .64], [.23, .16, .60]]

# Index of top values
indexes = tf.argmax(output, axis=1)
print(indexes.eval()) # prints [0 2 2]
12
Oliver Rice

Keras renvoie un np.ndarray avec la probabilité normalisée d'étiquettes de classe. Donc, si vous voulez transformer cela en un codage unique, vous devrez trouver les indices de la probabilité maximale par ligne, cela peut être fait en utilisant np.argmax le long de l'axe = 1. Ensuite, pour transformer cela en un codage unique, le np.eye la fonctionnalité peut être utilisée. Cela placera un 1 aux indices spécifiés. Le seul soin à prendre est de dimensionner à la longueur de ligne appropriée.

a #taken from your snippet
Out[327]: 
array([[ 0.57,  0.21,  0.21],
       [ 0.19,  0.15,  0.64],
       [ 0.23,  0.16,  0.6 ]])

b #onehotencoding for this array
Out[330]: 
array([[1, 0, 0],
       [0, 0, 1],
       [0, 0, 1]])

n_values = 3; c = np.eye(n_values, dtype=int)[np.argmax(a, axis=1)]
c #Generated onehotencoding from the array of floats. Also works on non-square matrices
Out[332]: 
array([[1, 0, 0],
       [0, 0, 1],
       [0, 0, 1]])
4
Uvar