在 Keras 中,测试样本评估是这样完成
的score = model.evaluate(testx, testy, verbose=1)
这不会返回预测值。有一个返回预测值的方法predict
model.predict(testx, verbose=1)
返回
[
[.57 .21 .21]
[.19 .15 .64]
[.23 .16 .60]
.....
]
testy
是一个热编码,其值是这样的
[
[1 0 0]
[0 0 1]
[0 0 1]
]
如何像testy
这样的预测值或如何将预测值转换为一个热编码?
注意:我的模型如下所示
# 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))
返回的值是每个类的概率。这些值可能很有用,因为它们指示模型的置信度。
如果您只对概率最高的课程感兴趣:
例如,[.19 .15 .64]
=2
(因为列表中的索引 2 最大(
让模型到它
Tensorflow 模型有一个内置方法,该方法返回最高类概率的索引。
model.predict_classes(testx, verbose=1)
手动操作
argmax 是一个泛型函数,用于返回序列中最高值的索引。
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 返回一个 np.ndarray,其中包含类标签的规范化可能性。 因此,如果要将其转换为onehotencoding,则需要找到每行最大似然的索引,这可以通过使用沿axis=1的np.argmax
来完成。然后,要将其转换为 onehotenco,可以使用np.eye
功能。这会在指定的索引处放置 1。唯一要注意的是将维度化为适当的行长度。
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]])
函数predict_classes()
将被弃用。现在,为了获得一个热编码,您只需要在softmax上进行(model.predict(q) > 0.5).astype("int32")
。