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