人工计算精度不同于评估精度

2024-06-13 18:51:27 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图在predict_generator()之后计算精度时,我得到的精度与evaluate_generator()计算的精度不同。你知道吗

不确定是否相关,但在DataGenerator类的flow_from_generator()中。你知道吗

idg_trainidg_testImageDataGenerator对象。你知道吗

# TensorFlow, Keras and NumPy
from tensorflow import keras
from keras.optimizers import Adam
from keras.losses import categorical_crossentropy
import numpy as np

# Own libraries
from DataManipulation import create_dataset, DataGenerator
from ModelZoo import variable_conv_layers

# Data Generation
train_gen = DataGenerator(generator = idg_train, subset = 'training', **params)
val_gen = DataGenerator(generator = idg_train, subset = 'validation', **params)
val_gen = DataGenerator(generator = idg_test, **params)
y_true = test_gen.generator.classes

# Model preparation
model = variable_conv_layer(**model_params) # Creates model

model.compile(optimizer = Adam(lr = 1e-4),
                               loss = categorical_crossentropy,
                               metrics = ['accuracy'])

# Training
model.fit_generator(train_gen,
                    epochs = 1,
                    validation_data = val_gen,
                    workers = 8,
                    use_multiprocessing = True,
                    shuffle = True)

# Prediction
scores = model.predict_generator(test_gen,
                                 workers = 8,
                                 use_multiprocessing = True)

pred = np.argmax(scores, axis = -1)[:len(test_gen.generator.classes)]
acc = np.mean(pred == y_true)

print("%s: %1.3e" % ("Manual accuracy", acc))
print("Evaluated [loss, accuracy]:", model.evaluate_generator(test_gen,
                                                         workers = 8,
                                                         use_multiprocessing = True)

打印以下内容:

Manual accuracy: 1.497e-01
Evaluated [loss, accuracy]: [0.308414297710572, 0.9838169642857143]

显然,手动计算的精度不同于evaluate_generator()的精度。我已经连续看了几个小时,不知道问题出在哪里。你知道吗

提前谢谢!你知道吗

编辑:另外,我尝试使用sklearn.metrics.confusion_matrix(y_true, pred)创建混淆矩阵,这将生成以下数组:

[[407   0  70   1   8   1   0  57   0]
 [413   0  74  15   0  16   1  32   0]
 [230   0  40   0   0   4   4  32   0]
 [239   0  40   0   0   2   2  36   0]
 [282   0  34   0   0   7   1  39   0]
 [296   0  37   0   3   4   0  40   0]
 [377   0  39   2   8   8   0  42   0]
 [183   0  28   4   6   4   0  19   0]
 [283   0  46   6   5   6   0  33   0]]

当出于某种原因简单地使用np.argmax(scores, axis = -1)时,它似乎预测了一个非常大的多数为“0”。你知道吗


Tags: fromtestimporttruemodelnp精度train