我在训练和验证集上使用了ImageDataGenerator(validation_split).flow_from_directory(subset),因此训练和验证数据分别有自己的生成器。
在训练数据后,我在验证生成器上运行model.evaluate(),得到了大约75%的准确率。然而,当我在同一个验证生成器上运行model.predict()时,准确率下降到了1%。
该模型是一个多类别CNN,使用分类交叉熵损失和准确率指标编译,默认应该使用分类准确率。# 编辑:无论如何都改成了分类准确率。
# Compile
learning_rate = tf.keras.optimizers.schedules.PolynomialDecay(initial_learning_rate=initial_lr,
decay_steps=steps,
end_learning_rate=end_lr)
model.compile(optimizer=tf.keras.optimizers.RMSprop(learning_rate),
loss='categorical_crossentropy',
metrics=['categorical_accuracy'])
# Validation set evaluation
val_loss, val_accuracy = model.evaluate(val_generator,
steps=int(val_size/bs)+1)
print('Accuracy: {}'.format(val_accuracy))
# Validation set predict
y_val = val_generator.classes
pred = model.predict(val_generator,
verbose=1
steps=int(val_size/bs)+1)
accuracy_TTA = np.mean(np.equal(y_val, np.argmax(pred, axis=-1)))
print('Accuracy: {}'.format(accuracy_TTA))
回答:
通过创建具有相同种子的独立ImageDataGenerator()实例,似乎解决了model.evaluate和model.predict的准确率差异问题。
此外,有时在训练过程中遇到KeyInterrupts或加载检查点时,应该重新初始化生成器实例,因为可能会出现这个问题。