为啥在 Keras 中 fit_generator 的准确度、evaluate_generator 的准确度和自定义准确度不同?

Posted

技术标签:

【中文标题】为啥在 Keras 中 fit_generator 的准确度、evaluate_generator 的准确度和自定义准确度不同?【英文标题】:Why are accuracy of fit_generator, accuracy of evaluate_generator and custom accuracy different in Keras?为什么在 Keras 中 fit_generator 的准确度、evaluate_generator 的准确度和自定义准确度不同? 【发布时间】:2022-01-15 11:43:19 【问题描述】:

我写了以下代码:

epochs = 4
batch_size = 5
numclasses = 7

train_datagen = ImageDataGenerator(
    rescale=1. / 280,
    rotation_range=0,  # randomly rotate images in the range (degrees, 0 to 180)
    zoom_range = 0.1, # Randomly zoom image 
    width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
    height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
    #shear_range=0.2,
    vertical_flip=False,
    horizontal_flip=True)

# this is the augmentation configuration we will use for testing:
# only rescaling
test_datagen = ImageDataGenerator(rescale=1. / 280)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical')

nb_train_samples = 7*132
nb_validation_samples = 7*28

lr = 1e-5
decay = 1e-7 #0.0
optimizer = RMSprop(lr=lr, decay=decay)
# model is resnet
model.load_weights('modelweights.h5')
model.compile(loss='categorical_crossentropy',
              optimizer=optimizer,
              metrics=['accuracy'])

history = model.fit_generator(
    train_generator,
    steps_per_epoch = len(train_generator),
    epochs=epochs,
    workers=1,
    use_multiprocessing=False,
    validation_data=validation_generator,
    validation_steps=len(validation_generator))

如果我尝试使用 evaluate_generator 或自定义代码计算准确度,我得到的准确度与我使用 fit_generator 得到的准确度不同。更具体地说:

y_true = validation_generator.classes
y_pred_test = model.predict_generator(validation_generator,verbose=1,steps=len(validation_generator))
predicted_class_indices=np.argmax(y_pred_test,axis=1)
custom_accuracy = accuracy_score(y_true,predicted_class_indices)

model.evaluate_generator(validation_generator,steps = len(validation_generator),verbose=1)

精度变量是不同的值。为什么会这样?

【问题讨论】:

【参考方案1】:

generator.classes 不会按照与生成器预测相同的顺序为您提供标签,因此基于此计算的任何指标都将不正确。

evaluate_generator计算的值是正确的。

使用生成器或序列进行正确评估的唯一方法是迭代生成器中的所有批次,逐批次计算度量标准(每个批次都有输入和标签),然后聚合结果。

【讨论】:

以上是关于为啥在 Keras 中 fit_generator 的准确度、evaluate_generator 的准确度和自定义准确度不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 fit_generator 的准确性与 Keras 中的 evaluate_generator 的准确性不同?

keras中fit_generator()的优势

Keras:网络不使用 fit_generator() 进行训练

如何在Keras中使用fit_generator()来加权? [关闭]

on_epoch_end() 未在 keras fit_generator() 中调用

keras:为 fit_generator 使用 ImageDataGenerator 和 KFold 的问题